Это проблема преобразования диапазона дат в числовые значения на основе текущей даты.векторизация функции диапазона дат для преобразования pandas dataframe
Входной стол:
ID START_DATE END_DATE CURRENT_DATE
1 2010-12-08 2011-03-01 2011-04-01
2 2010-12-10 2011-01-12 2011-01-02
3 2010-12-16 2011-03-07 2010-10-10
Выходной стол:
ID START_DATE END_DATE CURRENT_DATE number_of_days
1 2010-12-08 2011-03-01 2011-04-01 78.148490
2 2010-12-10 2011-01-12 2011-01-02 23.726149
3 2010-12-16 2011-03-07 2010-10-10 0.000000
, где nubmer_of_days вычисляется на основе экспоненциальной функции распада, а затем путем суммирования всех значений для одной строки.
Мы можем реализовать функцию следующим образом:
def transform(start, end, current):
value = 0
if current > end: #current date is later than the end date
delta = end - start
for i in range(delta.days + 1):
diff = current - (start + td(days = i))
value += math.exp(- 0.001 * diff.days)
elif current > start: #current date is between the start and end
delta = current - start
for i in range(delta.days + 1):
diff = current - (start + td(days = i))
value += math.exp(-0.001 * diff.days)
else:
pass
return value
, а затем применить ниже преобразование:
df['number_of_days'] = df.apply(lambda x: transform(x['START_DATE'], x['END_DATE'], x['CURRENT_DATE']),axis=1)
Однако это очень медленный для таблицы с миллионами строк и огромный диапазон дат ,
Любая идея о том, как ускорить процесс путем векторизации внутреннего цикла цикла в функции преобразования?
Спасибо!
спасибо. Это быстро! – Yiliang