これは、日付範囲を現在の日付に基づく数値に変換する問題です。パンダデータフレーム変換の日付範囲関数のベクトル化
入力テーブル:
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
出力テーブル:
nubmer_of_daysが1行のすべての値の合計が続く指数関数的減衰関数に基づいて計算される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
。
次のように私たちは、機能を実装することができます:
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)
が、これは数百万行、巨大な日付範囲を持つテーブルのための非常に遅いです。
変換関数の内側のforループをベクトル化することによってプロセスをスピードアップする方法については、どんな考えですか?
ありがとうございました!
ありがとうございます。それは速いです! – Yiliang