настроить функцию агрегирования временных рядов - PullRequest
0 голосов
/ 13 февраля 2019

скажем, у меня есть следующие данные временного ряда:

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 голосов
/ 13 февраля 2019

Вы можете сделать:

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
0 голосов
/ 13 февраля 2019

Это зависит от того, что нужно.

При необходимости только вывод комбинированных обеих функций:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...