반응형
데이터과학에서 python을 도구로 사용할 시 pandas, numpy 등의 라이브러리를 떨어질 수 없는 관계이다. 해당 연습을 위해 DataMinim 님의 데이터를 활용하여 연습하고, 결과를 공유하려 한다.
데이터 다운받기
사용하는 데이터는 DataMinim 님이 정제해둔 데이터이다. 아래와 같이 다운로드 한다.
import pandas as pd
channel =pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/youtube/channelInfo.csv')
video =pd.read_csv('https://raw.githubusercontent.com/Datamanim/datarepo/main/youtube/videoInfo.csv')
display(channel.head())
display(video.head())
문제1. 각 데이터의 ‘ct’컬럼을 시간으로 인식할수 있게 datatype을 변경하고 video 데이터의 videoname의 각 value 마다 몇개의 데이터씩 가지고 있는지 확인하라.
답안
더보기
# 1) ct 컬럼을 datetime 객체로 변환
channel.ct = pd.to_datetime(channel.ct)
video.ct = pd.to_datetime(video.ct)
# 2) video 데이터의 videoname의
# 각 value 마다 몇개의 데이터씩 가지고 있는지 확인하라
video.videoname.value_counts()
문제 2. 수집된 각 video의 가장 최신화 된 날짜의 viewcount값을 출력하라
답안
더보기
remove_video = video.sort_values(['videoname', 'ct']).drop_duplicates('videoname', keep = 'last')
remove_video_sub = remove_video[["viewcnt", "videoname", "ct"]]
remove_video_sub.reset_index(drop=True)
문제 3. Channel 데이터중 2021-10-03일 이후 각 채널의 처음 기록 됐던 구독자 수(subcnt)를 출력하라
답안
더보기
channel_sub = channel[channel.ct >= pd.to_datetime('2021-10-03')]
channel_sub.head(2)
drop_channel_sub = channel_sub.sort_values(['channelname','ct']).drop_duplicates('channelname')
drop_channel_sub[["channelname", "subcnt"]].reset_index(drop=True)
문제 4. 각채널의 2021-10-03 03:00:00 ~ 2021-11-01 15:00:00 까지 구독자수 (subcnt) 의 증가량을 구하여라
답안
더보기
start_channel = channel.loc[channel.ct.dt.strftime('%Y-%m-%d %H') == '2021-10-03 03']
end_channel = channel.loc[channel.ct.dt.strftime('%Y-%m-%d %H') == '2021-11-01 15']
start_df = start_channel[["channelname", "subcnt"]].reset_index(drop=True)
end_df = end_channel[["channelname", "subcnt"]].reset_index(drop=True)
df_merge = pd.merge(left = start_df, right = end_df, left_on = 'channelname', right_on = 'channelname')
df_merge['diff'] = df_merge.subcnt_y - df_merge.subcnt_x
df_merge[["channelname", "diff"]]
문제 5. 각 비디오는 10분 간격으로 구독자수, 좋아요, 싫어요수, 댓글수가 수집된것으로 알려졌다. 공범 EP1의 비디오정보 데이터중 수집간격이 5분 이하, 20분이상인 데이터 구간( 해당 시점 전,후) 의 시각을 모두 출력하라
답안
video_ep1 = video[video.videoname == " 공범 EP1"]
video_ep1 = video_ep1.sort_values('ct').reset_index(drop=True)
# diff(1)는 해당 행과 1만큼 차이 나는 행과의 차이를 의미한다.
cond1 = (video_ep1.ct.diff(1) >= datetime.timedelta(minutes=20))
cond2 = (video_ep1.ct.diff(1) <= datetime.timedelta(minutes=5))
# 해당 조건 수행 시 721, 722, 1636 행을 찾을 수 있다.
video_ep1 = video_ep1[(cond1) | (cond2)]
# 찾은 행의 전후까지 포함하여 출력한다.
video.iloc[[720, 721, 722, 723, 1635, 1636, 1637], :]
문제 6. 각 에피소드의 시작날짜(년-월-일)를 에피소드 이름과 묶어 데이터 프레임으로 만들고 출력하라
답안
# video에서 videoname 기준으로 ct 값 중 가장 오래된 날짜을 제외한 모든 데이터 제거
video_sub = video.sort_values(['videoname', 'ct']).drop_duplicates('videoname')
video_sub = video_sub[["videoname", "ct"]]
video_sub.ct = video_sub.ct.dt.date
# 컬럼 rename
video_sub.rename(columns={"ct":"date"})
문제 7. “공범” 컨텐츠의 경우 19:00시에 공개 되는것으로 알려져있다. 공개된 날의 21시의 viewcnt, ct, videoname 으로 구성된 데이터 프레임을 viewcnt를 내림차순으로 정렬하여 출력하라
답안
더보기
video_df = video.copy()
# 공개된 날 21시의 데이터만 추출
df_sub = video_df[(video_df.ct.dt.hour == 21)] \
.sort_values(['videoname', 'ct']) \
.drop_duplicates('videoname')
# 추출한 데이터에서 viewcnt 기준으로 내림차순 정렬
df_sub = df_sub.sort_values('viewcnt', ascending = False)
# 정렬한 데이터에서 viewcnt, ct, videoname만 추출하여 출력
df_sub[["viewcnt", "ct", "videoname"]].reset_index(drop=True)
반응형
'AI > Data Science' 카테고리의 다른 글
[Data Science] 서울시 따릉이 이용정보 데이터 (0) | 2023.02.07 |
---|---|
[Data Science] 월드컵 출전선수 골기록 데이터 (0) | 2023.02.07 |
[Data Science] 유튜브 인기 동영상 분석하기 (0) | 2023.01.17 |
[데이터 과학] 확률분포 (이산형, 연속형) (0) | 2023.01.17 |
[데이터 과학] 베이즈 정리 (2) | 2022.12.26 |