드디어 장기적인 질문에 대한 답을 찾았어요. 넷플릭스에서 프로그램을 몇 번이나 봤는지.


나는 넷플릭스를 구독한 지 곧 10년이 된다.물론, 나는 내가 가장 좋아하는 시리즈와 영화가 있는데, 특히 자기 전에 자주 본다.이런 것들이 있어서 나는 많은 장면을 기억했다. 특히 친구, 브루클린 99와 현대 가정에서 온 장면들이다.나는 줄곧 내가 몇 번이나 프로그램을 보았는지 알고 싶었지만, 넷플릭스는 나에게 이 답을 주지 않았다.지금까지
며칠 전에 나는 Netlix에서 나의 조회 기록을 포함한 모든 데이터를 다운로드할 수 있다는 것을 발견했다.말 그대로 시청 히스토리는 시간, 세션 지속 시간, 콘텐츠 제목 등을 포함한 넷플릭스에서 시청한 모든 내용의 로그를 담고 있다.그래서 이것은 단지 데이터를 약간 조종하는 문제일 뿐이다. 나는 마침내 한 문제에 대답할 수 있게 되었다.

단도직입적인 답안


나의 첫 번째 방법은 매우 간단하다. Excel의 모든 지식을 사용하여 몇 가지 공식을 만들어서 시간을 필터하고 계산한다.몇 분 후에 나는 답을 얻었다. 놀랍게도 나는 이미 《노우기》를 거의 20번 보았다는 것을 발견했다.
나는 답을 얻었지만, 솔직히 Excel의 작은 칸이 얼마나 재미있습니까?나는 아직 할 수 있는 일이 많고, 그것을 아름답게 만들 수도 있다.파이톤을 작성하고 D3을 사용할 수 있는 절호의 기회이기도 하다. 이것은 내가 한동안 하고 싶었던 일이다.나는 D3의 필요성과 기회를 자주 느꼈지만 아직 익숙하지 않다.

tl;박사


자세한 내용을 읽지 않으려면 이 페이지example page로 이동하여 보고서 형식을 보십시오.또는 이것project GitHub page에 가면 갈라지거나 다운로드해서 자신의 데이터를 사용할 수 있습니다.

데이터


나는 절대로 데이터 분석이나 데이터 시각화 분야의 전문가가 아니다.그럼에도 불구하고 데이터 집합을 처리하는 첫 번째 단계는 그것을 이해하는 것이다. 이것이 바로 내가 한 일이다.넷플릭스가 귀하의 계정에서 제공한 정보 외에 귀하가 받을 모든 데이터를 포함하는 모든 문서가 표지에 있습니다.이렇게 하면 활성 CSV 파일의 모든 필드를 쉽게 볼 수 있습니다.다음은 it 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)

처리 데이터


내 파이썬 기술이 최고가 아니라고 말할 때가 된 것 같아. 그 외에 나는 정말 녹이 슬었어.내가 하고 있는 일을 할 수 있는 더 좋은 방법이 많을 수도 있으니 내가 문제를 어떻게 해결하는지에 중점을 두지 말고 이것이 올바른 방법이라고 생각하지 마라.어쨌든 계속합시다.
내 스크립트는 먼저 CSV 정보를 처리하고 내가 원하지 않는 데이터를 필터합니다. (이 예에서는 예고편과 특정한 유형의 동영상만 무시합니다.) 그리고 내가 원하는 특정한 정보와 내 계정에서 사용할 수 있는 프로필을 포함하는 그룹을 만듭니다.그 이후로 나는 그것을 두 조의 데이터, 영화와 시리즈로 나누었다.기본적으로 내가 해야 할 일은 모든 프로필에서 같은 항목에 나타난 모든 잔액을 정리하는 것이다.
이 점에서 나는 for 순환과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. 이것은'현대적이고 디자이너에게 친절한 파이톤 템플릿 언어로 Django를 모방한 템플릿'입니다.
jinja를 사용하려면 기본적으로 템플릿을 만들어야 합니다. 제 예에서는 HTML 파일로 특정한 정보를 포함해야 하는 곳에서 render 호출해서 바꾸거나 추가할 데이터를 전달할 수 있습니다.예를 들면 다음과 같습니다.
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))

탁자.


우선, 모든 데이터를 포함하는 간단한 표를 원합니다.이것은 내가 데이터를 더욱 잘 이해하고 내가 무엇을 잘못했는지, 특히 텔레비전 프로그램에서 정보를 추출하는 데 도움이 된다.금장사가 생기면 이것은 매우 쉽다.HTML 템플릿 파일에서 테이블을 만들고 Jinja의 태그를 추가했습니다.
<table id="watched-table" class="table table-striped table-bordered" style="width:100%">
    <thead>
        <tr>
            <th>Profile</th>
            <th>Movie</th>
            <th>Type</th>
            <th>Watched time (HH:MM:SS)</th>
        </tr>
    </thead>
    <tbody>
        {% for item in watched_table %}
        <tr>
            <td>{{item.profile}}</td>
            <td>{{item.title}}</td>
            <td>{{item.type}}</td>
            <td data-order="{{item.total_seconds}}">{{item.total_time}}</td>
        </tr>
        {% endfor %}
    </tbody>
</table>
Jinja는 하나의 그룹을 받아들여 필드에서 교체할 수 있습니다.내가 해야 할 일은 예상한 형식으로 대상을 만들고 (프로필, 제목, 유형, 총 초수, 총 시간 포함) 폭발하는 것이다.책상은 예상대로 건설되고 있다.

형상화


나는 다양한 차원의 정보(사용자, 영화/시리즈, 계절 등)를 볼 수 있는 시각화된 트리 그래프를 원한다.D3 페이지의 예시를 보면 Zoomable Sunburst가 좋은 선택이라고 생각합니다.나중에 나는 Zoomable Sunburst with Labels를 찾았는데 거의 완벽했다.
익숙하지 않은 사람들에 대해 D3.js는 HTML, SVG, CSS를 사용하여 데이터를 현실화하는 데 도움을 주는 자바스크립트 라이브러리입니다.이 예의 페이지는 매우 아름다운 가시화 효과가 있는데 이것은 사람을 어지럽게 하는 광경이다!
어쨌든, 나는 예시와 거의 같은 코드를 사용할 수 있다. 단지 탭과 제목의 일부 내용을 바꾸었을 뿐이다.여기서 가장 어려운 부분은 사실상 d3의 예상 형식으로 파일을 만드는 것이다.(자세히 소개하지는 않겠지만 GitHub의 스크립트에서 그것들을 찾을 수 있습니다.
나는 매우 놀랐다. 비록 많은 항목 (거의 40k) 이 있지만 D3는 여전히 짧은 시간 안에 SVG 이미지를 생성했다.그러나 그것의 사용은 가장 유창한 것이 아니라 매우 민감하다.
이렇게 해서 분석 페이지의 첫 번째 이정표를 완성했습니다. this page 에서 예를 보실 수 있습니다. (실제 데이터가 있습니다.)

미래의 일


업무 중에 나는 개선할 수 있는 많은 일들을 알아차렸다.주로 새로운 시각화 효과를 추가할 수 있고 일부 사용 가능한 데이터를 처리할 수 있지만 나는 아직 완성하지 못했다.

마지막 생각


넷플릭스의 데이터를 좀 더 심도 있고 복잡하게 분석해 공개하는 분들이 많다는 것을 알고 있다.그럼에도 불구하고 제 개인적인 목표가python 코드를 작성하고 다른 기술을 사용하는 것을 감안하면 이 프로젝트는 매우 성공적입니다.나는 이 데이터들에 대해 매우 흥미를 가지고, 내가 무엇을 보여주고 싶은지, 특히 어떻게 보여주고 싶은지 생각한다.
나는 이 방면에서 더 많은 일을 하고 시각화를 개선하며 스크립트의 사용을 더욱 쉽게 할 것을 고려할 것이다. (그것을 수첩으로 발표할 수도 있다.)제안이 있거나 스크립트를 실행할 때 문제가 있으면 에서 저를 찾을 수 있습니다.

좋은 웹페이지 즐겨찾기