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

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

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

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

pandas

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

Q&A

解決済

1回答

1117閲覧

10秒後のレコードの情報を読み込む方法について

taro_yamada

総合スコア55

Python

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

pandas

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

0グッド

0クリップ

投稿2020/10/21 15:35

今、10秒後の株価の騰落率を返すプログラムを書いています。
とりあえず、for文を使って上手く動くコードは書けたのですが、実行に時間がかかりすぎるため、pandasの処理でうまく返せないか検討しています。

いいアイデアがある方、ご教示いただけないでしょうか?

python

1 START_TIME = datetime.time(9, 00, 0, 0) 2 END_TIME = datetime.time(15, 00, 0, 0) 3 RESTSTART_TIME = datetime.time(11, 30, 0, 0) 4 RESTEND_TIME = datetime.time(12, 30, 0, 0) 5 6 df = args 7 df = df.reset_index(drop=True) 8 9 for i, row in df.iterrows(): 10 t = pushlist.objects.get(pushlist_id=df.loc[i, 'pushlist_id']) 11 time = df.loc[i, 'currentpricetime'] + datetime.timedelta(hours=9) 12 if time.time() > END_TIME: # 教師信号となる時間が15時を超えていたらelseにとんで0をいれる 13 print("時間外") 14 else: 15 # ここから10秒後の教師信号 16 time2 = time + datetime.timedelta(seconds=10) 17 if RESTSTART_TIME < time2.time() < RESTEND_TIME: 18 t.later10s = 99 # 99は時間外 19 else: 20 time3 = time2 - datetime.timedelta(hours=9) 21 df2 = df[(df.symbolname == df.loc[i, 'symbolname']) & (df.currentpricetime < time3)] # 同じ銘柄かつ教師信号自転 22 df2 = df2.sort_values(['currentpricetime']) 23 df2 = df2.reset_index(drop=True) 24 value = (float(df2['currentprice'][df2.index.max()]) / float(df['currentprice'][i])) - 1 25 t.later10s = value 26 t.save() 27

pandas

1 symbol currentprice currentpricetime later10s 24490 5170 2020-10-21 00:06:04.736356+00:00 0 ← 00:06:14の株価との騰落率5160/5170-1 を返したい 34490 5170 2020-10-21 00:06:06.095071+00:00 0 44490 5170 2020-10-21 00:06:06.271264+00:00 0 54490 5160 2020-10-21 00:06:06.417457+00:00 0 64490 5160 2020-10-21 00:06:06.469697+00:00 0 74490 5160 2020-10-21 00:06:06.500777+00:00 0 84490 5160 2020-10-21 00:06:06.946862+00:00 0 94490 5160 2020-10-21 00:06:07.081324+00:00 0 104490 5160 2020-10-21 00:06:07.912222+00:00 0 114490 5160 2020-10-21 00:06:09.399203+00:00 0 124490 5140 2020-10-21 00:06:10.346132+00:00 0 134490 5140 2020-10-21 00:06:10.440464+00:00 0 144490 5140 2020-10-21 00:06:10.505377+00:00 0 154490 5140 2020-10-21 00:06:10.785968+00:00 0 164490 5140 2020-10-21 00:06:10.982870+00:00 0 174490 5140 2020-10-21 00:06:11.294839+00:00 0 184490 5110 2020-10-21 00:06:11.837236+00:00 0 194490 5110 2020-10-21 00:06:11.852856+00:00 0 204490 5110 2020-10-21 00:06:12.022399+00:00 0 214490 5110 2020-10-21 00:06:12.556094+00:00 0 224490 5110 2020-10-21 00:06:12.805651+00:00 0 234490 5130 2020-10-21 00:06:13.857057+00:00 0 244490 5160 2020-10-21 00:06:13.888533+00:00 0 254490 5160 2020-10-21 00:06:14.065261+00:00 0 264490 5160 2020-10-21 00:06:14.220194+00:00 0 274490 5160 2020-10-21 00:06:14.582616+00:00 0 284490 5160 2020-10-21 00:06:15.189344+00:00 0 294490 5160 2020-10-21 00:06:15.383874+00:00 0 304490 5160 2020-10-21 00:06:17.014968+00:00 0 314490 5140 2020-10-21 00:06:17.678799+00:00 0 324490 5140 2020-10-21 00:06:17.730237+00:00 0 334490 5140 2020-10-21 00:06:17.866179+00:00 0 344490 5120 2020-10-21 00:06:20.887709+00:00 0 354490 5120 2020-10-21 00:06:20.960669+00:00 0 364490 5120 2020-10-21 00:06:21.106985+00:00 0 374490 5120 2020-10-21 00:06:22.163820+00:00 0 384490 5120 2020-10-21 00:06:23.252743+00:00 0 394490 5120 2020-10-21 00:06:23.431432+00:00 0 404490 5120 2020-10-21 00:06:23.600981+00:00 0 414490 5120 2020-10-21 00:06:23.827950+00:00 0 42

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

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

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

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

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

guest

回答1

0

ベストアンサー

多少は早くなると思います。
asofで10秒後(10秒以内の最終)の値をとってきています。

python

1# JSTに変換 2df['currentpricetime'] = df['currentpricetime'].dt.tz_convert('Asia/Tokyo') 3 4# symbolごとにわけて処理 5for symbol, df_s in df.groupby('symbol'): 6 # asof で10秒後(10秒以内の最終)のpriceを取得 7 later10s_price = df_s.set_index('currentpricetime')['currentprice'].asof(df_s['currentpricetime'] + pd.Timedelta('10s')).array 8 df.loc[df_s.index, 'later10s'] = later10s_price / df_s['currentprice'] - 1 9 10# 時間外の処理 11df.loc[df['currentpricetime'].dt.time > END_TIME, 'later10s'] = 0 12 13# 時間外の処理2 14time = (df['currentpricetime'] + pd.Timedelta('10s')).dt.time 15df.loc[(RESTSTART_TIME < time) & (time < RESTEND_TIME), 'later10s'] = 99

投稿2020/10/22 23:56

bsdfan

総合スコア4794

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

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

taro_yamada

2020/10/24 16:03

ご回答ありがとうございます。 コードを書いているのですが、asofがうまく使えずに困っています。 今、以下のエラーが出ていて行き詰まっています。 KeyError: "None of ['currentpricetime'] are in the columns"
taro_yamada

2020/10/24 16:06

エラーが出るのは以下の文のところです。 later10s_price = df_s.set_index('currentpricetime')['currentprice'].asof(df_s['currentpricetime'] + pd.Timedelta('10s')).array
taro_yamada

2020/10/24 23:12

もう少しコードをいじったらうまく動きました。 20時間かかっていたものが1分くらいで終わるようになりました笑 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問