python: группировать данные в пределах временных рядов - PullRequest
0 голосов
/ 21 сентября 2018

Учитывая следующую базу данных:

import pandas as pd
from time import strptime

data = {'num': ['B', 'A', 'B', 'A', 'B', 'A', 'B', 'C', 'B', 'A', 'C', 'B'],
        'dir': ['IN', 'IN', 'PASS', 'PASS', 'PASS', 'PASS', 'OUT', 'IN', 'IN', 'OUT', 'OUT', 'OUT'],
        'empty': [True, False, True, False, True, False, True, False, False, False, False, False],
        'station': [100, 1, 20, 20, 14, 14, 5, 65, 89, 8, 66, 11],
        'time': [strptime('20180115 00:25', '%Y%m%d %H:%M'),
                 strptime('20180115 00:30', '%Y%m%d %H:%M'),
                 strptime('20180115 01:10', '%Y%m%d %H:%M'),
                 strptime('20180115 01:10', '%Y%m%d %H:%M'),
                 strptime('20180115 02:10', '%Y%m%d %H:%M'),
                 strptime('20180115 02:10', '%Y%m%d %H:%M'),
                 strptime('20180115 03:33', '%Y%m%d %H:%M'),
                 strptime('20180115 03:33', '%Y%m%d %H:%M'),
                 strptime('20180115 03:34', '%Y%m%d %H:%M'),
                 strptime('20180115 04:10', '%Y%m%d %H:%M'),
                 strptime('20180115 04:11', '%Y%m%d %H:%M'),
                 strptime('20180115 10:10', '%Y%m%d %H:%M')]}

df = pd.DataFrame.from_dict(data)

Я должен сгенерировать список следующего ожидаемого результата:

   num  empty  station_from  station_to       time_from         time_to
0    B   True           100           5  20180115 00:25  20180115 03:33
1    A  False             1           8  20180115 00:30  20180115 04:10
2    C  False            65          66  20180115 03:33  20180115 04:11
3    B  False            89          11  20180115 03:34  20180115 10:10

Объяснение: Это железнодорожные вагоны, в которых каждый вагон идентифицированnum (т. е. A, B, C). Они могут быть либо заряженными, либо пустыми (столбец пустой). Столбец dir указывает, выбрали ли мы эту конкретную машину или бросили ее.Может быть много других состояний (например, PASS в этом примере), но нас интересуют только состояния IN и OUT. Столбец станции - это место, где произошло событие, а столбец времени - когда оно произошло.

Я должен сгруппировать данные между каждой парой IN и OUT (или показать дорожку каждой из них) и показать, где и когда происходили действия. Сложность в том, что это не «нормальная» группа, а своего родаиерархического, основанного на временных рядах (в один и тот же день автомобиль может быть загружен и опустошен несколько раз).

Я не знаю, является ли панда лучшей структурой для этого упражнения, но существуют сотни миллионовзаписи в БД и производительность критичны.(мы предварительно выбираем данные на основе определенного периода времени)

Как достичь ожидаемого результата?

1 Ответ

0 голосов
/ 21 сентября 2018

1) Отфильтруйте все строки с помощью 'IN'

2) Найдите первое следующее 'OUT' для каждого 'IN' с соответствующими num и empty

result = df[df.dir=='IN'][['num','empty','station','time']].rename({'station':'station_from','time':'time_from'},axis='columns')
result[['station_to','time_to']] = result.apply(lambda r: df[(df.index>r.name) & (df.num==r.num) & (df.empty==r.empty) & (df.dir=='OUT')][['station','time']].iloc[0,:], axis=1)

print(result)

  num  empty  station_from                           time_from  station_to  \
0   B   True           100  (2018, 1, 15, 0, 25, 0, 0, 15, -1)           5   
1   A  False             1  (2018, 1, 15, 0, 30, 0, 0, 15, -1)           8   
7   C  False            65  (2018, 1, 15, 3, 33, 0, 0, 15, -1)          66   
8   B  False            89  (2018, 1, 15, 3, 34, 0, 0, 15, -1)          11   

                               time_to  
0   (2018, 1, 15, 3, 33, 0, 0, 15, -1)  
1   (2018, 1, 15, 4, 10, 0, 0, 15, -1)  
7   (2018, 1, 15, 4, 11, 0, 0, 15, -1)  
8  (2018, 1, 15, 10, 10, 0, 0, 15, -1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...