Панды: np.vectorize медленно обновляет значения в кадре данных - PullRequest
0 голосов
/ 25 июня 2018

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

Я написал некоторый код, который достигает этогоно это довольно медленно (прибл. 10 минут для 36000 матчей / рядов).У меня есть ощущение, что это связано с моим использованием np.vectorize, который я использовал, потому что я не знаю другого способа заставить функцию, работающую на pandas df, принимать несколько аргументов (моя функция get_match_rating - см. Ниже - принимает три аргумента).

match_fil3 - это имя кадра данных.Все функции, которые я использую, очень просты (всего одна или две строки очень простых математических выражений).Вот почему я думаю, что это проблема np.vectorize - есть ли более быстрый / более питонский способ достижения этого?

for i in range(0, len(matches_fil3)):
    matches_fil3.loc[i, 'P1Est'] = np.vectorize(get_estimate)(matches_fil3['Player One'].iloc[i], i)
    matches_fil3.loc[i, 'P1Err'] = np.vectorize(get_error)(matches_fil3['Player One'].iloc[i], i)
    matches_fil3.loc[i, 'P2Est'] = np.vectorize(get_estimate)(matches_fil3['Player Two'].iloc[i], i)
    matches_fil3.loc[i, 'P2Err'] = np.vectorize(get_error)(matches_fil3['Player Two'].iloc[i], i)
    matches_fil3.loc[i, 'P1Rat'] = np.vectorize(get_match_rating)(matches_fil3['P1 Frames Won'].iloc[i], matches_fil3['Total'].iloc[i], matches_fil3['P1Exp'].iloc[i])
    matches_fil3.loc[i, 'P2Rat'] = np.vectorize(get_match_rating)(matches_fil3['P2 Frames Won'].iloc[i], matches_fil3['Total'].iloc[i], matches_fil3['P2Exp'].iloc[i])

1 Ответ

0 голосов
/ 25 июня 2018

Я думаю, что лучший и быстрый способ сделать эту работу - применить функцию apply. Они оптимизированы для быстрой работы.

Вы можете переписать свой код как:

matches_fil3['P1Est'] = matches_fil3['Player One'].apply(get_estimate)
matches_fil3['P1Err'] = matches_fil3['Player One'].apply(get_error)
.
.
matches_fil3['P2Rat'] = matches_fil3.apply(lambda row: get_match_rating(row['P2 Frames Won'], row['Total'], row['P2Exp']), axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...