汇总时间序列的自定义函数

时间:2019-02-13 13:47:25

标签: python pandas dataframe pandas-groupby

说我有以下时间序列数据:

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

enter image description here

然后每周进行一次重采样,聚合现在同时计数零和非零元素:

weekly = df.resample('W').agg({
    'nonzero': np.count_nonzero, 
    'zero': lambda x: np.count_nonzero(x==0)})
weekly

enter image description here

我实际上想做的是获取聚合的结果,并对它做一些事情(例如,应用一个函数),说2 * number of non-zero + 3 * number of zeros,我该怎么做?我必须在一个单独的步骤上这样做吗?

2 个答案:

答案 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

如果需要zerononzero列也是可能的重复功能:

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