이제 발렌타인이므로 라인의 토크 이력을 시각화 해 보겠습니까 w
자신의 컨트리뷰션
@torvalds 기여
좋은 느낌의 시계열 데이터가 있으면 비슷한 차트를 시험해보고 싶다고 전부터 생각하고 있었는데, 단지 라인의 데이터를 간단하게 다운로드 할 수 있다는 것을 알았으므로, 그 데이터를 사용해 만들어 보았습니다.
Line의 토크 이력 얻기
회선에서 대화 기록의 채팅 데이터를 저장할 수 있다는 것을 알고 계셨습니까? ?
실은 의외로 간단하게 할 수 있는 것입니다.
절차는 이 사이트을 참조합니다. 이미지의 소스도 그쪽입니다.
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)))
이상입니다! 메카브라든지 사용해 한층 더 깊이 파고 가는 것도 재미있을 것 같네요. 하지만 이미 지쳤기 때문에 오늘은 이상입니다.
Reference
이 문제에 관하여(이제 발렌타인이므로 라인의 토크 이력을 시각화 해 보겠습니까 w), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/AtomJamesScott/items/7a458a59e9dfd68acd8c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)