![](/img/trans.png)
[英]How to using pandas rolling.apply with function for calculate multi columns?
[英]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.