avatar
Мир аналитика данных
@analysts_world
29.11.2023 09:44
Я побывала на интенсиве, где разбирали тестовое задание в OZON на аналитика данных! И принесла самое интересное сюда для тех, кто не смог присутствовать!
Задание
Для выполнения этого задания требуется сгенерировать DataFrame с синтетическими данными. DataFrame должен состоять из 10000 строк и 5 колонок. Каждую из колонок мы предлагаем тебе создать и наполнить следующим образом:

🔹 1-я колонка – user_id – идентификатор пользователя. Длина user_id должна равняться 15-ти символам. Идентификатор состоит из случайной комбинации следующих символов: "1234567890abcdefghijk". Для каждой строки в DataFrame значение user_id формируются случайным образом.

🔹 2-я колонка – order_number – номер заказа. Столбец необходимо заполнить случайными значениями в диапазоне от 1 до 10.

🔹 3-я колонка – click2delivery – время, прошедшее с момента оформления заказа до вручения клиенту. Столбец необходимо заполнить случайными значениями из нормального распределения со средним 1440 и стандартным отклонением 200.

🔹 4-я колонка – order_items_sum – общая стоимость заказа. Значения для этого столбца необходимо взять из экспоненциального распределения с параметром λ = 1, смещённого на +1.

🔹 5-я колонка – retention – день жизни покупателя, в который он совершил заказ. Необходимо сгенерировать значения 1, 2, 3, 4, 5 с вероятностями 0.35, 0.25, 0.2, 0.15 и 0.05 соответственно.
В случае, если в колонке user_id встречаются дублирующиеся значения, оставь только первое из них.

Итак, импортируем библиотеки и задаем seed:
import pandas as pd
import numpy as np
import random
np.random.seed(42)

Это для того, чтобы скрипт выполнялся идентичным образом при каждом запуске. Мы предоставляем начальное значение (42 - популярный вариант).

Функция random.choice() возвращает один элемент из последовательности. Запихнем ее в созданную нами функцию generate_user_id(), а возвращать она будет соединенные join-ом выбранные по одному элементы из characters в количестве 15 штук.
def generate_user_id():
characters = "1234567890abcdefghijk"
return ''.join(random.choice(characters) for _ in range(15))
#Проверим как работает функция
generate_user_id()
'k4198854h3id213'


Теперь создадим функцию generate_df для генерации датафрейма.
И нашу функцию для user_id generate_user_id() запихнем в цикл for _ in range(n) чтобы нагенерировать 10 тыс строк.
Тут же создадим столбцы order_number, click2delivery, order_items_sum и retention.

def generate_df(n):
data = {
'user_id': [generate_user_id() for _ in range(n)],
'order_number': np.random.randint(1, 11, size=n),
'click2delivery': np.random.normal(1440, 200, size=n),
'order_items_sum': np.random.exponential(1, size=n) + 1,
'retention': np.random.choice([1, 2, 3, 4, 5], size=n, p=[0.35, 0.25, 0.2, 0.15, 0.05])
}
df = pd.DataFrame(data)
return df

df = pd.DataFrame()


А вы знали, что в питоне можно разряды в числах вот так показывать? n = 10_000 Я – нет. 😜
Пока длина df не будет 10 тыс будет выполняться соединение concat два датафрейма.
Условие n = 10_000 - len(df) при длине df 10 тыс строк будет равно 0 и while перестанет выполняться.
n = 10_000
while n:
new_df = generate_df(n)
df = pd.concat([df, new_df])
df = df.drop_duplicates(subset='user_id', keep='first')
n = 10_000 - len(df)

df.head()


Если хотите разбор следующих заданий в ближайшие дни ставим 🔥
🔥 77
5
27 53 2.7K

Обсуждение 27

Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.

Обсудить в Telegram