У меня есть два кадра с информацией об аккаунтах. Один со стратегиями (df) и один с транзакциями (df2). Мне нужен еще один столбец в кадре транзакции-данных, с которым у каждой учетной записи есть стратегия на дату транзакции.
Я думаю о двух решениях, использующих функции df.apply и lambda, которые используют входную дату и учет из транзакций и стратегию возврата. Оба порождают ошибки. Сейчас я ищу какой-нибудь способ двигаться вперед. Спасибо.
import pandas as pd
strategy_data = [['001', '2018-03-02', '2018-03-04', 'strat1'],['001', '2018-03-05', '2018-03-10', 'strat2'],['002', '2018-02-01', '2018-03-02', 'strat2']]
df = pd.DataFrame(strategy_data, columns = ['acc', 'd1', 'd2', 'strat'])
transaction_data = [['001', '2018-03-02', 234], ['001', '2018-03-03', 432], ['001', '2018-03-07', 543], ['002', '2018-02-20', 543]]
df2 = pd.DataFrame(transaction_data, columns = ['acc', 'd', 'am'])
Идея 1
def return_strat(acc, date):
df3 = df.loc(lambda df: df['acc'] == acc)
df3 = df3.loc(lambda df3: df3['d1'] < date)
df3 = df3.loc(lambda df3: df3['d2'] > date)
return df3['strat'].value
df2['strat'] = df2.apply(lambda row : return_strat(row['acc'], row['d']), index=1)
Идея 2
df2['strat'] = df2.apply(lambda row : df.loc((df.acc == row['acc']) & ( df.d1 <= row['d'] <= df.d2)), axis=1)
Ожидаемый результат - новый столбец в df2 с текущей стратегией для каждой транзакции.
Опция 1 генерирует ValueError: («Не указана ось в 0x11ac976a8> для типа объекта», «произошло с индексом 0»)
Опция 2 генерирует ValueError: ('Истинное значение Series является неоднозначным. Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().', 'произошло с индексом 0')