说我有以下时间序列数据:
import pandas as pd
import numpy as np
x = pd.date_range('2015-07-01', periods=20, freq='D')
y = [0, 3, 1, 0, 3, 3, 3, 3, 1, 3, 1, 2, 0, 3, 2, 0, 0, 0, 2, 1]
df = pd.DataFrame(y, index=x, columns=['value'])
df
然后每周进行一次重采样,聚合现在同时计数零和非零元素:
weekly = df.resample('W').agg({
'nonzero': np.count_nonzero,
'zero': lambda x: np.count_nonzero(x==0)})
weekly
我实际上想做的是获取聚合的结果,并对它做一些事情(例如,应用一个函数),说2 * number of non-zero + 3 * number of zeros
,我该怎么做?我必须在一个单独的步骤上这样做吗?
答案 0 :(得分:1)
这取决于需要。
如果仅需要输出两个功能的组合:
weekly = df.resample('W').agg({
'custom': lambda x: 3 * np.count_nonzero(x==0) + 2 * np.count_nonzero(x)})
print (weekly)
custom
value
2015-07-05 12
2015-07-12 14
2015-07-19 18
2015-07-26 2
如果需要zero
,nonzero
列也是可能的重复功能:
weekly = df.resample('W').agg({
'nonzero': np.count_nonzero,
'zero': lambda x: np.count_nonzero(x==0),
'custom': lambda x: 3 * np.count_nonzero(x==0) + 2 * np.count_nonzero(x)})
print (weekly)
nonzero zero custom
value value value
2015-07-05 3 2 12
2015-07-12 7 0 14
2015-07-19 3 4 18
2015-07-26 1 0 2
但是为了获得更好的性能,请仅在resample
+ sum
之后使用人工运算:
weekly[('custom1', 'value')] = 2 * weekly[('nonzero', 'value')] + 3 * weekly[('zero', 'value')]
print (weekly)
nonzero zero custom custom1
value value value value
2015-07-05 3 2 12 12
2015-07-12 7 0 14 14
2015-07-19 3 4 18 18
2015-07-26 1 0 2 2
答案 1 :(得分:1)
您可以这样做:
weekly['custom'] = 2 * weekly['nonzero'] + 3 * weekly['zero']
print(weekly)
输出
zero nonzero custom
value value
2015-07-05 2 3 12
2015-07-12 0 7 14
2015-07-19 4 3 18
2015-07-26 0 1 2