Python pandas rolling.apply将两个时间序列输入到函数中

时间:2017-09-20 17:43:04

标签: python pandas rolling-sum

我有一个带有两列的DatetimeIndex索引数据框。指数不均衡。

          A        B
Date
2016-01-04  1   20
2016-01-12  2   10
2016-01-21  3   10
2016-01-25  2   20
2016-02-08  2   30
2016-02-15  1   20
2016-02-21  3   20
2016-02-25  2   20

我想在一个长度为20天的滚动窗口上计算时间序列A和B的点积。

它应该返回:

            dot
Date
2016-01-04  Nan   
2016-01-12  Nan   
2016-01-21  Nan   
2016-01-25  110    
2016-02-08  130 
2016-02-15  80    
2016-02-21  140 
2016-02-25  180 

这是如何获得的:

110 = 2 * 10 + 3 * 10 + 2 * 20(2016-01-06至2016-01-25期间获得的产品)

130 = 3 * 10 + 2 * 20 + 2 * 30(2016-01-20至2016-02-08期间获得的产品)

80 = 1 * 20 + 2 * 30(2016-01-27至2016-02-15期间获得的产品)

140 = 3 * 20 + 1 * 20 + 2 * 30(2016-02-02至2016-02-21期间获得的产品)

180 = 2 * 20 + 3 * 20 + 1 * 20 + 2 * 30(2016-02-06至2016-02-25期间获得的产品)

点积是一个例子,应该可以推广到任何两个系列并返回一个值的函数。

1 个答案:

答案 0 :(得分:0)

我认为这应该有效。跨行的df.product(),df.rolling(句点).sum()

Dates = pd.to_datetime(['2016-01-04',  
                    '2016-01-12',  
                    '2016-01-21',  
                    '2016-01-25',  
                    '2016-02-08',  
                    '2016-02-15', 
                    '2016-02-21',
                    '2016-02-25',
                    '2016-02-26'
                   ]
                  )

data = {'A': [i*10 for i in range(1,10)], 'B': [i for i in range(1,10)]}
df1 = pd.DataFrame(data = data, index = Dates)
df2 = df1.product(axis =1).rolling(3).sum()
df2.columns = 'Dot'
df2

output


2016-01-04       NaN
2016-01-12       NaN
2016-01-21     140.0
2016-01-25     290.0
2016-02-08     500.0
2016-02-15     770.0
2016-02-21    1100.0
2016-02-25    1490.0
2016-02-26    1940.0
dtype: float64

如果您的数据是每天,并且您希望首先获得20天的数据,请将它们分组20天,然后根据您的需要进行总结或使用最后数据。

Dates1 = pd.date_range(start='2016-03-31', end = '2016-07-31')
data1 = {'A': [np.pi * i * np.random.rand() 
               for i in range(1, len(Dates1) + 1)], 
         'B': [i * np.random.randn() * 10 
               for i in range(1, len(Dates1) + 1)]}
df3 = pd.DataFrame(data = data1, index = Dates1)
df3.groupby(pd.TimeGrouper(freq = '20d')).sum()

                     A             B
2016-03-31   274.224084   660.144639
2016-04-20  1000.456615 -2403.034012
2016-05-10  1872.422495 -1737.571080
2016-05-30  2121.497529  1157.710510
2016-06-19  3084.569208 -1854.258668
2016-07-09  3324.775922 -9743.113805
2016-07-29   505.162678 -1179.730820

然后像我上面那样使用点积。