gpt4 book ai didi

python - 如何优化更改 Pandas Data Frame 列中的值

转载 作者:太空宇宙 更新时间:2023-11-04 03:10:42 25 4
gpt4 key购买 nike

我试图找出一只股票从给定的一天到 future n 天的变化量。唯一的问题是在 1000 行数据上运行它大约需要一分钟,而我有数百万行。我认为“滞后”是由这条线引起的:

stocks[0][i][string][line[index]] = adjPctChange(line[adjClose],line[num])

我在想,每次点击这条线或其他东西时,可能都会复制 500 只股票的整个 3d 数据框,但我不确定,或者不知道如何让它更快。此外,它还会发出此警告:

SettingWithCopyWarning:
试图在 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

一些解释:

stocks[0][i] 中的 [0] 只是为了在 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

关于python - 如何优化更改 Pandas Data Frame 列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38130221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com