以下のような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))
何故「KeyError: 'currentpricetime'」が出ているのか確かめましょう。
エラーの出ている箇所について、1つ前にもらった回答と、現在のコードを見比べてみましょう。
コードを書き進め、その上での疑問点に質問を変更しました。
改めて、ご意見をお願いします。
「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に置き換えたい
となっていることがよく分かりません。
timedeltaを10秒と勝手に読み替えていました。すみません。
「買った10秒後に売りのサインを出したい」という意味になります。
ただ、質問に回答していて思ったのですが、10秒後にサインを出すという意味では、10秒以降の一番早いレコードで1を返す方が正しい表現でした。修正させてください。
「later_signalが2の時だけsignalを1に置き換える(それ以外の場合はsignalを書き換えない)applyの部分を書くことができませんでした」
それ以前にlater_signalが期待通りに作れていないように思います。
toast-uz様
ネット上にasofの詳しい説明がなく困っています。もし記載方法をご存知でしたらご教示ください。
jeanbiego様
考え直したのですが、10秒後にサインを出すということは、10秒手前の状態で新たに売りを出すという意味ですので、元の状態に戻しました。
later_signalが期待通りに作れていない、という認識でよろしければ、質問文を修正しましょう。質問文だとlater_signalありきで、その後のapplyだけの質問に聞こえます。
ところで、signalが2になるのは、同symbolで必ず最初のレコードだけなのでしょうか。それとも、例がたまたまそうなってるだけですか?
例の「ここの0を1に置き換えたい」の symbol 2160 の方は、5行下の 00:00:09.415579 が正しくないですか?
bsdfan様
確かに、単純な見落としです。修正します。
回答1件
あなたの回答
tips
プレビュー