Я подпишусь на Netflix уже почти 10 лет. Конечно, у меня есть мои любимые серии и фильмы, которые я неоднократно наблюдаю, особенно перед сном. С этим я пришел запомнить много сцен, особенно от друзей, Brooklyn 99 и современной семьи. Я всегда задавался вопросом, сколько раз я смотрел шоу, но Netflix никогда не дал мне этот ответ. До настоящего времени.
Несколько дней назад я узнал, что можно было скачать все мои данные из Netlix , который включал мою историю просмотра. Как следует из названия, история просмотра имеет журналы для всех вещей, которые вы смотрите на Netflix со временем, продолжительностью сеанса, заголовок контента и многое другое. Итак, это было просто вопрос манипулирования данными мало, и я наконец-то имел ответ на вопрос, у меня на некоторое время.
Прямой (и скучный) ответ
Мой первый подход был довольно простым, используя все мои знания от Excel, создавая некоторые формулы для фильтрации и суммирования часов. Через несколько минут я получил свой ответ, и к моему удивлению, я узнал, что смотрел друзей почти в 20 раз!
Я получил свой ответ, но давайте быть искренним, сколько веселья – маленькая клетка на Excel? Было так много, я все еще мог сделать, а также сделать это красивым. Это была также отличная возможность написать немного питона и играть с D3 то, что я хотел сделать на некоторое время. Я часто чувствую необходимость и возможность использовать D3, но не знакомись с ним.
TL; DR;
Если вы не хотите читать детали, вы можете пойти прямо к этому Пример страницы , чтобы увидеть формат отчета. Или к этому Страница Github проекта Где вы можете вилочную/загрузку и использовать на своих собственных данных.
Данные
Я ни в коем случае не специалист по анализу данных или визуализации данных. Тем не менее, я знаю, что первый шаг в работе на наборе данных – это понять, и это то, что я сделал. Наряду с информацией Netflix дает доступную с вашей учетной записи, есть также табличный лист, который содержит всю документацию для всех данных, которые вы получите. Это сделало очень легко понять все поля в файле CSV активности просмотра. Вот решающая информация от нее w.r.t. этот проект:
Profile Name: the name of the profile in which viewing occurred Duration: the length of the viewing session Title: the TV show or movie viewed Supplemental Video Type: Videos other than a TV show or a movie (such as trailers)
Для моего анализа я хотел игнорировать все записи, где «Дополнительный тип видео» имел значение: различные видео, такие как прицепы, рекапитации и т. Д.
Название Регулировка и экстракция
От проверки данных я мог видеть, что смогу бы также сломать названия, чтобы восстановиться в случае телешоу, что было шоу, сезон и эпизод. Вот несколько примеров названий нескольких записей:
Brooklyn Nine-Nine: Season 6: The Honeypot (Episode 7) The IT Crowd: Series 3: Tramps Like Us (Episode 3) Chilling Adventures of Sabrina: Part 1: Chapter Eleven: A Midwinter's Tale (Episode 11) Skins: Vol. 2: Tony and Maxxie (Episode 1)
Как видите, хотя между именами сезонов существует не так много согласованности, с одним регулярным выражением, я мог бы захватить название серии, сезон, а также имя эпизода. Это может потерпеть неудачу для некоторых языков/шоу, но оно работало довольно хорошо в моих данных как эвристика. Мне пришлось добавить несколько переводов, потому что у моих данных были записи как на английском, так и в бразильском португальском. Regexp выглядит как:
r'(.*): (Season|Part|Vol\.|Series|Chapter|Temporada|Parte|Universo|Capítulo) ([ a-zA-Záéíê\d]*( Remix)*): (.*)'
Продолжительность
Чтобы облегчить мою жизнь, я решил преобразовать все продолжительность в формате « HH: MM: SS
», до единых целых секунд. Это позволяет мне суммировать все длительности, не заботясь об формате. Позже в потоке я мог просто преобразовать от секунды до более удобного пользователя.
# 0:01:05 -> 65 def durationTimeToSeconds(duration): try: [hour, minutes, seconds] = duration.split(':') return int(hour)*3600 + int(minutes)*60 + int(seconds) except: return 0 # 65 -> 00:01::05 def secondsToDurantion(seconds): hours = math.floor(seconds/3600) remainingSeconds = seconds - (hours*3600) minutes = math.floor(remainingSeconds/60) remainingSeconds = remainingSeconds - (minutes*60) return '{:02d}:{:02d}:{:02d}'.format(hours, minutes, remainingSeconds)
Обработка данных
Я думаю, что сейчас самое хорошее время, чтобы сказать, что мои навыки Python не являются лучшими, и на это, я действительно ржавый. Там, возможно, много лучших способов делать то, что я делаю, так что не сосредоточиться на том, как я решаю проблему, и не принимайте это как правильный путь. Во всяком случае, давайте продолжим.
Мой скрипт начинается с обработки информации CSV, фильтруя данные, которые я не хочу (в этом случае, только игнорируйте прицепы и конкретные виды видео), и создавая массив с конкретной информацией, которую я хочу, а также доступные профили в моем счету. Из этого я сломаю его на два набора данных, фильмов и серии. В основном, что я делаю, это подводят сумму баланса для всех вхождений одинаковой записи в каждом профиле.
Ну, на данный момент я делаю много для петлей и множество IFS, а в конце концов, у меня есть данные в формате:
# for movies { 'profile 1': { 'movie 1' : 3974, 'movie 2' : 3412, 'movie 3' : 3974 }, 'profile 2': { 'movie 1' : 3974, 'movie 4' : 3780, 'movie 5' : 2629 } } # for tv-shows { 'profile 1': { "serie 1": { 'season 1': { 'episode 1': 241, 'episode 2': 3552 }, 'season 2': { 'episode 1': 241, 'episode 2': 3552, 'episode 3': 3512 } } } }
Просмотр данных
Моя цель состояла в том, чтобы создать HTML-страницу, где я мог видеть данные и взаимодействовать с различными типами визуализации. Но я не хотел писать струны в Python, который позже будет записан в файл. По моему опыту это может сделать скрипт довольно большим и запутанным, поэтому я решил использовать Jinja , «Современный и дизайнерский язык шаблонов для Python, смоделированный после шаблонов Джанго».
Для использования Jinja вы в основном создаете шаблон, который в моем случае является HTML-файлом, и, в местах, которые вы хотите включить конкретную информацию, вы звоните оказывать
Передача данных для замены/добавления. Что-то вроде:
loader = jinja2.FileSystemLoader('template.html') env = jinja2.Environment(loader=loader) with open('output.html', 'w') as output: output.write(env.get_template('').render(variableToReplace=values))
Стол
Чтобы начать, я хотел простую таблицу со всеми данными. Это помогло мне лучше понять данные, посмотрим, что я делаю не так, особенно вокруг извлечения информации с телешоу. С Jinja это было довольно легко. В моем файле шаблона HTML я создал таблицу и добавил теги Jinja:
Profile | Movie | Type | Watched time (HH:MM:SS) |
---|---|---|---|
{{item.profile}} | {{item.title}} | {{item.type}} | {{item.total_time}} |
Jinja принимает массив и способен выполнять итерацию на полях. Все, что мне нужно было сделать, это создать объект в формате Ожидаемый (с профилем, заголовка, тип, Total_seconds и Total_time) и Boom! Стол был построен как ожидалось.
Визуализация
Я хотел что-то вроде Cureemap для визуализации, позволяя мне увидеть информацию на разных уровнях (пользователь, фильмы/серии, сезон и т. Д.). Проверка примеров на странице D3, я думал, что Осветимый Sunburst был отличный вариант. Позже я пришел, чтобы найти Осветимый Sunburst с этикетками , что было почти идеально.
Для тех, которые не знакомы, D3.js – это библиотека JavaScript для манипулирования документами на основе данных, помогая вам приносить данные в жизнь, используя HTML, SVG и CSS. Страница примера имеет много красивых визуализаций, и это зрение для больных глаз!
Во всяком случае, я смог использовать в значительной степени тот же код, что и в примере, только изменение нескольких вещей на этикетках и названиях. Самая сложная часть здесь фактически генерировала файл в ожидаемом формате для D3. (Я не буду в подробности, но вы можете найти их в сценарии на Github ).
Я был поражен тем, что даже у меня было довольно много записей (почти 40 тысяч), D3 сгенерировал изображение SVG в небольшом времени. Использование, однако, не самый гладкий, довольно отзывчивый.
С этим я закончил свой первый этап для страницы анализа, и вы можете увидеть пример (с реальными данными) в Эта страница Отказ
Будущая работа
Во время работы я заметил, что многое можно улучшить. В основном новые визуализации могут быть добавлены, борьба с частями доступных данных, но я еще не работал.
Последние мысли
Я знаю, что многие люди сделали гораздо более глубоко и гораздо более сложный анализ данных Netflix данных и сделали, что доступно. Тем не менее, учитывая мою личную цель писать несколько линий Python и работать с некоторыми разными технологиями, этот проект был большим успехом. Мне было очень весело с данными, думая о том, что я хотел показать, и особенно как.
Я рассмотрю работать над этим немного больше, улучшая визуализацию и облегчая использование сценария (возможно, опубликовать его как ноутбук?). Если у вас есть какие-либо предложения или возникли проблемы с скриптом, вы можете найти меня на Twitter Отказ
Оригинал: “https://dev.to/thamara/finally-got-an-answer-to-a-long-lasting-question-how-many-times-i-watched-a-show-on-netflix-1i6e”