在循环中为pandas数据帧添加滚动平均值需要永远

时间:2017-01-22 00:44:15

标签: python pandas dictionary dataframe large-data

我有一个相当大的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>

非常感谢任何评论/见解!

非常感谢!

1 个答案:

答案 0 :(得分:1)

您尝试在切片上分配恰好是另一个数据帧的视图。之所以发生这种情况,是因为您首先创建了字典。

解决方法:

for k in eodscreen:
    eodscreen[k] = eodscreen[k].assign(MA=df['close'].rolling(window=5).mean())

我建议这样做的原因是您将数据框的副本重新分配给字典键的新列。