Панды - Resample / GroupBy DateTime Index и выполнять вычисления - PullRequest
0 голосов
/ 09 мая 2018

Я постараюсь объяснить, с чем мне нужна помощь. У меня есть следующий df (тысячи, если не миллионы строк) с индексом datetime, как в примере ниже:

INDEX                   COL A       COL B
2018-05-07 21:53:13.731 0.365127    9391.800000
2018-05-07 21:53:16.201 0.666127    9391.800000
2018-05-07 21:53:18.038 0.143104    9391.800000
2018-05-07 21:53:18.243 0.025643    9391.800000
2018-05-07 21:53:18.265 0.640484    9391.800000
2018-05-07 21:53:18.906 -0.100000   9391.793421
2018-05-07 21:53:19.829 0.559516    9391.800000
2018-05-07 21:53:19.846 0.100000    9391.800000
2018-05-07 21:53:19.870 0.006560    9391.800000
2018-05-07 21:53:20.734 0.666076    9391.800000
2018-05-07 21:53:20.775 0.666076    9391.800000
2018-05-07 21:53:28.607 0.100000    9391.800000
2018-05-07 21:53:28.610 0.041991    9391.800000
2018-05-07 21:53:29.283 -0.053518   9391.793421
2018-05-07 21:53:47.322 -0.046302   9391.793421
2018-05-07 21:53:49.182 0.100000    9391.800000

Я хотел бы сгруппировать строки с 5-секундными интервалами и выполнять (иногда сложные) вычисления для каждого 5-секундного интервала / подмножества.

Скажем, например, я хочу вычислить процент положительных и отрицательных значений в столбце А в каждом 5-секундном блоке.

2018-05-07 21:53:10 до 2018-05-07 21:53:15 содержит только одну строку, а столбец A является положительным, поэтому я бы создал новый столбец C с 100%.

Точно так же от 2018-05-07 21:53:15 до 2018-05-07 21:53:20 имеет 8 строк в столбце A, 7 из которых положительные, а 1 из которых отрицательная. Таким образом, столбец C будет 87.5%.

Я бы опубликовал пример кода, но я действительно не уверен, что лучший способ сделать это. Пример вывода (новый df) может быть примерно таким, как показано ниже, причем COL D - это просто минимальное число в COL B для этой 5-секундной группировки:

INDEX               COL C     COL D (MIN)
2018-05-07 21:53:10 100%     9391.800000
2018-05-07 21:53:15 12.5%    9391.793421
2018-05-07 21:53:20 100%     9391.800000
2018-05-07 21:53:25 66.7%    9391.793421
2018-05-07 21:53:30 nan      nan
2018-05-07 21:53:35 nan      nan
2018-05-07 21:53:40 nan      nan
2018-05-07 21:53:45 100%     9391.793421

Пожалуйста, имейте в виду, что я хочу сделать много разных вычислений для каждой группы. Так что использование встроенных .sum(), .mean(), .agg() и т. Д. Будет недостаточно для более сложных вычислений.

Ценю любую помощь и с удовольствием уточню вопрос, если это необходимо.

1 Ответ

0 голосов
/ 09 мая 2018

Я считаю, что для процента положительных значений нужно среднее значение >0:

df = df.resample('5S').agg({'COL A': lambda x: (x > 0).mean() * 100, 'COL B': 'min'})
print (df)
                          COL A        COL B
INDEX                                       
2018-05-07 21:53:10  100.000000  9391.800000
2018-05-07 21:53:15   87.500000  9391.793421
2018-05-07 21:53:20  100.000000  9391.800000
2018-05-07 21:53:25   66.666667  9391.793421
2018-05-07 21:53:30         NaN          NaN
2018-05-07 21:53:35         NaN          NaN
2018-05-07 21:53:40         NaN          NaN
2018-05-07 21:53:45   50.000000  9391.793421

и для процента отрицательных значений нужно среднее значение <0:

df = df.resample('5S').agg({'COL A': lambda x: (x < 0).mean() * 100, 'COL B': 'min'})
print (df)
                         COL A        COL B
INDEX                                      
2018-05-07 21:53:10   0.000000  9391.800000
2018-05-07 21:53:15  12.500000  9391.793421
2018-05-07 21:53:20   0.000000  9391.800000
2018-05-07 21:53:25  33.333333  9391.793421
2018-05-07 21:53:30        NaN          NaN
2018-05-07 21:53:35        NaN          NaN
2018-05-07 21:53:40        NaN          NaN
2018-05-07 21:53:45  50.000000  9391.793421

Как заметил @Alexander 0 не является ни положительным, ни отрицательным. Так что лучше всего удалить его до подсчета:

df = df.resample('5S').agg({'COL A': lambda x: (x[x.ne(0)] > 0).mean() * 100, 'COL B': 'min'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...