Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 0
Регистрация: 07.10.2022
Сообщений: 12

Мини Когортный анализ

06.10.2024, 00:49. Показов 637. Ответов 2

Студворк — интернет-сервис помощи студентам
Пожалуйста помогите найти ошибку в моем решение. Вот условие:
Однажды тимлиду стартапа «Успешный успех» попалась на глаза статья про когортный анализ и у него появилась идея разделить пользователей на группы в зависимости от месяца регистрации на маркетплейсе и проанализировать динамику совершения покупок пользователями каждой когорты в отдельности. В ходе аналитической проработки данной задачи командой стартапа были выработаны детальные требования к расчету:

1)Для удобства решили присвоить когортам наименования вида YYYY-MM (четыре цифры года и две цифры месяца формирования), например, 2022-02 (февраль 2022 г.).
2)Считать днем регистрации пользователя дату самой ранней записи в логе, относящуюся к данному пользователю, округленную до дня (без учета часов и минут).
3)Засчитывать в GMV все суммы заказов по всем событиям оформления заказа.
4)GMV каждого пользователя разбить на группы по неделям, прошедшим со дня регистрации пользователя. Так, например, если между датой регистрации пользователя, округленной до суток, и моментом оформления заказа прошло от 0 до 6 полных дней (включительно), GMV таких событий засчитывается в первую неделю, если пользователь оформил заказ с 7-го по 13-й день с даты регистрации — GMV засчитывается во вторую неделю, и т.д.
5)Просуммировать GMV всех пользователей из одной и той же когорты по неделям и округлить до целых миллионов рублей.
Формат ввода
Входной файл log.tsv имеет формат TSV с заголовком и содержит следующие поля данных:

- userid — идентификатор пользователя;
- timestamp — дата и время события в формате ISO;
- action — действие, совершенное пользователем, может принимать одно из значений:
- mainpage — вход на главную страницу сайта;
- search — поиск товаров в каталоге;
- product — открытие страницы с карточкой продукта;
- category — открытие страницы с карточкой категории;
- cart — страница добавления товара в корзину;
- checkout — оформление заказа;
- confirmation — подтверждение заказа;
- value — стоимость добавляемого товара (для события cart), либо сумма заказа (для событий checkout и confirmation) в рублях;
- testids — идентификаторы тестовых выборок, в которых находится пользователь.
Все поля за исключением поля testids гарантированно заполнены для каждой записи лога. Значение поля testids может быть пустым.

Формат вывода
Выведите GMV по когортам в разбивке по неделям со дня регистрации пользователя. Каждая строка выводимых данных должна иметь следующий формат (\t - символ табуляции):

<когорта>\t|\t<GMV 1-й недели>\t<GMV 2-й недели>\t<GMV 3-й недели>\t<GMV 4-й недели>
Строки должны быть упорядочены по возрастанию наименований когорт.

Выводимые значения GMV округлите до целых миллионов рублей. Например, значение 40532342.0 должно быть округлено до 41.

Для файла log.tsv из примера вывод должен быть таким:

2022-02 | 72 33 25 19
2022-03 | 29 16 13 13
2022-04 | 23 10 10 9
2022-05 | 21 8 8 7
2022-06 | 16 5 5 5
2022-07 | 15 2 2 0
Так же прикрепил кусочек данного файла. Я не прошу решить за меня, но может кто-то увидит мой косяк, если взять второй месяц первую неделю у меня получается только 69 вместо 72...Код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import csv
 
with open('log.tsv', 'r') as f:
    file = csv.reader(f, delimiter='\t')
    d = {}
    next(file)
    flag = 1
    month = ''
    ar = [[], [], [], []]
    for i in file:
        if flag:
            flag = 0
            month = i[1].split('T')[0].split('-')[1]
        if month != i[1].split('T')[0].split('-')[1]:
            print(f'2022-{month}\t|\t{sum(ar[0])}\t{sum(ar[1])}\t{sum(ar[2])}\t{sum(ar[3])}')
            d = {}
            ar = [[], [], [], []]
        if len(d.get(i[0], [])) == 0:
            d[i[0]] = i[1].split('T')[0].split('-')[-1]
        if i[2] == 'checkout':
            if 0 <= int(i[1].split('T')[0].split('-')[2]) - int(d.get(i[0])) <= 6:
                ar[0] = ar[0] + [(int(i[3].split('.')[0]))]
            if 7 <= int(i[1].split('T')[0].split('-')[2]) - int(d.get(i[0])) <= 13:
                ar[1] = ar[1] + [(int(i[3].split('.')[0]))]
            if 14 <= int(i[1].split('T')[0].split('-')[2]) - int(d.get(i[0])) <= 20:
                ar[2] = ar[2] + [(int(i[3].split('.')[0]))]
            if 21 <= int(i[1].split('T')[0].split('-')[2]) - int(d.get(i[0])) <= 27:
                ar[3] = ar[3] + [(int(i[3].split('.')[0]))]
        month = i[1].split('T')[0].split('-')[1]
Вложения
Тип файла: txt logis.txt (18.3 Кб, 6 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2024, 00:49
Ответы с готовыми решениями:

Зависает windows 7 x64 и мини-тема на счёт видеокарты(мини во вторую очередь)
В общем проблема такая: каждый день либо bsod(дампы в архиве) либо комп просто останавливается и всё(то-есть всё застывает ни звуков...

Мини-дрель, мини-шлифмашина, ProsKit PT-5501I
Знаю, что подобный инструмент весьма востребован. Но он либо дорогой (Dremel), либо очень некачественный. У ProsKit появилась очень...

Мини-библиотека или мини-прокат
Добрый день! Ищу мини-библиотеку или мини-прокат в версии 8.2. Хочу разобрать её по частям и на основе её сделать нужную мне программу....

2
Заблокирован
06.10.2024, 01:18
Python
1
int(i[1].split('T')[0].split('-')[2]) - int(d.get(i[0]))
Тут похоже проблема, что вы отнимаете числа, а не дату, например если пользователь зарегистрировался 28 февраля, а событие произошло 1 марта ваша разница будет 1 - 28 = -27 что неверно. Нужно использовать datetime, остальное по мелочи
1
1 / 1 / 0
Регистрация: 07.10.2022
Сообщений: 12
06.10.2024, 16:49  [ТС]
Спасибо, действительно так сделать лучше, но мне все равно до конца непонятно почему в самый первый месяц, первую неделю у меня не досчитывает, по крайней мере вначале должно совпадать.
А получается если пользователь зарегистрировался в апреле, а оформил заказ в июне, мы вообще не можем включить его ни в какую группу, потому что прошло более 27 дней?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.10.2024, 16:49
Помогаю со студенческими работами здесь

Мини-библиотека или мини-прокат
Добрый день! Ищу мини-библиотеку или мини-прокат в версии 8.2. Хочу разобрать её по частям и на основе её сделать нужную мне программу....

Анализ ценных бумаг (построить Гистограмму и провести анализ)
Здравствуйте! Помогите пожалуйста разобраться с заданием. Для исходных данных нужно определить влияние даты покупки ценной бумаги...

Анализ сетевого трафика используя регрессионный анализ
Не знал, куда написать, MatLAb очень близок этому инструменту (Weka) Многие в курсе, что из сетевого пакета можно достать 41 атрибут для...

анализ св-ва DataSource, анализ *.frm & *.frx
есть уже готовая прога, где связь с БД сделана через DAO и надо выяснить как таблица на форме связана с БД. Например - есть формочка с...

Мини ап PR
То, что есть глобальные изменения в отношении PR страниц, это и так понятно... Интересует вопрос такого характера: есть ли в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru