質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

244閲覧

pandas数秒後の値の置き換え

taro_yamada

総合スコア55

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2020/10/27 14:52

編集2020/10/28 23:19

以下のようなpandasのデータに対して、以下のような処理をしたいと考えています。

<書きたいコード>
signalが2のレコードの同一symbolのtimedelta(10)秒経過前の一番最後のレコードのsignalを1に置き換える。

csv

1 currentpricetime symbol signal 22020-10-23 00:00:01.280687+00:00 7779 2 32020-10-23 00:00:01.394596+00:00 7353 0 42020-10-23 00:00:01.404854+00:00 7779 0 52020-10-23 00:00:01.522376+00:00 1431 0 62020-10-23 00:00:01.532667+00:00 7353 0 72020-10-23 00:00:01.550980+00:00 4436 0 82020-10-23 00:00:01.749720+00:00 7779 0 92020-10-23 00:00:01.760003+00:00 3562 0 102020-10-23 00:00:01.947997+00:00 4393 0 112020-10-23 00:00:01.981073+00:00 2160 2 122020-10-23 00:00:01.991351+00:00 7779 0 132020-10-23 00:00:02.001693+00:00 3562 0 142020-10-23 00:00:02.011933+00:00 9467 0 152020-10-23 00:00:02.022399+00:00 3922 0 162020-10-23 00:00:02.032578+00:00 4436 0 172020-10-23 00:00:09.293038+00:00 4393 0 182020-10-23 00:00:09.299666+00:00 2160 0←ここの0を1に置き換えたい 192020-10-23 00:00:09.299666+00:00 1431 0 202020-10-23 00:00:09.315364+00:00 7779 0←ここの0を1に置き換えたい  212020-10-23 00:00:09.331052+00:00 9467 0 222020-10-23 00:00:09.331052+00:00 3663 0 232020-10-23 00:00:09.415579+00:00 2160 0  242020-10-23 00:00:09.415579+00:00 9467 0 252020-10-23 00:00:09.431199+00:00 4051 0 262020-10-23 00:00:09.493694+00:00 4393 0 272020-10-23 00:00:09.515837+00:00 3922 0 282020-10-23 00:00:15.569884+00:00 3663 0 292020-10-23 00:00:15.580064+00:00 4436 0 302020-10-23 00:00:15.590341+00:00 3359 0 312020-10-23 00:00:15.673560+00:00 4393 0 322020-10-23 00:00:15.681706+00:00 2160 0 332020-10-23 00:00:15.693816+00:00 7353 0 342020-10-23 00:00:15.704075+00:00 7779 0 352020-10-23 00:00:15.714524+00:00 9467 0 362020-10-23 00:00:15.722784+00:00 4051 0 372020-10-23 00:00:15.735338+00:00 3922 0 382020-10-23 00:00:15.745504+00:00 3663 0 392020-10-23 00:00:15.755818+00:00 2484 0 402020-10-23 00:00:15.766206+00:00 4393 0 41以下、続く

<試したこと>
10/28修正
以下のコードを書いてみましたが、later_signalが2の時だけsignalを1に置き換える(それ以外の場合はsignalを書き換えない)applyの部分を書くことができませんでした。
ここの記載方法をご教示いただけないでしょうか?
もし、そもそもの記載方法に誤りがあればご指摘もお願いします。

python

1 # 指定秒後のシグナルを置き換え 2for symbol, df_s in df.groupby('symbol'): 3 df_s = df_s.sort_values(['currentpricetime']) 4 later_signal=df_s.set_index('currentpricetime')['signal'].asof(df_s['currentpricetime'] - pd.Timedelta(timedelta)).array 5 df.loc[df_s.index, 'later_signal'] = later_signal 6 df['signal'] = df['later_signal'].apply((lambda x: 1 if x == 2 else None))

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/10/27 22:27

何故「KeyError: 'currentpricetime'」が出ているのか確かめましょう。
toast-uz

2020/10/27 23:17

エラーの出ている箇所について、1つ前にもらった回答と、現在のコードを見比べてみましょう。
taro_yamada

2020/10/28 15:01

コードを書き進め、その上での疑問点に質問を変更しました。 改めて、ご意見をお願いします。
jeanbiego

2020/10/28 22:24

「timedelta秒以内」とは具体的にどういう意味でしょうか。 たとえば 2020-10-23 00:00:01.280687+00:00 7779 2 に対応する「同一symbolのtimedelta秒以内のうち一番遅いレコード」が 2020-10-23 00:00:15.704075+00:00 7779 0 でなくて、 2020-10-23 00:00:09.315364+00:00 7779 0 ←ここの0を1に置き換えたい となっていることがよく分かりません。
taro_yamada

2020/10/28 23:00

timedeltaを10秒と勝手に読み替えていました。すみません。 「買った10秒後に売りのサインを出したい」という意味になります。 ただ、質問に回答していて思ったのですが、10秒後にサインを出すという意味では、10秒以降の一番早いレコードで1を返す方が正しい表現でした。修正させてください。
toast-uz

2020/10/28 23:09

「later_signalが2の時だけsignalを1に置き換える(それ以外の場合はsignalを書き換えない)applyの部分を書くことができませんでした」 それ以前にlater_signalが期待通りに作れていないように思います。
taro_yamada

2020/10/28 23:20

toast-uz様 ネット上にasofの詳しい説明がなく困っています。もし記載方法をご存知でしたらご教示ください。
taro_yamada

2020/10/28 23:21

jeanbiego様 考え直したのですが、10秒後にサインを出すということは、10秒手前の状態で新たに売りを出すという意味ですので、元の状態に戻しました。
toast-uz

2020/10/28 23:37

later_signalが期待通りに作れていない、という認識でよろしければ、質問文を修正しましょう。質問文だとlater_signalありきで、その後のapplyだけの質問に聞こえます。
jeanbiego

2020/10/29 01:05

ところで、signalが2になるのは、同symbolで必ず最初のレコードだけなのでしょうか。それとも、例がたまたまそうなってるだけですか?
bsdfan

2020/10/29 02:59

例の「ここの0を1に置き換えたい」の symbol 2160 の方は、5行下の 00:00:09.415579 が正しくないですか?
taro_yamada

2020/10/29 10:25

bsdfan様 確かに、単純な見落としです。修正します。
guest

回答1

0

ベストアンサー

asofの使い方が難しいとのことですが、df.asof(x)は、

  1. dfからインデックスがxと等しい行をとってくる
  2. インデックスがxと等しいものがなければ、インデックスがxより小さい中で最大の行をとってくる

という動作です(ただしNaNがない場合)。Seriesやxが配列の場合も同様に考えればいいです。
(正確な動作についてはリファレンスを確認してください)

今のアプローチは、timedelta時間前が2ならば1にするというやり方のようですが、
タイムスタンプの並び方次第では希望する形にはなりません。

素直に2のtimedelta時間後を1にする方法を取った方が良いです。

asofで2のtimedelta時間後のインデックスをとってきて、そこを1に変更するようにします。
そのためには、インデックスが時刻、値が元のデータフレームのインデックスの新しいSeriesを作って、それに対してasofを適用すればいいです。

python

1timedelta = pd.Timedelta('10s') 2for symbol, df_s in df.groupby('symbol'): 3 t = df_s.loc[df['signal'] == 2, 'currentpricetime'] 4 if not t.empty: 5 idx = pd.Series(df_s.index, index=df_s['currentpricetime']).asof(t + timedelta) 6 df.loc[idx, 'signal'] = 1

signalが2の行がない場合はエラーになるので処理をスキップするようにしています。

投稿2020/10/29 10:38

bsdfan

総合スコア4794

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taro_yamada

2020/10/29 14:40

ありがとうございました。 まだまだpandasを始めたばかりで、何するにも全然進めずに困っていました。 少しずつスキルアップしていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問