我正在尝试查找从给定的一天到将来的n天里,股票的变化量。唯一的问题是,在1000行数据上运行此程序大约需要一分钟,而我有数百万行。我认为“滞后”是由以下原因引起的:
stocks[0][i][string][line[index]] = adjPctChange(line[adjClose],line[num])
我在想,每当碰到这条线时,可能会复制500只股票的整个3D数据框,但是我只是不确定,或者不知道如何使其更快。此外,它还会引发以下警告:
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
感谢任何能提供帮助的人!
您不应该在DataFrame上循环;只需使用数组函数即可。
前:
In [30]: df
Out[30]:
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
数组符号:
daysForeward = 2
for day in range(1, daysForeward+1):
column = 'closeShift' + str(day)
df[column] = (df[column] - df.adjClose) / np.maximum(df[column], df.adjClose) * 100.0
后:
In [33]: df
Out[33]:
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.869727 0.959713
3 19980107 20.1408 20.9950 1.034904 -3.947902 -5.022495
4 19980108 21.1115 20.0244 0.994047 -1.118760 -0.463358
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句