У меня есть кадр данных Pandas, содержащий метку времени (неравномерно распределенный), порядковый номер, категорию и процентное формирование.Порядковый номер используется только для упорядочения строк, если существует несколько строк с одинаковыми отметкой времени и категорией, и отбрасывается после сортировки.
|----------------------------------------------------------------|
| | seq_no | category | pct_formation |
|----------------------------------------------------------------|
|ts_timestamp | | | |
|----------------------------------------------------------------|
|2018-10-22 10:13:44.043 | 6839262 | in_petr | 37.070000 |
|2018-10-22 10:17:09.527 | 7257908 | in_petr | 36.970000 |
|2018-10-22 10:17:43.977 | 7319000 | in_dsh | 36.950000 |
|2018-10-22 10:17:43.963 | 7318885 | in_dsh | 36.960000 |
|2018-10-22 10:17:09.527 | 7257918 | in_petr | 32.960000 |
|2018-10-22 10:19:44.040 | 7585354 | out_petr | 36.890000 |
|2018-10-22 10:19:44.043 | 7585461 | out_petr | 36.900000 |
|2018-10-22 10:19:37.267 | 7563817 | sync | 33.910000 |
|2018-10-22 10:19:44.057 | 7586045 | sync | 36.960000 |
|2018-10-22 10:19:16.750 | 7516841 | out_petr | 36.880000 |
|2018-10-22 10:20:03.160 | 7637889 | sync | 36.980000 |
|2018-10-22 10:20:32.350 | 7691592 | sync | 37.000000 |
|2018-10-22 10:23:03.150 | 8008804 | sync | 34.580000 |
|2018-10-22 10:22:18.633 | 7907782 | in_dsh | 36.980000 |
|2018-10-22 10:25:39.557 | 8290932 | in_dsh | 36.970000 |
|----------------------------------------------------------------|
Я хочу получать изменения в pct_formation для каждой категории каждые пять секунд с 10:00.: 00 и 11:00:00 каждый день.
До сих пор я пытался:
df.sort_index()[['category', 'pct_formation']] \
.groupby(['category', df.index.date])
.rolling('5s').pct_formation.mean()
Я использую группирование по дате, потому что я подозреваю, что если я использую метку времени, то как группировкарезультаты не будут иметь большого смысла, поскольку временная метка неравномерно распределена и очень детализирована.
Как получить равномерно распределенные 5-секундные окна между 10:00:00 и 11:00:00 (например, 10:00: От 00 до 10:00:05, от 10:00:01 до 10:00:06 и т. Д.).И как мне получить разницу в pct_formation между началом и концом каждого 5-секундного окна?
Если я использую функции, такие как min () и max () после roll (), я получаю некоторые ошибки, такие как:
ValueError: could not convert string to float: 'out_petr'
TypeError: cannot handle this type -> object
Пожалуйста, объясните мне, как поступить, я был бы очень благодарен.TIA.
РЕДАКТИРОВАТЬ: Добавление подробностей на основе отзывов в комментариях.
Я хочу, чтобы скользящее окно, поэтому следующее окно после 10:00:00 до 10:00:05 будет 10:От 00:01 до 10:00:06, затем с 10:00:02 до 10:00:07 и т. Д.
Мне бы хотелось узнать, насколько сильно изменилось значение pct_formation с одного окна надругое, поэтому, если в одном и том же интервале несколько значений, я буду использовать mean()
.
Я думаю, мне придется использовать .resample()
, чтобы получать равномерно распределенные интервалы между 10 и 11 часами каждый день, но ямне очень трудно понять, как это сделать.
Я понял, что могу создавать равномерно распределенные временные окна, такие как:
pd.date_range(start=df.index.min().replace(hour=10, minute=0, second=0, microsecond=0),
end=df.index.max().replace(hour=11, minute=0, second=0, microsecond=0),
freq='5S')
Однако я не знаю, как изменить свой фрейм данных, чтобы он соответствовал этим временамдля каждой категории.