繁体   English   中英

Python熊猫滚动。将两个时间序列输入应用于函数

[英]Python pandas rolling.apply two time-series input into function

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

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

我认为这应该有效。 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

然后像上面一样使用点积。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM