Я думаю, что проблема происходит на шаге
d0 = dates[0]
dates
будет временной серией.Я думаю, вы предполагали, что это будет полный столбец «даты».Когда вы проходите серию панд, apply(lambda x: f(x) axis=1)
x - это строка, а не столбец.следовательно, x["date"]
будет временной меткой, а не серией, как вы ожидали.
Редактировать: может быть, лучше было бы использовать vecotrised, а не тот, кто полагается на .apply()
?
def xnpv(rate, values, dates):
return values / (1.0 + rate) ** ((dates - dates.min()).dt.days / 365.0)
F['newcolumn'] = xnpv(0.1, F['Cash'], F['Date'])
Редактировать 2: Мне кажется, это работает.Это соответствует тому, что вы ожидали?
F = pd.DataFrame({"name":['a','a','a','a','b','b','b','b'],
"cash":[1,1,3,4,1,2,4,5],
"date":['2017-01-01','2017-02-01','2017-03-01','2017-04-01',
'2017-01-01','2017-02-01','2017-03-01','2017-04-01']
})
F["date"] = pd.to_datetime(F["date"])
def xnpv(rate, values, dates):
return sum(values / (1.0 + rate) ** ((dates - dates.min()).dt.days / 365.0))
F.groupby('name').apply(lambda x: xnpv(0.1, x['cash'], x['date']))