vmtmxmf5 / -

0 stars 0 forks source link

Time Series 전처리 #2

Open vmtmxmf5 opened 3 years ago

vmtmxmf5 commented 3 years ago

시계열 2.1 뽀개기

https://deep-diver.github.io/practical-time-series-analysis-korean/

import pandas as pd
import numpy as np

year_joined = pd.read_csv('C:\\Users\\Park Jae Hoon\\Downloads\\BookRepo-master\\BookRepo-master\\Ch02\\data\\year_joined.csv')
emails = pd.read_csv('C:\\Users\\Park Jae Hoon\\Downloads\\BookRepo-master\\BookRepo-master\\Ch02\\data\\emails.csv')

사전관찰

user 중복 개수 검사

year_joined.groupby('user').count().groupby('userStats').count()

왜 user id 중복 검사를 해야하는가? 사전관찰을 피하기 위해서 해야 한다

id에 관한 시계열 데이터는 3가지 경우의 수가 존재한다.

첫째, 가입 당시의 데이터

둘째, 최근 가입상태를 나타내는 데이터

셋째, 특정 주기마다 관찰하는 데이터

문제가 되는 것은 둘째다. 최근 가입상태를 나타내는 데이터로 과거 데이터를 분석하게 되면 '사전관찰'효과가 나타나게 된다. 따라서 이를 방지하기 위해 id에 중복이 있는지 확인해야 한다. 중복이 존재한다면 최소한 둘째는 아니니까.

Null 데이터

null이 애초에 없는 데이터? null을 삭제한 데이터?

emails[emails.emailsOpened < 1]

null이 존재하지 않는다. 삭제한 걸까? 애초에 없는 걸까?

emails[emails.user == 998]

emails.dtypes
emails.week = pd.to_datetime(emails.week)

(max(emails[emails.user == 998].week) -
min(emails[emails.user == 998].week)).days/7

+1을 하면 998 유저의 주간 데이터 개수가 된다

emails[emails.user == 998].shape

현재 보유하고 있는 주간 데이터 개수와 차이를 구하면 null이 삭제된 것인지, 애초에 없는 것인지 알 수 있다

null 채워넣기

## 유니크한 모든 경우의 수
complete_idx = pd.MultiIndex.from_product((set(emails.week), set(emails.user)))

all_emails = emails.set_index(['week', 'user']).reindex(complete_idx, fill_value = 0).reset_index()

all_emails.columns = ['week', 'user', 'emailOpened']

null 값을 모두 채워넣었으나 한 가지 문제가 발생한다 가입하기 전단계 데이터를 삭제해야 한다

cutoff_dates = emails.groupby('user').week.agg(['min', 'max']).reset_index()

cutoff_dates = cutoff_dates.reset_index()
vmtmxmf5 commented 3 years ago

double groupby

특정 열의 그룹의 중복 개수를 세기 위함

eg = pd.DataFrame({'id': [0, 1, 2, 3, 4, 5, 6],
                   'status': ['br', 'si', 'si', 'br', 'br', 'pl', 'in'],
                   'year': [2016, 2017, 2016, 2018, 2019, 2020, 2019]})

eg.groupby('id').count().groupby('status').count()

두 번째 groupby는 사실상 status가 아니다

'id 중복 개수'를 의미한다

만약 인덱스가 1이라면 중복이 없다는 뜻, 3이면 3개 중복