Каков наиболее эффективный способ подсчета количества экземпляров, произошедших за определенный период времени в Python?
Я пытаюсь запустить простую функцию подсчета, которая запускает фрейм данных времени событий (в частности, операций) для другого фрейма данных временных интервалов смены и возвращает список того, сколько событий происходит за каждую смену. Эти CSV-файлы состоят из тысяч строк, поэтому, несмотря на то, что я настроил их в данный момент, это работает вечно. Вот что у меня есть:
numSurgeries = [0 for shift in range(len(df.Date))]
for i in range(len(OR['PATIENT_IN_ROOM_DTTM'])):
for shift in range(len(df.DateTime)):
if OR['PATIENT_IN_ROOM_DTTM'][i] >= df.DateTime[shift] and OR['PATIENT_IN_ROOM_DTTM'][i] < df.DateTime[shift+1]:
numSurgeries[shift] += 1
Таким образом, он просматривает каждое событие и проверяет, в каком временном интервале сдвига он находится, а затем увеличивает счет для этого временного интервала. Логично, работает, но точно не эффективно.
РЕДАКТИРОВАТЬ:
2 ответа
Без примеров данных не совсем понятно, что вы хотите. Но это должно помочь вам векторизовать:
numSurgeries = {shift: np.sum((OR['PATIENT_IN_ROOM_DTTM'] >= df.DateTime[shift]) & \
(OR['PATIENT_IN_ROOM_DTTM'] < df.DateTime[shift+1])) \
for shift in range(len(df.Date))}
Выходными данными является целочисленное смещение словаря в numSurgeries.
Как уже упоминалось выше, трудно ответить без примеров данных.
Тем не менее, логическая маска звучит уместно. См. Выбор строк данных между двумя датами.
Создать маску даты из shift
мы назовем даты начала и окончания start_shift
а также end_shift
соответственно. Это должно быть в datetime
формат.
date_mask = (df['datetime'] >= start_shift) & (df['datetime'] <= end_shift)
Найдите все значения в df
которые соответствуют этому диапазону.
df_shift = df.loc[date_mask]
Подсчитайте количество экземпляров в новом df_shift
,
num_surgeries = len(df_shift.index())
Цикл всех смен.
def count_shifts(df, shift, results_df, start_shift, end_shift):
date_mask = (df['datetime'] >= start_shift) & (df['datetime'] <= end_shift)
df_shift = df.loc[date_mask]
num_surgeries = len(df_shift.index())
return(num_surgeries)
# iterates through df and applies the above function to every row
results_df['num_surgeries'] = results_df.apply(calculate_num_surgeries,axis=1)
Также не забудьте назвать переменные в соответствии с Руководством по стилю PEP8! Camelcase не рекомендуется в Python.