Я пытаюсь запустить приведенный ниже код. Он отлично работает для данных небольшого размера, но для данных большего размера на это уходит почти день.
Любой, кто может помочь оптимизировать код или кто подскажет мне подход. Можем ли мы использовать лямбда-выражение для решения проблемы?
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
Это довольно дорого, так как у вас есть как минимум большое количество n^2
, а затем n^3
в вашем последнем заявлении elif
. Что именно вы пытаетесь сделать, прежде чем мы начнем предлагать изменения?
Обычно, если вы используете циклы в numpy или pandas, вы делаете это неправильно. Попробуйте использовать встроенные функции, такие как векторизация, трансляция, модное индексирование и т. д.
похоже, что вы пытаетесь выполнить «присоединение» к базе данных вручную, Pandas предоставляет эту функцию как merge
, и использование этого будет иметь большое значение для решения вашей проблемы
У меня проблемы с отслеживанием всех ваших веток, но вы сможете получить большую часть пути, если вы используете merge
, а затем, возможно, выполните некоторую пост-обработку / фильтрацию, чтобы получить окончательный ответ.
Можете ли вы предоставить (краткий!) Пример ваших данных и результатов, которые вам нужны?