Медленная вычисляющая функция присваивания в Python

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

В справочной таблице есть столбец для каждого из входных данных (Страна, штат, подразделение, вертикаль, фокус), а также столбец для человека, которого следует назначить. в таблице назначений ~ 2400 строк.

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

Код, который я вставил ниже, работает, но для расчета 300 тыс. строк требуется больше часа. Я ищу в основном общее направление, чтобы сделать расчет более эффективным. Я чувствую, что должен попытаться векторизовать поиск, но:

  1. Я не уверен, как это сделать.
  2. Я не уверен, возможно ли это с одноразовыми операторами if в функции.

Код выглядит следующим образом:

# 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)

Любая направленная помощь здесь будет очень признательна.

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

wwii 20.02.2019 16:54

Вы используете Pandas DataFrame? Можно ли включить минимальный пример DataFrame, который будет работать с кодом? - что-то, что мы могли бы использовать для тестирования? ... минимальный воспроизводимый пример

wwii 20.02.2019 17:02

StackOverflow лучше всего работает при решении конкретных, узких проблем, которые можно изолировать в одном фрагменте кода. Советы по улучшению рабочего кода часто лучше подходят для нашего дочернего сайта Обзор кода, но прежде чем публиковать там, см. Руководство по проверке кода для пользователей Stack Overflow. и внимательно изучите их дополнительные требования.

Charles Duffy 20.02.2019 17:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
38
0

Другие вопросы по теме