Извините, я новичок в питоне.
У меня есть датафрейм сущностей, которые регистрируют значения один раз в месяц. Для каждого уникального объекта в моем фрейме данных я нахожу максимальное значение, а затем нахожу максимальное значение соответствующего месяца. Используя максимальное значение месяца, разность времени между месяцами уникального объекта и максимальным месяцем может быть рассчитана в днях. Это работает для небольших фреймов данных.
Я знаю, что мой цикл не работает и не может масштабироваться до больших кадров данных (например, 3M строк (+ 156MB)). После нескольких недель исследований я понял, что моя петля вырождена, и я чувствую, что есть тупое решение или что-то более питоническое. Может ли кто-нибудь увидеть более эффективный подход к вычислению этой дельты времени в днях?
Я пробовал различные вычисления value.shift (x) в лямбда-функции, но пиковое значение не соответствует. Я также попытался вычислить больше столбцов, чтобы минимизировать мои вычисления цикла.
import pandas as pd
df = pd.DataFrame({'entity':['A','A','A','A','B','B','B','C','C','C','C','C'], 'month': ['10/31/2018','11/30/2018','12/31/2018','1/31/2019','1/31/2009','2/28/2009','3/31/2009','8/31/2011','9/30/2011','10/31/2011','11/30/2011','12/31/2011'], 'value':['80','600','500','400','150','300','100','200','250','300','200','175'], 'month_number': ['1','2','3','4','1','2','3','1','2','3','4','5']})
df['month'] = df['month'].apply(pd.to_datetime)
for entity in set(df['entity']):
# set peak value
peak_value = df.loc[df['entity'] == entity, 'value'].max()
# set peak value date
peak_date = df.loc[(df['entity'] == entity) & (df['value'] == peak_value), 'month'].min()
# subtract peak date from current date
delta = df.loc[df['entity'] == entity, 'month'] - peak_date
# update days_delta with delta in days
df.loc[df['entity'] == entity, 'days_delta'] = delta
РЕЗУЛЬТАТ:
entity month value month_number days_delta
A 2018-10-31 80 1 0 days
A 2018-11-30 600 2 30 days
A 2018-12-31 500 3 61 days
A 2019-01-31 400 4 92 days
B 2009-01-31 150 1 -28 days
B 2009-02-28 300 2 0 days
B 2009-03-31 100 3 31 days
C 2011-08-31 200 1 -61 days
C 2011-09-30 250 2 -31 days
C 2011-10-31 300 3 0 days
C 2011-11-30 200 4 30 days
C 2011-12-31 175 5 61 days