Заменить вложенный цикл для лямбда-функции для панд df - PullRequest
0 голосов
/ 14 октября 2019

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

data = [['tom', '1'], ['nick', '1'], ['julie', '1'], ['tom', '2'], ['julie', '2'], ['tom', '3'], ['julie', '3']] 
visits_comb = pd.DataFrame(data, columns = ['USER_ID', 'PAGE_CLICKED']) 
visits_comb

page_id=pd.DataFrame(visits_comb.PAGE_CLICKED.unique(),columns=['PAGE_CLICKED'])
page_id

sim_mat=np.zeros(shape=(len(page_id),len(page_id)))

for index, row in page_id.iterrows():

    base_page=row['PAGE_CLICKED']

    for index2, row2 in page_id.iterrows():
        comparison_page=row2['PAGE_CLICKED']
        if base_page<comparison_page: 

            sessions=visits_comb[visits_comb['PAGE_CLICKED'].map(lambda x: x in [base_page,comparison_page])].groupby('USER_ID')['PAGE_CLICKED'].apply(lambda x: x.unique().shape[0])
            sim_mat[index][index2]=sessions.value_counts(2)[2]

print(sim_mat)

1 Ответ

0 голосов
/ 14 октября 2019

Я нашел способ, который сокращает время бега примерно на 60%. Однако это все еще крайне неэффективное решение с двойным циклом for. Хотелось бы узнать чьи-либо мысли:

data = [['tom', '1'], ['nick', '1'], ['julie', '1'], ['tom', '2'], ['julie', '2'], ['tom', '3'], ['julie', '3']] 
visits_comb = pd.DataFrame(data, columns = ['USER_ID', 'PAGE_CLICKED']) 
visits_comb

page_id=pd.DataFrame(visits_comb.PAGE_CLICKED.unique(),columns=['PAGE_CLICKED'])
page_id

sim_mat=np.zeros(shape=(len(page_id),len(page_id)))

for index, row in page_id.iterrows():

    base_page=row['PAGE_CLICKED']

    for index2, row2 in page_id.iterrows():
        comparison_page=row2['PAGE_CLICKED']
        if base_page<comparison_page: 

            sessions=visits_comb['USER_ID'][visits_comb['PAGE_CLICKED'].map(lambda x: x in [base_page,comparison_page])].value_counts()
            sim_mat[index][index2]=sessions.value_counts(normalize=True)[2]

print(sim_mat)
...