我有这个数据框:
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添加到我的DataFrame中。让我更改我的构造函数调用
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的任何建议?
您需要做两件事,确保date列是日期(而不是字符串),并将索引设置为这些日期。 您可以使用to_datetime以下命令一次性完成此操作:
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按预期方式致电:
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