«Объект отметки времени не поддерживает индексацию», «произошел с индексом 0») - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь работать с фреймом данных, где мне нужно создать новый столбец, который будет заполнять результат, заданный функцией xnpv

def xnpv(rate, values, dates):

    if rate <= -1.0:
        return float('inf')
    d0 = dates[0]    # or min(dates)
    return sum([ vi / (1.0 + rate)**((di - d0).days / 365.0) for vi, di in zip(values, dates)])

F['newcolumn'] = F.apply(lambda x: xnpv(0.1, x['Cash'], x['Date']), axis=1)

, когда я выполняю приведенный выше код, это дает мне следующую ошибку: TypeError: («Объект« Timestamp »не поддерживает индексирование», «произошел с индексом 0») Помогите мне решить эту проблему

Когда я использую следующее выражение

F['newcolumn'] = F.groupby('Name').apply(lambda x: xnpv(0.1, x['Cash'], x['Date']))

itвыдает мне еще одну ошибку: KeyError: 0

example

1 Ответ

0 голосов
/ 21 ноября 2018

Я думаю, что проблема происходит на шаге

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']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...