python - 按时间计算 DataFrame 的 EWMA

标签 python pandas

我有这个数据框:

    avg                date    high  low      qty
0 16.92 2013-05-27 00:00:00   19.00 1.22 71151.00
1 14.84 2013-05-30 00:00:00   19.00 1.22 42939.00
2  9.19 2013-06-02 00:00:00   17.20 1.23  5607.00
3 23.63 2013-06-05 00:00:00 5000.00 1.22  5850.00
4 13.82 2013-06-10 00:00:00   19.36 1.22  5644.00
5 17.76 2013-06-15 00:00:00   24.00 2.02 16969.00

每一行都是在指定日期创建的平均、高、低和数量的观察值。

我正在尝试计算跨度为 60 天的指数移动加权平均值:

df["emwa"] = pandas.ewma(df["avg"],span=60,freq="D")

但是我明白了

TypeError: Only valid with DatetimeIndex or PeriodIndex

好的,所以也许我需要在构造 DataFrame 时将 DateTimeIndex 添加到它。让我改变我的构造函数调用

df = pandas.DataFrame(records) #records is just a list of dictionaries

rng = pandas.date_range(firstDate,lastDate, freq='D')
df = pandas.DataFrame(records,index=rng)

但现在我明白了

ValueError: Shape of passed values is (5,), indices imply (5, 1641601)

关于如何计算我的 EMWA 有什么建议吗?

最佳答案

您需要两件事,确保日期列是日期(而不是字符串)并将索引设置为这些日期。
您可以使用 to_datetime 一次性完成此操作:

In [11]: df.index = pd.to_datetime(df.pop('date'))

In [12]: df
Out[12]:
              avg     high   low    qty
date
2013-05-27  16.92    19.00  1.22  71151
2013-05-30  14.84    19.00  1.22  42939
2013-06-02   9.19    17.20  1.23   5607
2013-06-05  23.63  5000.00  1.22   5850
2013-06-10  13.82    19.36  1.22   5644
2013-06-15  17.76    24.00  2.02  16969

然后你可以调用emwa正如预期的那样:

In [13]: pd.ewma(df["avg"], span=60, freq="D")
Out[13]:
date
2013-05-27    16.920000
2013-05-28    16.920000
2013-05-29    16.920000
2013-05-30    15.862667
2013-05-31    15.862667
2013-06-01    15.862667
2013-06-02    13.563899
2013-06-03    13.563899
2013-06-04    13.563899
2013-06-05    16.207625
2013-06-06    16.207625
2013-06-07    16.207625
2013-06-08    16.207625
2013-06-09    16.207625
2013-06-10    15.697743
2013-06-11    15.697743
2013-06-12    15.697743
2013-06-13    15.697743
2013-06-14    15.697743
2013-06-15    16.070721
Freq: D, dtype: float64

如果您将其设置为一列:

In [14]: df['ewma'] = pd.ewma(df["avg"], span=60, freq="D")

In [15]: df
Out[15]:
              avg     high   low    qty       ewma
date
2013-05-27  16.92    19.00  1.22  71151  16.920000
2013-05-30  14.84    19.00  1.22  42939  15.862667
2013-06-02   9.19    17.20  1.23   5607  13.563899
2013-06-05  23.63  5000.00  1.22   5850  16.207625
2013-06-10  13.82    19.36  1.22   5644  15.697743
2013-06-15  17.76    24.00  2.02  16969  16.070721

关于python - 按时间计算 DataFrame 的 EWMA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17181143/

相关文章:

python - 在 Python 中获取匹配字符串的特定模式后出现的数字

python - 如何在 Python3 中使用 pylab 去除 x 轴标签中的困惑/重叠?

python - 根据权重为 networkx 边着色

python - 从缺失值大于 5 的行中删除缺失值,然后打印每列中缺失值的百分比

python - 根据数据框中序数的存在进行迭代和更新

python - 如何解析 df 中的 json 列,我们使用选定的键附加新列

java - Zookeeper集群如何实现2pc?

python - 接收与多个外键关联的 View 中的对象。 Django 、Python

python - Pandas 查找最接近配置文件的行

python - 按索引列的条件过滤 pandas Dataframe 中的值