我有一个相当大的pandas数据帧字典。键是股票代码,每个数据框有14列,包含股票市场数据。例如:
eodscreen['AAPL']
Out[35]:
date open high low close volume ex-dividend \
date
2010-01-04 2010-01-04 5.82 5.980 5.8000 5.98 685500.0 0.0
2010-01-05 2010-01-05 5.99 6.000 5.8300 5.93 419500.0 0.0
...
...
我正在尝试为每个名为“MA”的股票添加 新 列,其中包含“关闭”列的移动平均线。
这是我的简单循环:
for k in eodscreen:
eodscreen[k]['MA'] = eodscreen[k]['close'].rolling(window=5).mean()
此代码大约需要3分钟才能运行(在几年前的笔记本电脑上,i7,16GB内存......)。
我收到以下警告,也许它解释了部分问题?
> A value is trying to be set on a copy of a slice from a DataFrame. Try
> using .loc[row_indexer,col_indexer] = value instead
我对什么是'大'词典感觉不太好,所以也许这很正常?
字典:1600个密钥,每个密钥包含一个数据帧。
每个数据帧:1个日期列,13个float64列,每行1740行 列。
如果可以预料到这一点,请您提供一些有关如何在程序中加载和访问此类数据的信息?它全部存储在一个~400MB的csv文件中,我在程序开头加载它并组织字典中的所有内容。最好只读取1个股票代码的数据,执行我想要的任何数学运算,重新编写文件等等,或者我在正确的轨道上认为我可以从内存中完成所有操作(更简单)! / p>
非常感谢任何评论/见解!
非常感谢!
答案 0 :(得分:1)
您尝试在切片上分配恰好是另一个数据帧的视图。之所以发生这种情况,是因为您首先创建了字典。
解决方法:
for k in eodscreen:
eodscreen[k] = eodscreen[k].assign(MA=df['close'].rolling(window=5).mean())
我建议这样做的原因是您将数据框的副本重新分配给字典键的新列。