Pyrhonループ処理の高速化(上下ラインを超えることの検出)

実現したいこと

データフレームに、Value、Low, Highがあり、
(Value0.9 < Low)か(Value1.1 > High)となる最初の値(の差分)をResultとして取得したいです
同じ行での比較ではなく、Valueのあるindex以降のLow,Highで範囲を超えるかの検出になります

発生している問題・分からないこと

ひとまず下記のコードで動作しました(1万件で1分くらい)
数万~数十万件は想定しているので、10分の1以下が理想です

もっと高速に処理をする方法についてアドバイスいただけないでしょうか

該当のソースコード

Python3

1low = df["Low"] 2high = df["High"] 3value = df["Value"] 4df["index"] = list(range(len(df))) #query用に追加 5 6res = np.zeros(len(value)) #結果の格納 7 8for i in list(range(len(res))): 9 Value = value.iloc[i] 10 LowLine = Value*(1-0.1) 11 HighLine = Value*(1+0.1) 12 13 DfLow = df.query('index >=@i & Low < @LowLine') 14 DfHigh = df.query('index >=@i & High > @HighLine') 15 if len(DfLow)==0 or len(DfHigh)==0:continue 16 17 LowIndex = DfLow.iloc[0]["index"] 18 HighIndex = DfHigh.iloc[0]["index"] 19 if LowIndex <= HighIndex: #LowHigh同時ならLow優先 20 res[i] = LowLine - Value 21 else: 22 res[i] = HighLine - Value 23 24df["Result"] = res

試したこと・調べたこと

上記の詳細・結果

2重forループから内側をqueryにすることで、多少速度アップしましたが
各index以降という条件があるため、外側のループが外せない状況です

高速化のためのアドバイスがあればお願いします

補足

特になし

コメントを投稿

0 コメント