Я пытаюсь назначить учетные записи торговым представителям на основе нескольких критериев, используя таблицу поиска и несколько переменных измерений (штат, страна, подразделение и т. д.)
В справочной таблице есть столбец для каждого из входных данных (Страна, штат, подразделение, вертикаль, фокус), а также столбец для человека, которого следует назначить. в таблице назначений ~ 2400 строк.
Я передаю функцию каждой строке своих данных, используя df.apply и лямбда-функцию в строке.
Код, который я вставил ниже, работает, но для расчета 300 тыс. строк требуется больше часа. Я ищу в основном общее направление, чтобы сделать расчет более эффективным. Я чувствую, что должен попытаться векторизовать поиск, но:
Код выглядит следующим образом:
# Assigns accounts to reps based on their current status, country, state, division,
# & vertical. Slightly different rules used for Acute Enterprise, as they don't
# have AM's and Sales broken out
def assign_accounts (cust_type, record_type, top_vert_arr, country, state, division, vertical, top_parent, opp_owner):
if top_parent == 'INACTIVE - DO NOT CALL':
return 'Joe Schmoe'
# Check on whether the customer has joined in the last 6 months
elif opp_owner == opp_owner:
return opp_owner
elif (vertical == 'Acute') & (division == 'Enterprise'):
try:
rep_name = assign.loc[(assign['country'] == country) &
(assign['state'] == state) &
(assign['division'] == division) &
(assign['vertical'] == vertical) &
(assign['product'] == 'Learning')]
return rep_name['rep'].iloc[0][:]
except:
return 'No Map1'
# All non-customers going to New Sales reps
elif (top_vert_arr == 0) :
try:
rep_name = assign.loc[(assign['country']== country) &
(assign['state'] == state) &
(assign['division'] == division) &
(assign['vertical'] == vertical) &
(assign['focus'] == 'New')]
return rep_name['rep'].iloc[0][:] # returns name as text
except:
return 'No Map5'
# All customers going to Account Manager assignment
else:
try:
rep_name = assign.loc[(assign['country']== country) &
(assign['state'] == state) &
(assign['division'] == division) &
(assign['vertical'] == vertical) &
(assign['focus'] == 'AM')]
return rep_name['rep'].iloc[0][:] # returns name as text
except:
return 'No Map3'
#New rep assignments added to data
accounts['new_assignment'] = accounts.apply(lambda row : assign_accounts(row['type'], row['record_type'], row['top_vert_arr'], row['country'], row['bill_state'], row['division'],
row['short_final_vertical'], row['top_parent'], row['opp_owner']), axis = 1)
Любая направленная помощь здесь будет очень признательна.
Вы используете Pandas DataFrame? Можно ли включить минимальный пример DataFrame, который будет работать с кодом? - что-то, что мы могли бы использовать для тестирования? ... минимальный воспроизводимый пример
StackOverflow лучше всего работает при решении конкретных, узких проблем, которые можно изолировать в одном фрагменте кода. Советы по улучшению рабочего кода часто лучше подходят для нашего дочернего сайта Обзор кода, но прежде чем публиковать там, см. Руководство по проверке кода для пользователей Stack Overflow. и внимательно изучите их дополнительные требования.






Пожалуйста, отформатируйте вашу функцию как код - stackoverflow.com/help/formattingstackoverflow.com/editing-help