Скользящая разница значений данных в пандах для 5-секундных интервалов на группу - PullRequest
0 голосов
/ 25 октября 2018

У меня есть кадр данных 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')

Однако я не знаю, как изменить свой фрейм данных, чтобы он соответствовал этим временамдля каждой категории.

1 Ответ

0 голосов
/ 25 октября 2018

IIUC, вы можете использовать resample() и rolling():

df['ts_timestamp'] = pd.to_datetime(df['ts_timestamp'], format='%Y-%m-%d %H:%M:%S')

resampled = df.groupby('category').apply(lambda x: x.drop_duplicates('ts_timestamp').set_index('ts_timestamp').resample('1S').ffill())

resampled['pct_formation'].rolling(5).apply(lambda x: x[0]-x[-1], raw=True)

Выходы (короткий образец):

category  ts_timestamp       
in_dsh    2018-10-22 10:17:43    NaN
          2018-10-22 10:17:44    NaN
          2018-10-22 10:17:45    NaN
          2018-10-22 10:17:46    NaN
          2018-10-22 10:17:47    NaN
          2018-10-22 10:17:48    0.0
          2018-10-22 10:17:49    0.0
          2018-10-22 10:17:50    0.0
          2018-10-22 10:17:51    0.0
          2018-10-22 10:17:52    0.0
          2018-10-22 10:17:53    0.0
          2018-10-22 10:17:54    0.0
          2018-10-22 10:17:55    0.0
...

В настоящее время я просто используюffill() для заполнения относительно разреженных данных, но вы также можете подумать об интерполяции и т. Д.

...