Как оптимизировать производительность этого кода?

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

Любой, кто может помочь оптимизировать код или кто подскажет мне подход. Можем ли мы использовать лямбда-выражение для решения проблемы?

for index in df.index:

        for i in df.index:

            if ((df.loc[index,"cityId"]==df.loc[i,"cityId"]) & (df.loc[index,"landingPagePath"]==df.loc[i,"landingPagePath"]) & 
                (df.loc[index,"exitPagePath"]==df.loc[i,"exitPagePath"]) &
                (df.loc[index,"campaign"]==df.loc[i,"campaign"]) &
                (df.loc[index,"pagePath"]==df.loc[i,"previousPagePath"]) &
                ((df.loc[index,"dateHourMinute"]+timedelta(minutes=math.floor(df.loc[index,"timeOnPage"]/60))==df.loc[i,"dateHourMinute"]) |
                        (df.loc[index,"dateHourMinute"]==df.loc[i,"dateHourMinute"]) |
                        ((df.loc[index,"dateHourMinute"]+timedelta(minutes=math.floor(df.loc[index,"timeOnPage"]/60))+timedelta(minutes=1))==df.loc[i,"dateHourMinute"]))
                ):
                    if (df.loc[i,"sess"]==0):


                        df.loc[i,'sess']=df.loc[index,'sess']

                    elif (df.loc[index,"sess"]>df.loc[i,"sess"] ):

                        df.loc[index,'sess']=df.loc[i,'sess']

                    elif (df.loc[index,"sess"]==0):
                        df.loc[index,'sess']=df.loc[i,'sess'] 

                    elif (df.loc[index,"sess"]<df.loc[i,"sess"] ):
                        x=df.loc[i,"sess"]
                        for q in df.index:
                            if (df.loc[q,"sess"]==x):
                                df.loc[q,"sess"]=df.loc[index,'sess']






            else:
                if (df.loc[index,"sess"]==0):

                    df.loc[index,'sess'] = max(df["sess"])+1

Можете ли вы предоставить (краткий!) Пример ваших данных и результатов, которые вам нужны?

asongtoruin 18.12.2018 10:05

Это довольно дорого, так как у вас есть как минимум большое количество n^2, а затем n^3 в вашем последнем заявлении elif. Что именно вы пытаетесь сделать, прежде чем мы начнем предлагать изменения?

fixatd 18.12.2018 10:05

Обычно, если вы используете циклы в numpy или pandas, вы делаете это неправильно. Попробуйте использовать встроенные функции, такие как векторизация, трансляция, модное индексирование и т. д.

Jan Christoph Terasa 18.12.2018 10:12
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
69
1

Ответы 1

похоже, что вы пытаетесь выполнить «присоединение» к базе данных вручную, Pandas предоставляет эту функцию как merge, и использование этого будет иметь большое значение для решения вашей проблемы

У меня проблемы с отслеживанием всех ваших веток, но вы сможете получить большую часть пути, если вы используете merge, а затем, возможно, выполните некоторую пост-обработку / фильтрацию, чтобы получить окончательный ответ.

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