2017-09-20 207 views
0

我有一个带有两列的DatetimeIndex索引数据框。指数不均衡。Python pandas rolling.apply两个时间序列输入到函数中

  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年1月6日在期间获得的产物到2016年1月25日包括)

130 = 3×10 + 2×20 + 2 * 30(在周期中获得的产物从2016年1月20日至2016年2月8日)

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

140 = 3 * 20 + 1 * 20 + 2 * 30(在周期中获得从2016年2月2日至2016年2月21日的产品)

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

dot产品是一个示例,它应该可以概括为任何采用两个系列并返回值的函数。

+0

目前尚不清楚你在询问什么。你能否明确提出你的问题? – FabienP

+0

当然。这里是。我提出了这个问题 – Laura

回答

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 

然后使用像我这样做的点产品。

相关问题