본문 바로가기

데이터 청년 캠퍼스(경남대학교)/스터디

2021 - 07 - 07

판다스 책 공부하기

정규화부터~

 

import pandas as pd
import numpy as np
df = pd.read_csv('auto-mpg.csv',header= None)

df.columns = ['mpg','cylinders','displacement','horsepower','weight',
             'acceleration','model year','origin','name']

df['horsepower'].replace('?',np.nan, inplace = True)
df.dropna(subset=['horsepower'],axis=0,inplace=True)
df['horsepower'] = df['horsepower'].astype('float')

print(df.horsepower.describe())

열 이름을 부여해주고,

horsepower열의 '?'를 nan값으로 바꿔주고 행 삭제,

데이터타입 float으로 변환

 

df.horsepower = df.horsepower/abs(df.horsepower.max())
print(df.horsepower.head())
print(df.horsepower.describe())

최대값으로 나눠서 정규화

horsepower의 최대값은 1이 됨

 

min_x = df.horsepower - df.horsepower.min() #최소값을 뺌
min_max = df.horsepower.max() - df.horsepower.min() #최대값과 최소값의 차
df.horsepower = min_x/min_max #최소값을 뺀 값을 최대최소의 차로 나누는 방법으로 정규화

print(df.horsepower.head())
df.horsepower.describe()

이 방법도 horsepower의 최대값은 1이 됨

 

정규화를 하는 이유는 다른 행에 비해 숫자가 커서 영향을 주는 비중?이 커지는 것을 방지하기 위함

그래서 정규화를 통해 일정하게 바꾸어주는 것! 최소 0 에서 최대 1로

 


시계열 데이터

 

import pandas as pd

df = pd.read_csv('stock-data.csv')

print(df.head())
print(df.info())
df['new_Date'] = pd.to_datetime(df['Date'])

print(df.head())

원래 Date열은 obiect타입인데 datetime을 사용해서 datetime타입으로 바꾸어줌

 

df.set_index('new_Date',inplace=True)
df.drop('Date',axis=1,inplace=True)

datetime으로 된 열을 인덱스 열로 바꿔주기

 


to_period()

dates = ['2019-01-01', '2020-03-01','2021-06-01']
ts_dates = pd.to_datetime(dates)
print(ts_dates)

dates 리스트를 datetime 타입으로 바꾸기

 

pr_day = ts_dates.to_period(freq = 'D')
print(pr_day)

pr_month = ts_dates.to_period(freq='M')
print(pr_month)

pr_year = ts_dates.to_period(freq='A')
print(pr_year)

일, 월, 년의 기간으로 리스트 생성

 


Timestamp

 

ts_ms = pd.date_range(start = '2019-01-01',
                     end = None,
                     periods = 6,
                     freq = 'MS',
                     tz = 'Asia/Seoul')

print(ts_ms)


ts_me = pd.date_range(start = '2019-01-01',
                     end = None,
                     periods = 6,
                     freq = 'M',
                     tz = 'Asia/Seoul')

print(ts_me)


ts_3m = pd.date_range(start = '2019-01-01',
                     end = None,
                     periods = 6,
                     freq = '3M',
                     tz = 'Asia/Seoul')

print(ts_3m)

MS는 월의 첫날부터 M은 월의 마지막날 3M은 3개월 건너뛰기?

 

pr_h = pd.period_range(start = '2019-01-01',
                      end = None,
                      periods = 3,
                      freq = 'H') #한 시간

print(pr_h)


pr_2h = pd.period_range(start = '2019-01-01',
                      end = None,
                      periods = 3,
                      freq = '2H') #두 시간

print(pr_2h)

 

H는 시간, 2H는 2시간을 건너뛰기

 


날짜 데이터 분리

 

df = pd.read_csv('stock-data.csv')

df['new_Date'] = pd.to_datetime(df['Date'])
print(df.head())
df['Year'] = df['new_Date'].dt.year
df['Month'] = df['new_Date'].dt.month
df['Day'] = df['new_Date'].dt.day

print(df.head())

new_date에서 년, 월, 일만 추출해서 새로운 열 만들기

 

df['Date_yr'] = df['new_Date'].dt.to_period(freq = 'A') #연도만
df['Date_m'] = df['new_Date'].dt.to_period(freq='M') #연도 + 월

df.head()
df.set_index('Date_m',inplace = True)

import pandas as pd
import numpy as np

df = pd.read_csv('stock-data.csv')

df['new_Date'] = pd.to_datetime(df['Date'])

df.set_index('new_Date',inplace=True)
#df.drop('Date',axis=1,inplace=True)
print(df.head())

df.index

다른 것을 하기 위해 데이터를 다시 불러오기

 

df_y = df.loc['2018']
print(df_y.head())

df_ym = df.loc['2018-07']
print(df_ym)

df_ym_cols = df.loc['2018-07','Start':'High']
print(df_ym_cols)

df_ymd = df.loc['2018-07-02']
print(df_ymd)

df_ymd_range = df['2018-06-25':'2018-06-20']
print(df_ymd_range)

행 슬라이싱

 

today = pd.to_datetime('2018-12-25')
df['time_delta'] = today - df.index
df.set_index('time_delta', inplace = True)
df_180 = df['180 days':'189 days']
print(df_180)

2018년 12월 25일을 기준으로 며칠의 간격이 있는지를 time_delta열에 저장하고 180일~189일의 행 출력하기

 


데이터프레임의 다양한 응용

 

import seaborn as sns

titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age','fare']]
df['ten'] = 10
df.head()

타이타닉 자료의 age와 fare열에 값이 10인 ten열 추가, 모든 값이 10

 

def add_10(n):
    return n+10

def add_two_obj(a, b):
    return a+b

print(add_10(10))
print(add_two_obj(10,10))

함수생성

 

sr1 = df['age'].apply(add_10)
print(sr1.head())

sr2 = df['age'].apply(add_two_obj, b = 10)
print(sr2.head())

sr3 = df['age'].apply(lambda x: add_10(x))
print(sr3.head())

apply함수로 값을 계산하는 3가지 방법

 

import seaborn as sns

titanic = sns.load_dataset('titanic')
df = titanic.loc[:,['age','fare']]
df.head()

데이터 재로드

 

df_map = df.applymap(add_10)
print(df_map.head())

apply함수는 시리즈(열)에 적용 applymap은 각각의 데이터에 적용하는 함수

 

def missing_value(series):
    return series.isnull()

result = df.apply(missing_value,axis = 0)
print(result.head())
def min_max(x):
    return x.max() - x.min()

result = df.apply(min_max)
print(result)
print(type(result))


df['ten'] = 10

df['add'] = df.apply(lambda x: add_two_obj(x['age'],x['ten']),axis=1)
print(df.head())

 

 

df = df.drop(['ten','add'], axis = 1)

ten과 add열 삭제

 

def missing_value(x):
    return x.isnull()

def missing_count(x):
    return missing_value(x).sum()

def total_number_missing(x):
    return missing_count(x).sum()

함수선언

 

result_df = df.pipe(missing_value)
result_df.head()

result_series = df.pipe(missing_count)
print(result_series)

result_value = df.pipe(total_number_missing)
print(result_value)

pipe() : 테이블 형태로 정리해주는 함수 어플리케이션, 함수를 연속적으로 호출해야하는 경우에 권장됨, 메서드를 연속적으로 사용할 수 있게 함

apply() : 행 혹은 열로 정리해주는 함수 어플리케이션

applymap() : 요소별 적용 함수

'데이터 청년 캠퍼스(경남대학교) > 스터디' 카테고리의 다른 글

2021-07-13  (0) 2021.07.14
2021-07-12  (0) 2021.07.12
2021-07-06  (0) 2021.07.06
2021-07-05  (0) 2021.07.05
2021-07-01  (0) 2021.07.02