Как повторно сэмплировать / переиндексировать / сгруппировать временные ряды на основе данных столбца? - PullRequest
2 голосов
/ 07 октября 2019

ТАК У меня есть кадр данных pandas, который содержит 2 значения водопользования с разрешением 1 секунда. Значения являются «hotIn» и «hotOut». HotIn может записывать до десятой доли галлона с разрешением в одну секунду, в то время как hotOut записывает целые импульсы, представляющие галлон, то есть, когда происходит импульс, один галлон прошел через измеритель. Импульсы происходят примерно каждые 14-15 секунд.

Данные выглядят примерно так:

Index                       hotIn(gpm)      hotOut(pulse=1gal) 
2019-03-23T00:00:00         4               0 
2019-03-23T00:00:01         5               0 
2019-03-23T00:00:02         4               0 
2019-03-23T00:00:03         4               0 
2019-03-23T00:00:04         3               0 
2019-03-23T00:00:05         4               1 
2019-03-23T00:00:06         4               0 
2019-03-23T00:00:07         5               0 
2019-03-23T00:00:08         3               0 
2019-03-23T00:00:09         3               0 
2019-03-23T00:00:10         4               0 
2019-03-23T00:00:11         4               0 
2019-03-23T00:00:12         5               0 
2019-03-23T00:00:13         5               1

Я пытаюсь сделать повторную выборку или переиндексировать фрейм данных на основевозникновение импульсов и суммирование hotIn между новыми отметками времени.

Например, суммируйте hotIn между 00:00:00 - 00:00:05 и 00:00:06 - 00:00:13.

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

Index                       hotIn sum(gpm)      hotOut(pulse=1gal) 
2019-03-23T00:00:05         24                 1 
2019-03-23T00:00:13         32                 1 

Я исследовал использование двухэтапного цикла for-elif, который просто проверяет, работает ли hotOut == 1, но работает ли он мучительно медленнона больших наборах данных. Я уверен, что временные метки Pandas будут лучше, если это возможно. Я также не могу просто пересчитать на заданной частоте, потому что интервал между импульсами периодически меняется. Основной проблемой является период временных меток между изменениями импульсов, поэтому общее правило повторной выборки не будет работать. Я также столкнулся с проблемами при сопоставлении длин фрейма данных при извлечении временных отметок, связанных с импульсами, и применении их к основному в качестве нового индекса.

Ответы [ 2 ]

1 голос
/ 07 октября 2019

IIUC, вы можете сделать:

s = df['hotOut(pulse=1gal)'].shift().ne(0).cumsum()
(df.groupby(s)
   .agg({'Index':'last', 'hotIn(gpm)':'sum'})
   .reset_index(drop=True)
)

Вывод:

                 Index  hotIn(gpm)
0  2019-03-23T00:00:05          24
1  2019-03-23T00:00:13          33
0 голосов
/ 07 октября 2019

Вы не хотите группировать по индексу. Вы хотите группировать всякий раз, когда 'hotOut(pulse=1gal)' изменяется.

s = df['hotOut(pulse=1gal)'].cumsum().shift().bfill()

(df.reset_index()
   .groupby(s, as_index=False)
   .agg({'Index': 'last', 'hotIn(gpm)': 'sum', 'hotOut(pulse=1gal)': 'last'})
   .set_index('Index'))

                     hotIn(gpm)  hotOut(pulse=1gal)
Index                                              
2019-03-23T00:00:05          24                   1
2019-03-23T00:00:13          33                   1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...