将来、在庫がある日からどの日に変更されるかを調べようとしています。唯一の問題は、これを1000行のデータで実行するのに約1分かかり、何百万行もあることです。私は「遅れ」がラインによって引き起こされると思う:パンダのデータフレームの列の値を変更する方法を最適化する方法
stocks[0][i][string][line[index]] = adjPctChange(line[adjClose],line[num])
私は500銘柄の全体の3Dデータフレームは、この行がヒットか何かするたびにコピーされているかもしれないと考えていますが、ちょうどI確かなことを知らない、あるいはそれをより速くする方法を知っている。また、この警告を投げています:
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
は、ここに私のコードです:
daysForeward = 2
for days in range(1,daysForeward+1):
string = 'closeShift'+str(days)
stocks[0][i][string] = stocks[0][i]['adjClose'].shift(days-(days*2))
for line in stocks[0][i].itertuples():
num = 6 #first closeShift columnb
for days in range(1,daysForeward+1):
string = 'closeShift'+str(days)
stocks[0][i][string][line[index]] = adjPctChange(line[adjClose],line[num])
num+=1
ここでのデータは、前との変化率を適用した後です:
date open close adjClose closeShift1 closeShift2
0 19980102 20.3835 20.4417 NaN NaN 0.984507
1 19980105 20.5097 20.5679 NaN 0.984507 1.034904
2 19980106 20.1408 20.0826 0.984507 1.034904 0.994047
3 19980107 20.1408 20.9950 1.034904 0.994047 0.982926
4 19980108 21.1115 20.0244 0.994047 0.982926 0.989441
date open close adjClose closeShift1 closeShift2
0 19980102 20.3835 20.4417 NaN NaN NaN
1 19980105 20.5097 20.5679 NaN NaN NaN
2 19980106 20.1408 20.0826 0.984507 4.869735 0.959720
3 19980107 20.1408 20.9950 1.034904 -3.947904 -5.022423
4 19980108 21.1115 20.0244 0.994047 -1.118683 -0.463311
いくつかの説明は:
[0]
のstocks[0][i]
は、3dデータフレームの適切なレベルに到達するだけです。[i]
は、より高いforループで繰り返されている株の株価です。
adjClose
の列は、close
の代わりにclose
の変更版です。
adjPctChange()
は、100~50が50~100と同じ結果になるように等式を切り替えるカスタムパーセント変更関数です。結果は平均化され、上方向にスキューしません。
def adjPctChange(startPoint, currentPoint):
if startPoint < currentPoint:
x = abs(((float(startPoint)-currentPoint)/float(currentPoint))*100.0)
else:
x = ((float(currentPoint)-startPoint)/float(startPoint))*100.0
return x
お手伝いいただける方に感謝します。