Перейти к основному содержимому

Создание датафрейма с действиями пользователей сайта

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

Подготовка инфраструктуры​

Для начала создай папку проекта и установи там виртуальное окружение. Для работы тебе понадобится только одна внешняя библиотека — Pandas. Установи её в созданном окружении.

pip install pandas

Пишем код​

Импорт библиотек​

import random
import datetime
import uuid

import pandas as pd

Создание функций​

# Функция для генерации случайного действия пользователя
def generate_user_events(user_id, session_id, start_datetime, max_events_per_session):
previous_event_date = start_datetime

events = []
for event in range(1, random.randint(1, max_events_per_session + 1)):
event_id = f'e-{str(uuid.uuid4().hex)}'
max_time_diff = datetime.timedelta(seconds=random.randint(5, 200))

event_date = previous_event_date + max_time_diff
url = random.choices(list(url_weight.keys()),
weights = list(url_weight.values()),
k = 1)
event_name = random.choices(list(event_weight.keys()),
weights = list(event_weight.values()),
k = 1)

event = {'user_id': user_id,
'session_id': session_id,
'event_id': event_id,
'timestamp': event_date,
'url': url[0],
'event_type': event_name[0]}

events.append(event)

previous_event_date = event_date

return events


# Функция для генерации датафрейма с кликстримом
def generate_clickstream(start_date, users_count, max_sessions_per_user, max_events_per_session):
start_datetime = datetime.datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')

logs = []
for user in range(1, users_count + 1):
user_id = f'UID-{user}'
user_random_start_datetime = datetime.timedelta(days=random.randint(0, 30),
hours=random.randint(0, 23),
minutes=random.randint(0, 59),
seconds=random.randint(1, 59))
start_datetime = start_datetime + user_random_start_datetime
for session in range(1, random.randint(1, max_sessions_per_user + 1)):
session_id = f's-{str(uuid.uuid4())}'
session_logs = generate_user_events(user_id,
session_id,
start_datetime,
max_events_per_session)
logs.extend(session_logs)
session_random_start_datetime = datetime.timedelta(days=random.randint(0, 30),
hours=random.randint(0, 23),
minutes=random.randint(0, 59),
seconds=random.randint(1, 59))
start_datetime = start_datetime + session_random_start_datetime

df = pd.DataFrame(logs)

return df

Определение конфигурационных данных​

start_date = '2022-03-24 00:00:00'  # Дата с которой начнётся генерация событий

users_count = 100 # Количество пользователей
max_sessions_per_user = 10 # Максимальное количество сессий на каждого пользователя
max_events_per_session = 50 # Максимальное количество событий на каждую сессию

# Справочник URL и частоты их встречаемости в выборке относительно друг друга
url_weight = {
'/product': 30,
'/category': 10,
'/home': 5,
'/contact': 2,
'/cart': 5,
'/order': 1
}

# Справочник событий и частоты их встречаемости в выборке относительно друг друга
event_weight = {
'page_view': 30,
'click': 15,
'add_to_cart': 6,
'submit': 2
}

Генерация данных и сохранение их в переменную​

df = generate_clickstream(start_date, users_count, max_sessions_per_user, max_events_per_session)

Результат​

print(df)
user_idsession_idevent_idtimestampurlevent_type
UID-1s-3bd5e895-413b-4a70-8220-e250e394982ae-e7ed20572f274e878cb926c53a6602e02022-04-20 01:18:37/productpage_view
UID-1s-3bd5e895-413b-4a70-8220-e250e394982ae-8107f70a3fea4619a010e7705eeae3922022-04-20 01:21:24/productclick
UID-1s-3bd5e895-413b-4a70-8220-e250e394982ae-2d7c7519678f4bcba5350ebd17d017882022-04-20 01:23:11/cartpage_view
UID-1s-3bd5e895-413b-4a70-8220-e250e394982ae-5c9a34481ede4fb19553cb3a410a3bd82022-04-20 01:25:03/productclick
UID-1s-3bd5e895-413b-4a70-8220-e250e394982ae-2a4a9c8669104bf780a078a081e492cb2022-04-20 01:28:02/productclick
UID-1s-3bd5e895-413b-4a70-8220-e250e394982ae-51a5c9931bb446e28a939a60c9fa427d2022-04-20 01:30:16/productadd_to_cart
——————
UID-100s-099aea71-0968-4d4e-a6c2-26e4e4fd6245e-1e681d3dbfdb46a1ad6521a284927e7b2024-05-09 09:40:38/productclick
UID-100s-099aea71-0968-4d4e-a6c2-26e4e4fd6245e-8763d0957df949e5b0ebd717ce496ca12024-05-09 09:42:13/orderpage_view
UID-100s-099aea71-0968-4d4e-a6c2-26e4e4fd6245e-321cc38cee7c45e98821894181ed86072024-05-09 09:44:24/productadd_to_cart
UID-100s-099aea71-0968-4d4e-a6c2-26e4e4fd6245e-b48bc02fb54b42cfa6a56dfa4779c4362024-05-09 09:47:17/productclick
UID-100s-099aea71-0968-4d4e-a6c2-26e4e4fd6245e-84172f9f3a5c4029b3d3136ae2edb3162024-05-09 09:47:35/productpage_view
UID-100s-ec934299-5daa-42da-aced-71b78b2552b7e-e1f1acdd217a4fdb9e680961ce4b55fa2024-05-11 01:39:40/productpage_view
UID-100s-ec934299-5daa-42da-aced-71b78b2552b7e-adf5a67f58dc4a43bdcb998d019d69c82024-05-11 01:42:18/categoryclick
UID-100s-ec934299-5daa-42da-aced-71b78b2552b7e-ea38c4bff2424da7b4ec9ce46c3c6f712024-05-11 01:45:33/categorypage_view