我有一个带有两列的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期间获得的产品)
点积是一个例子,应该可以推广到任何两个系列并返回一个值的函数。
答案 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
然后像我上面那样使用点积。