0

我有一个包含两列的 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期间获得的产品)

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

4

1 回答 1

0

我认为这应该有效。df.product() 跨行,df.rolling(period).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

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

于 2017-09-27T23:58:54.170 回答