Python: быстрое агрегирование множества наблюдений в ежедневную суммуPython

Программы на Python
Ответить
Anonymous
 Python: быстрое агрегирование множества наблюдений в ежедневную сумму

Сообщение Anonymous »

У меня есть наблюдения с датой начала и окончания в следующем формате:

Код: Выделить всё

import pandas as pd

data = pd.DataFrame({
'start_date':pd.to_datetime(['2021-01-07','2021-01-04','2021-01-12','2021-01-03']),
'end_date':pd.to_datetime(['2021-01-16','2021-01-12','2021-01-13','2021-01-15']),
'value':[7,6,5,4]
})

data

start_date  end_date    value
0   2021-01-07  2021-01-16  7
1   2021-01-04  2021-01-12  6
2   2021-01-12  2021-01-13  5
3   2021-01-03  2021-01-15  4
Диапазоны дат между наблюдениями перекрываются. Я хотел бы вычислить дневную сумму, агрегированную по всем наблюдениям.
Моя версия с циклом (ниже) работает медленно и дает сбой при ~ 100 тыс. наблюдений. Как можно ускорить процесс?

Код: Выделить всё

def turn_data_into_date_range(row):
dates = pd.date_range(start=row.start_date, end=row.end_date)
return pd.Series(data=row.value, index=dates)

out = []
for index, row in data.iterrows():
out.append(turn_data_into_date_range(row))

result = pd.concat(out, axis=1).sum(axis=1)

result
2021-01-03     4.0
2021-01-04    10.0
2021-01-05    10.0
2021-01-06    10.0
2021-01-07    17.0
2021-01-08    17.0
2021-01-09    17.0
2021-01-10    17.0
2021-01-11    17.0
2021-01-12    22.0
2021-01-13    16.0
2021-01-14    11.0
2021-01-15    11.0
2021-01-16     7.0
Freq: D, dtype: float64
PS: ответ на этот связанный вопрос не работает в моем случае, поскольку они имеют непересекающиеся наблюдения и могут использовать левое соединение: конвертировать диапазоны дат во временные ряды в Pandas

Подробнее здесь: https://stackoverflow.com/questions/691 ... -daily-sum
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»