이제 발렌타인이므로 라인의 토크 이력을 시각화 해 보겠습니까 w

13993 단어 파이썬Line
발렌타인이기 때문이 아니었지만, 최근 Github에 있는 그 컨트리뷰션의 차트가 신경이 쓰였습니다.

자신의 컨트리뷰션


@torvalds 기여


좋은 느낌의 시계열 데이터가 있으면 비슷한 차트를 시험해보고 싶다고 전부터 생각하고 있었는데, 단지 라인의 데이터를 간단하게 다운로드 할 수 있다는 것을 알았으므로, 그 데이터를 사용해 만들어 보았습니다.



Line의 토크 이력 얻기



회선에서 대화 기록의 채팅 데이터를 저장할 수 있다는 것을 알고 계셨습니까? ?
실은 의외로 간단하게 할 수 있는 것입니다.

절차는 이 사이트을 참조합니다. 이미지의 소스도 그쪽입니다.
  • LINE 앱에서 저장할 토크를 탭합니다.
  • 오른쪽 상단의 V를 탭 > 설정을 탭합니다.

  • 대화 기록 보내기에서 보내기 옵션을 선택합니다. 여기에 토크 기록을 Keep에 저장합니다.
  • Keep에서 토크 기록에 액세스할 수 있습니다.

  • Calmap과 Pandas로 데이터를 즉시 시각화!



    먼저 다음 패키지를 가져 왔습니다.
    import datetime, calmap
    import japanize_matplotlib
    import pandas as pd
    
    from matplotlib import pyplot as plt
    from collections import defaultdict
    
    import warnings
    warnings.simplefilter("ignore")
    

    그런 다음 데이터를 수집하는 방법을 생각해 보겠습니다. 데이터 취득의 과정에 나온 이쪽의 화상의 우측에 텍스트 데이터가 있습니다만, 이러한 포맷으로 데이터를 읽어들인다고 가정합니다. (※ 내 휴대폰은 영어 설정이므로 조금만 포맷이 다르지만 거의 같습니다!)



    날짜만의 행이 있고, 그 아래에 시간, 사람, 채팅 내용이 하나의 행으로 되어 있네요(전화·스탬프·파일등도 귀찮기 때문에 채팅해 생각한다!). 여기에 초점을 맞추고 날짜 행이면 True를 반환하고 isNewDay()와 채팅 행이면 True를 반환하는 isChat() 함수를 만듭니다.


    날짜



    시간
    사람
    내용

    시간
    사람
    내용

    시간
    사람
    내용



    날짜



    시간
    사람
    내용

    시간
    사람
    내용

    def isNewDay(line):
        line = line.strip().replace(' ','')
        elements = line.split(',')
        if len(elements) == 2:
            day, date = elements
            try:
                assert day in ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] 
                assert datetime.datetime.strptime(date, '%m/%d/%Y')
                return True
            except (AssertionError, ValueError) as e:
                pass
        return False
    
    def isChat(line):
        elements = line.split('\t')
        if len(elements) == 3:
            time, person, activity = elements
            try:
                assert datetime.datetime.strptime(time, '%H:%M')
                assert person in [PERSON1, PERSON2]
                return True
            except (AssertionError, ValueError) as e:
                pass
        return False
    

    읽을 데이터의 텍스트 파일 형식이 약간 다르면 이러한 함수의 내용을 수정해야합니다.

    이 작업이 끝나면 루프는 날짜별로 채팅 횟수를 계산하는 것입니다. 내가 한 것처럼 defaultdict를 사용하여 다음과 같이 계산했습니다. 날짜순으로 채팅이 늘어서 있다고 가정하고 있기 때문에 상당히 거북한 느낌으로 쓰고 있습니다 (웃음.
    d = defaultdict(lambda: 0)
    with open(PATH_TO_DATA) as f:
        for line in f.readlines():
            # New day
            if isNewDay(line): 
                day, date = line.split(',') #
                month, day, year = list(map(int, date.split('/')))
    
            # Chat Event
            if isChat(line):            
                index = datetime.datetime(year, month, day)
                d[index] += 1
    

    채팅 횟수를 세면 이번에는 시각화됩니다. 이렇게하려면 calmap 패키지를 사용하십시오.
    사용법은 굉장히 간단하고, 기본적으로는 시계열상에 늘어서 있는 pandas의 Series를 치면 OK입니다.
    s = pd.Series(d)
    calmap.calendarplot(s, monthticks=3, cmap='PuRd', daylabels='月火水木金土日',
                        fig_kws=dict(figsize=(8, 4)))
    



    색이 얇다고 생각하면, 다음과 같이 가중치를 붙여서 강조시킬 수도 있습니다.
    import ipywidgets as widgets
    from ipywidgets import interact, interact_manual
    
    @interact
    def emph(x=(-0.5, 0.5, 0.1)):
        s = pd.Series(d)
        s *= s**x
        calmap.calendarplot(s, monthticks=3, cmap='PuRd', daylabels='月火水木金土日',
                        fig_kws=dict(figsize=(8, 4)))
    
    



    이상입니다! 메카브라든지 사용해 한층 더 깊이 파고 가는 것도 재미있을 것 같네요. 하지만 이미 지쳤기 때문에 오늘은 이상입니다.

    좋은 웹페이지 즐겨찾기