SW과정 머신러닝 1013(6)

JongseokLee·2021년 10월 12일
0
post-thumbnail

SW과정 머신러닝 1013(6)

1. Pandas 코드 정리 - 02

누락값 (NaN,NAN,nan)

from numpy import NaN,NAN,nan
NaN == True
NaN == False
NaN == ''
import pandas as pd
pd.isnull(NaN)
pd.isnull(NAN)
pd.isnull(nan)
pd.isnull('')
pd.notnull(NaN)
visited = pd.read_csv('./data/survey_visited.csv')
survey = pd.read_csv('./data/survey_survey.csv')
vs = visited.merge(survey, left_on='ident',right_on='taken')
vs

#범위를 지정하여 데이터를 추출할 때 누락값이 생기는 경우
gapminder = pd.read_csv('./data/gapminder.tsv', sep='\t')
gapminder.sample() #무작위로 하나만 추출
life_exp = gapminder.groupby(['year'])['lifeExp'].mean()
life_exp

life_exp.reindex([range(2000,2010),])

#누락값 개수 구하기
ebola = pd.read_csv('./data/country_timeseries.csv')
ebola.sample()
ebola.info()
ebola.isnull().sum() #카운트는 비어있지 않은 것만 표시, isnull().sum()은 비어있는 데이터만 표시

ebola.fillna(0,inplace=False).isnull().sum() #메서드체이닝 함수끼리 연결
ebola.fillna(method='ffill').head(10) #ffill 발생하기 전(앞) 데이터로 채워줌
ebola.fillna(method='bfill').head(10) #bfill 발생하기 후(뒤) 데이터로 채워줌
ebola.interpolate().head(10) #interpolate 양쪽의 값을 비교하여 평균값을 넣어줌

#누락값 삭제 dropna()
ebola.shape
ebola.dropna().shape #any 하나라도 NaN값이면 제거, all은 전체가 NaN일 때 제거
ebola.columns
ebola['Cases_multiple'] = ebola['Cases_Guinea']+ebola['Cases_Liberia']+ebola['Deaths_SierraLeone']
ebola.loc[:,['Cases_Guinea', 'Cases_Liberia', 'Cases_SierraLeone','Cases_multiple']].head(10)

ebola.Cases_Guinea.sum(skipna=True) #skipna 안넣어도 값 똑같음(nan 값을 빼고 계산해라)
ebola.Cases_Guinea.sum(skipna=False) #nan값을 스킵하지 않고(False하고) 계산해라 값은 항상 nan이 나옴

#melt()
pew = pd.read_csv('./data/pew.csv')
pew.head(2)
pd.melt(pew, id_vars='religion')
pd.melt(pew, id_vars='religion', var_name='income', value_name='count')
billboard = pd.read_csv('./data/billboard.csv')
billboard.head(2)
pd.melt(billboard, id_vars=['year', 'artist', 'track', 'time', 'date.entered'], var_name='week', value_name='rating')

#하나의 열이 여러 의미를 가지는 경우
ebola.head(2)
ebola_melt = ebola.melt()
ebola_melt.head(2)

ebola_melt = pd.melt(ebola,id_vars=['Date','Day'])
ebola_melt.head(2)
variable_split = ebola_melt.variable.str.split('_')
variable_split.tail(100)
variable_split[2]
variable_split.str.get(0)
ebola_melt['status'] = variable_split.str.get(0)
ebola_melt['country'] = variable_split.str.get(1)

#여러 열을 하나로 정리 melt, pivot_table
weather = pd.read_csv('./data/weather.csv')
weather.head(4)
weather.columns
weather_melt = pd.melt(weather, id_vars=['id', 'year', 'month', 'element'], var_name='day', value_name='temp')
weather_melt.sample(10)
weather_melt.pivot_table(index=['id','year','month','day'],
                        columns='element',
                         values='temp'
                        ).reset_index()
                        
weather_melt.pivot_table(index=['id','year','month','day'],
                        columns='element',
                         values='temp',
                         dropna=False
                        ).reset_index()
         
#중복 제거

billboard_melt = pd.melt(billboard, id_vars=['year','artist','track','time','date.entered'],var_name='week', value_name='rating')
billboard_melt.head(2)

billboard_melt[billboard_melt.track=='Loser']

billboard_songs = billboard_melt[['year','artist','track','time']]
billboard_songs.head(2)

billboard_songs = billboard_songs.drop_duplicates() #중복되는 것 제거
billboard_songs.head(2)

billboard_songs.reset_index(inplace=True)

billboard_songs.columns = ['id', 'year', 'artist', 'track', 'time']

billboard_ratings = billboard_melt.merge(billboard_songs, on=['year', 'artist', 'track', 'time']) #on은 양쪽에 똑같은 이름으로  필드가 있을 때 쓰임

#대용량 데이터
import os, urllib.request
with open('./data/raw_data_urls.txt','r') as data_urls:
    for line, url in enumerate(data_urls):
        #print(line)
        #print(url)
        if line == 5:
            break
        fn = url.split('/')[-1].strip()
        #print(fn)
        fp = os.path.join('','./data', fn)
        print(fp)
        urllib.request.urlretrieve(url,fp)
        
import glob

nyc_taxi_data = glob.glob('./data/fhv_*.csv')
nyc_taxi_data

taxi1 = pd.read_csv(nyc_taxi_data[0])
taxi2 = pd.read_csv(nyc_taxi_data[1])
taxi3 = pd.read_csv(nyc_taxi_data[2])
taxi4 = pd.read_csv(nyc_taxi_data[3])
taxi5 = pd.read_csv(nyc_taxi_data[4])

pd.concat([taxi1, taxi2, taxi3, taxi4, taxi5])

list_taxi_df = []
for filename in nyc_taxi_data:
    #print(filename)
    df = pd.read_csv(filename)
    list_taxi_df.append(df)
list_taxi_df

#자료형 변환
import seaborn as sns

tips = sns.load_dataset("tips")
tips.head()

tips.info()

tips['sex_str']=tips['sex'].astype(str)
tips.info()
tips['total_bill_str'] = tips['total_bill'].astype(str)
tips.info()
tips['total_bill_str']=tips['total_bill_str'].astype(float)
tips.info()
tips['total_bill_str']=tips['total_bill_str'].astype(int)
tips.info() #int64로 변환 안됨

import warnings
warnings.filterwarnings('ignore') #경고메세지 무시하는 코드

tips_sub_miss.loc[[1,2,5,7],'total_bill'] = 'missing'
tips_sub_miss.head()

tips_sub_miss['total_bill'].astype(float,errors='ignore') #missing이라는 문자가 있어서 float로 처리가 안되는데, 에러 함수를 넣어주면 처리 가능

pd.to_numeric(tips_sub_miss['total_bill'],errors='coerce',downcast='float') #downcast float64 -> float32

2. Pandas 문법

append vs concat

append는 라인 한줄만 연결가능(세로로만 결합이 가능)
concat은 여러개의 컬럼 연결 가능함(가로, 세로 모두 가능)

fillna()

결측값 채워주는 용도 fillna(?) 값을 nan(빈공간) 대신에 채워주는 것
fillna(, inplace=False)는 원본은 바꾸지말고 지금 결과값에만 출력을 해달라는 의미

id_var 그대로 유지 할 컬럼(variable = 변수, value = 값)

pivot_table

64bit/ 32bit 컴퓨터에서 한번에 읽어들이는 양

오브젝트는 문자열을 뜻함
카테고리는 범주안에서만 입력 가능

profile
DataEngineer Lee.

0개의 댓글