Pandas的滚动平均值,具有固定的时间窗口(而不是固定的nb。观察值)

时间:2016-01-24 22:43:21

标签: python pandas indexing

我有一个包含两列和三级索引结构的数据框。列是价格和交易量,指数是交易者 - 股票日。

我想在我的数据中计算每个交易者 - 股票组合在过去50天内的价格和成交量的滚动均值。

这是我到目前为止所提出的。

  

test = test.set_index(['date','trader','stock'])

     

测试= test.unstack()。拆散()

     

测试= test.resample( “1D”)

     

测试= test.fillna(0)

     

test [[col +'_ norm'for col in test.columns]] = test.apply(lambda x:   pd.rolling_mean(X,50,50))

     

test.stack()。栈()。reset_index()。set_index([ '交易',   '库存', '日期'])。sort_index()。头()

是的,我将数据集取消堆叠两次以便我只剩下时间轴,并且我可以计算我的变量的50天滚动平均值,因为50次观察将对应于50天(在重新采样数据之后)。 / p>

问题在于我不知道如何为滚动平均变量创建正确的名称

  

test [[col +'_ norm'for col in test.columns]]

TypeError:只能将元组(不是“str”)连接到元组

这里有什么问题吗?我的算法实际上是否正确以获得这些滚动手段? 非常感谢!

1 个答案:

答案 0 :(得分:1)

pd.rolling_mean(带有已修改的列名)的结果可以与原始DataFrame连接:

means = pd.rolling_mean(test, 50, 50)
means.columns = [('{}_norm'.format(col[0]),)+col[1:] for col in means.columns]
test = pd.concat([test, means], axis=1)
import numpy as np
import pandas as pd

N = 10
test = pd.DataFrame(np.random.randint(4, size=(N, 3)),
                    columns=['trader', 'stock', 'foo'],
                    index=pd.date_range('2000-1-1', periods=N))
test.index.names = ['date']
test = test.set_index(['trader', 'stock'], append=True)

test = test.unstack().unstack()

test = test.resample("1D")

test = test.fillna(0)

means = pd.rolling_mean(test, 50, 50)
means.columns = [('{}_norm'.format(col[0]),)+col[1:] for col in means.columns]
test = pd.concat([test, means], axis=1)

test = test.stack().stack()
test = test.reorder_levels(['trader', 'stock', 'date'])
test = test.sort_index()
print(test.head())

产量

                         foo  foo_norm
trader stock date                     
0      0     2000-01-01    0       NaN
             2000-01-02    0       NaN
             2000-01-03    0       NaN
             2000-01-04    0       NaN
             2000-01-05    0       NaN
...