Подсчитать количество строк между временными интервалами - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть DataFrame pandas с временем начала и окончания (datetime.time) для списка процессов:

from datetime import time
import pandas as pd
df = pd.DataFrame(columns=['start', 'end'], 
                  index=pd.Index(['proc01', 'proc02'], name='Processes'), 
                  data=[
                        [time(10), time(14)], 
                        [time(12), time(16)]
                  ])

Я хочу преобразовать эту информацию в гистограмму, которая подсчитывает, сколько процессов запущено:

>>> bins = pd.date_range('08:00', '22:00', freq='1H').time
>>> count_processes(df, bins)
array([0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0])

У меня есть реализация, но она довольно медленная для больших фреймов данных (около 2-3 миллионов строк), я хотел бы знать, есть ли способ ее векторизации или, по крайней мере, сделать ее более быстрой:

def count_processes(df, bins):
     result = np.zeros_like(bins, dtype=int)
     for _, row in df.iterrows():
         aux = (row['start'] <= bins) & (bins < row['end'])
         result += aux.astype(int)
     return result

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Uisng numpy boardcast, к сожалению, это решение O (m * n), попробуйте использовать ваши реальные данные, если у вас есть какие-либо проблемы с ними, пожалуйста, дайте мне знать

v1=pd.to_datetime(df.start,format='%H:%M:%S').values
v2=pd.to_datetime(df.end,format='%H:%M:%S').values
bins=pd.to_datetime(bins,format='%H:%M:%S')
np.sum(((v1-bins[:,None])<=np.timedelta64(0,'ns'))&((v2-bins[:,None])>np.timedelta64(0,'ns')),1)
Out[529]: array([0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0]) 
0 голосов
/ 30 ноября 2018

Итерации по Датафрейму обычно являются признаком того, что вы не используете pandas оптимально.Вместо этого вы могли бы вычесть процессы, которые закончились, из процессов, которые начались, например:

res = []
for b in bins:
    s = (df['start'] < b).sum()
    e = (df['end'] < b).sum()
    res.append(s-e)
# [0, 0, 0, 1, 1, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...