Я работаю с некоторыми историческими данными о бейсболе и пытаюсь получить информацию о совпадении (тест / кувшин) для предыдущих игр.
Пример данных:
import pandas as pd
data = {'ID': ['A','A','A','A','A','A','B','B','B','B','B'],
'Year' : ['2017-05-01', '2017-06-03', '2017-08-02', '2018-05-30', '2018-07-23', '2018-09-14', '2017-06-01', '2017-08-03', '2018-05-15', '2018-07-23', '2017-05-01'],
'ID2' : [1,2,3,2,2,1,2,2,2,1,1],
'Score 2': [1,4,5,7,5,5,6,1,4,5,6],
'Score 3': [1,4,5,7,5,5,6,1,4,5,6],
'Score 4': [1,4,5,7,5,5,6,1,4,5,6]}
df = pd.DataFrame(data)
lookup_data = {"First_Person" : ['A', 'B'],
"Second_Person" : ['1', '2'],
"Year" : ['2018', '2018']}
lookup_df = pd.DataFrame(lookup_data)
Lookup df содержит текущие совпадения, df содержит исторические данные и текущие совпадения.
Я хочу выяснить, например, для Лица А против Лица 2, каковы были результаты любого из их матчей в какой-либо предыдущей дате?
Я могу сделать это с помощью:
history_list = []
def get_history(row, df, hist_list):
#we filter the df to matchups containing both players before the previous date and sum all events in their history
history = df[(df['ID'] == row['First_Person']) & (df['ID2'] == row['Second_Person']) & (df['Year'] < row['Year'])].sum().iloc[3:]
#add to a list to keep track of results
hist_list.append(list(history.values) + [row['Year']+row['First_Person']+row['Second_Person']])
и затем выполнить команду apply следующим образом:
lookup_df.apply(get_history, df=df, hist_list = history_list, axis=1)
Ожидаемые результаты будут примерно такими:
1st P Matchup date 2nd p Historical scores
A 2018-07-23 2 11 11 11
B 2018-05-15 2 7 7 7
Но это довольно медленно - операция фильтрации занимает около 50 мс на поиск.
Есть ли лучший способ решить эту проблему?В настоящее время это заняло бы более 3 часов, чтобы пройти 250 тысяч исторических матчей.