๋ฐ์ดํฐ ์ฌ์ด์ธ์ค 100๋ฒ์ ๋ ธํฌ(๊ตฌ์กฐํ ๋ฐ์ดํฐ ์ฒ๋ฆฌํธ)- Python Part 5 (Q81 to Q100)์ ํด์ค์ ๋๋ค.
ย
ย
์ฒ์์
- ๋จผ์ ๋ค์ ์ ์ ์คํํฉ๋๋ค.
- ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค(PostgreSQL).
- ์ฌ์ฉํ ๊ฒ์ผ๋ก ์์๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ ์ ์์ ๊ฐ์ ธ์ต๋๋ค.
- ์ฌ์ฉํ๋ ค๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ install.packages()๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ํ๊ฒ ์ค์นํฉ๋๋ค.
- ์ด๋ฆ, ์ฃผ์ ๋ฑ์ ๋๋ฏธ ๋ฐ์ดํฐ์ด๋ฉฐ ์ค์ ๋ฐ์ดํฐ๊ฐ ์๋๋๋ค.
ย
import os
import pandas as pd
import numpy as np
from datetime import datetime, date
from dateutil.relativedelta import relativedelta
import math
import psycopg2
from sqlalchemy import create_engine
from sklearn import preprocessing
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.model_selection import TimeSeriesSplit
from imblearn.under_sampling import RandomUnderSampler
if 'PG_PORT' in os.environ:
pgconfig = {
'host': 'db',
'port': os.environ['PG_PORT'],
'database': os.environ['PG_DATABASE'],
'user': os.environ['PG_USER'],
'password': os.environ['PG_PASSWORD'],
}
# pd.read_sql์ฉ ์ปค๋ฅํฐ
conn = psycopg2.connect(**pgconfig)
df_customer = pd.read_sql(sql='select * from customer', con=conn)
df_category = pd.read_sql(sql='select * from category', con=conn)
df_product = pd.read_sql(sql='select * from product', con=conn)
df_receipt = pd.read_sql(sql='select * from receipt', con=conn)
df_store = pd.read_sql(sql='select * from store', con=conn)
df_geocode = pd.read_sql(sql='select * from geocode', con=conn)
else:
if not os.path.exists('../data/'):
!git clone https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess
os.chdir('100knocks-preprocess/docker/work/answer')
dtype = {
'customer_id': str,
'gender_cd': str,
'postal_cd': str,
'application_store_cd': str,
'status_cd': str,
'category_major_cd': str,
'category_medium_cd': str,
'category_small_cd': str,
'product_cd': str,
'store_cd': str,
'prefecture_cd': str,
'tel_no': str,
'postal_cd': str,
'street': str
}
df_customer = pd.read_csv("../data/customer.csv", dtype=dtype)
df_category = pd.read_csv("../data/category.csv", dtype=dtype)
df_product = pd.read_csv("../data/product.csv", dtype=dtype)
df_receipt = pd.read_csv("../data/receipt.csv", dtype=dtype)
df_store = pd.read_csv("../data/store.csv", dtype=dtype)
df_geocode = pd.read_csv("../data/geocode.csv", dtype=dtype)
์ฐ์ต๋ฌธ์
P-081: ๋จ๊ฐ(unit_price)์ ์๊ฐ(unit_cost)์ ๊ฒฐ์๊ฐ์ ๋ํด ๊ฐ๊ฐ์ ํ๊ท ๊ฐ์ผ๋ก ๋ณด์ํ ์๋ก์ด ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์์ค. ๋จ, ํ๊ท ๊ฐ์ 1์ ๋ฏธ๋ง์ ๋ฐ์ฌ๋ฆผํ๋ค(๋ฐ์ฌ๋ฆผ ๋๋ ์ง์๋ก ๋ฐ์ฌ๋ฆผํด๋ ๋ฌด๋ฐฉํ๋ค). ๋ณด์ ์ค์ ํ ๊ฐ ํญ๋ชฉ์ ๋ํด ๊ฒฐ์์ด ๋ฐ์ํ์ง ์์๋์ง๋ ํ์ธํด์ผ ํ๋ค.
# ์ฝ๋ ์์ 1 (Pandas์ fillna)
df_product_2 = df_product.fillna({
'unit_price':np.round(np.nanmean(df_product['unit_price'])),
'unit_cost':np.round(np.nanmean(df_product['unit_cost']))})
df_product_2.isnull().sum()
product_cd 0 category_major_cd 0 category_medium_cd 0 category_small_cd 0 unit_price 0 unit_cost 0 dtype: int64
ํด์ค:
์ด ์ฝ๋๋ df_product๋ผ๋ pandas DataFrame์ ๋ํด ๋ ๊ฐ์ง ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
fillna() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ unit_price์ unit_cost ์ด์ ๋๋ฝ๋ ๊ฐ์ ๊ฐ ์ด์ ๋ฐ์ฌ๋ฆผ๋ ํ๊ท ๊ฐ์ผ๋ก ์ฑ์ด๋ค. ๋ฐ์ฌ๋ฆผ๋ ํ๊ท ๊ฐ์ NumPy ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ np.round() ๋ฐ np.nanmean() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋๋ฉฐ, fillna() ๋ฉ์๋๋ ์ฌ์ ์ ์ธ์๋ก ๋ฐ๊ณ , ํค๋ ์ด ์ด๋ฆ, ๊ฐ์ ๋๋ฝ๋ ๊ฐ์ ์ฑ์ฐ๊ธฐ ์ํ ๊ฐ์ด๋ค.
๊ทธ๋ฆฌ๊ณ isnull() ๋ฉ์๋๋ก DataFrame์ ๋๋ฝ๋ ๊ฐ์ด ๋จ์ ์๋์ง ํ์ธํ๊ณ , sum() ๋ฉ์๋๋ก ๊ฐ ์ด์ ๋๋ฝ๋ ๊ฐ์ ๊ฐ์๋ฅผ ํฉ์ฐํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ ๋ฐ์ดํธ๋ DataFrame df_product_2์ ๊ฐ ์ด์ ๊ฒฐ์๊ฐ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ๋ฐ์ดํธ๋ DataFrame df_product_2๋ unit_price์ unit_cost ์ด์ ๊ฒฐ์๊ฐ์ด ๊ฐ๊ฐ ๋ฐ์ฌ๋ฆผ๋ ํ๊ท ๊ฐ์ผ๋ก ๋์ฒด๋์์ผ๋ฉฐ, ๋ ๋ฒ์งธ ์ค์ ์ถ๋ ฅ์ fillna ์์ ํ DataFrame์ ์ผ๋ง๋ ๋ง์ ๊ฒฐ์๊ฐ์ด ๋จ์๋์ง ๋ณด์ฌ์ค๋ค.
# ์ฝ๋ ์์ 2 (scikit-learn์ SimpleImputer)
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
imp_values = imp_mean.fit_transform(df_product[['unit_price', 'unit_cost']])
df_product_2 = df_product.copy()
df_product_2[['unit_price', 'unit_cost']] = imp_values.round()
df_product_2.isnull().sum()
product_cd 0 category_major_cd 0 category_medium_cd 0 category_small_cd 0 unit_price 0 unit_cost 0 dtype: int64
ํด์ค:
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํฉ๋๋ค.
sklearn.impute ๋ชจ๋์์ SimpleImputer ํด๋์ค๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ, SimpleImputer ํด๋์ค๋ ๋ฐ์ดํฐ ์ธํธ์ ๊ฒฐ์๊ฐ์ ์ ๋ ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
imp_mean์ด๋ผ๋ SimpleImputer ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ด ์ปดํจํฐ๋ ๊ฒฐ์๊ฐ(์ด ๊ฒฝ์ฐ np.nan์ผ๋ก ํํ๋จ)์ ํด๋น ์ด์ ํ๊ท ๊ฐ์ผ๋ก ๋์ฒดํ๊ฒ ๋๋ค. ์ธํํ ์ด์ ์ ์ ๋ต์ 'mean'๋ก ์ค์ ๋์ด ์๋ค.
fit_transform() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ df_product DataFrame์ unit_price ์ด๊ณผ unit_cost ์ด์ SimpleImputer ๊ฐ์ฒด๋ฅผ ์ ์ฉํ์ฌ ๊ฒฐ์๊ฐ์ด ์ ๋ ฅ๋ ๋ณํ ํ DataFrame์ ๋ฐํํฉ๋๋ค.
copy() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ df_product_2๋ผ๋ ์๋ณธ df_product DataFrame์ ๋ณต์ฌ๋ณธ์ ์์ฑํ๋ค.
df_product_2์ unit_price์ unit_cost ์ด์ imp_values.round()๋ฅผ ํตํด ์ ๋ ฅํ ๊ฐ์ผ๋ก ๋์ฒดํ๋ค. round() ๋ฉ์๋๋ ์ ๋ ฅ๋ ๊ฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๋ก ๋ฐ์ฌ๋ฆผํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
isnull() ๋ฉ์๋๋ก DataFrame์ ๋๋ฝ๋ ๊ฐ์ด ๋จ์ ์๋์ง ํ์ธํ๊ณ , sum() ๋ฉ์๋๋ก ๊ฐ ์ด์ ๋๋ฝ๋ ๊ฐ์ ๊ฐ์๋ฅผ ์ง๊ณํ๋ค. ๊ทธ ๊ฒฐ๊ณผ ์ ๋ฐ์ดํธ๋ DataFrame df_product_2์ ๊ฐ ์ด์ ๊ฒฐ์๊ฐ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ด ์ฝ๋์ ์ต์ข ์ถ๋ ฅ์ ๊ฐ ์ด์ ํ๊ท ๊ฐ์ผ๋ก ๊ฒฐ์๊ฐ์ ์๋ฒ ๋ํ ํ ์ ๋ฐ์ดํธ๋ df_product_2 DataFrame์ ๊ฒฐ์๊ฐ ์๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ด ๋ฐฉ๋ฒ์ ํนํ ๊ฒฐ์๊ฐ ์๊ฐ ์ ์ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ์งํฉ์ ๊ฒฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ์ฉํ๋ค.
ย
P-082: ๋จ๊ฐ(unit_price)์ ์๊ฐ(unit_cost)์ ๊ฒฐ์๊ฐ์ ๋ํด ๊ฐ๊ฐ์ ์ค์๊ฐ์ผ๋ก ๋ณด์ํ ์๋ก์ด ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ์์ค. ๋จ, ์ค์๊ฐ์ 1์ ๋ฏธ๋ง์ ๋ฐ์ฌ๋ฆผํ๋ค(๋ฐ์ฌ๋ฆผ ๋๋ ์ง์๋ก ๋ฐ์ฌ๋ฆผํด๋ ๋ฌด๋ฐฉํ๋ค). ๋ณด์ ์ค์ ํ ๊ฐ ํญ๋ชฉ์ ๋ํด ๊ฒฐ์์ด ๋ฐ์ํ์ง ์์๋์ง๋ ํ์ธํด์ผ ํ๋ค.
# ์ฝ๋ ์์ 1 (Pandas์ fillna)
df_product_3 = df_product.fillna({
'unit_price':np.round(np.nanmedian(df_product['unit_price'])),
'unit_cost':np.round(np.nanmedian(df_product['unit_cost']))})
df_product_3.isnull().sum()
product_cd 0 category_major_cd 0 category_medium_cd 0 category_small_cd 0 unit_price 0 unit_cost 0 dtype: int64
ํด์ค:
์ด ์ฝ๋์์๋ ๋จผ์ "df_product"๋ผ๋ DataFrame์ "unit_price"์ "unit_cost"๋ผ๋ ๋ ์ด์ ๋๋ฝ๋ ๊ฐ์ ์ฑ์ฐ๊ณ ์์ต๋๋ค. ์ด ์ฝ๋์์๋ ๋ค์๊ณผ ๊ฐ์ ์ธ์๋ฅผ ๊ฐ์ง fillna ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ์๊ฐ์ ์ฑ์ฐ๊ณ ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ "unit_price"์ "unit_cost"๋ผ๋ ๋ ๊ฐ์ ํค๋ฅผ ๊ฐ์ง ๋์ ๋๋ฆฌ์ด๋ฉฐ, ๊ฐ๊ฐ ํด๋น ๊ฐ์ ๋งคํ๋์ด ์์ต๋๋ค. ์ด ๊ฐ๋ค์ DataFrame์ ๊ฐ ์ด์ ์ ์ฉ๋๋ NumPy ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ nanmedian ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋๋ฉฐ, nanmedian์ NaN์ผ๋ก ํํ๋๋ ๊ฒฐ์๊ฐ์ ๋ฌด์ํ๊ณ ์ด์ ์ค์๊ฐ์ ๊ณ์ฐํ๋ค.
์ด ์ฝ๋์์ ๋ ๋ฒ์งธ ์ธ์๋ ์๋ต๋์ด DataFrame์ ๋ค๋ฅธ ์ด์ ๊ฒฐ์๊ฐ์ ๊ทธ๋๋ก ๋จ๊ฒ ๋๋ค.
์ด ์์ ์ ๊ฒฐ๊ณผ๋ "df_product_3"์ด๋ผ๋ ์๋ก์ด DataFrame์ด ๋๋ค.
๋ค์ ์ฝ๋์์๋ isnull() ๋ฉ์๋์ sum() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ "df_product_3"์ DataFrame์ ์ฌ์ ํ ๊ฒฐ์๋ ๊ฐ์ด ์๋์ง ํ์ธํฉ๋๋ค. ์ด ๋ฉ์๋๋ DataFrame์ ๊ฐ ์ด์ ๋๋ฝ๋ ๊ฐ์ ๊ฐ์๋ฅผ ํฌํจํ๋ Series ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ๋ ์ด์ ๋ชจ๋ ๊ฒฐ์๊ฐ์ด ์๋ค๊ณ ์ถ๋ ฅ๋๋ฉด fillna์ ์กฐ์์ด ์ฑ๊ณตํ์์ ํ์ธํ ์ ์์ต๋๋ค.
# ์ฝ๋ ์์ 2 (scikit-learn์ SimpleImputer)
imp_mean = SimpleImputer(missing_values=np.nan, strategy='median')
imp_values = imp_mean.fit_transform(df_product[['unit_price', 'unit_cost']])
df_product_3 = df_product.copy()
df_product_3[['unit_price', 'unit_cost']] = imp_values.round()
df_product_3.isnull().sum()
product_cd 0 category_major_cd 0 category_medium_cd 0 category_small_cd 0 unit_price 0 unit_cost 0 dtype: int64
ํด์ค:
์ด ์ฝ๋๋ scikit-learn์ SimpleImputer๋ฅผ ์ฌ์ฉํ์ฌ DataFrame "df_product"์ "unit_price"์ "unit_cost" ์ด์ ๊ฒฐ์๊ฐ์ ๋ํ ์ธํ์ ์ํํ๋ค.
์ฝ๋์ ์ฒซ ๋ฒ์งธ ์ค์ "imp_mean"์ด๋ผ๋ ์ด๋ฆ์ SimpleImputer ์ธ์คํด์ค๋ฅผ ์ด๊ธฐํํ๊ณ ์๋ค. ์ด ํด๋์ค๋ ์ฃผ์ด์ง ์ ๋ต์ผ๋ก ๊ฒฐ์๊ฐ์ ์ ๋ ฅํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ, ์ด ๊ฒฝ์ฐ ๊ฒฐ์๋์ง ์์ ๊ฐ์ ์ค๊ฐ๊ฐ์ด๋ฉฐ, missing_values ์ธ์๋ ๊ฒฐ์์ผ๋ก ๊ฐ์ฃผํ ๊ฐ์ ์ง์ ํ๋ฉฐ, ์ด ๊ฒฝ์ฐ NaN์ด ๋๋ค.
์ฝ๋์ ๋ ๋ฒ์งธ ์ค์ "df_product" DataFrame์ "unit_price"์ "unit_cost" ์ด์ ๊ฒฐ์๊ฐ์ ์ ๋ ฅํ๊ธฐ ์ํด "imp_mean" ๊ฐ์ฒด์ fit_transform ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ฉ์๋๋ ์ ๋ ฅ๋ ๊ฐ์ ํฌํจํ๋ "imp_values"๋ผ๋ ์ด๋ฆ์ NumPy ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
์ฝ๋์ ์ธ ๋ฒ์งธ ์ค์ "df_product" DataFrame์ ์ฌ๋ณธ์ "df_product_3"์ด๋ผ๋ ์ด๋ฆ์ผ๋ก ์์ฑํ๊ณ ์๋ค. ์ด๋ ์๋ณธ DataFrame์ ๋ณ๊ฒฝํ์ง ์๊ธฐ ์ํจ์ ๋๋ค.
์ฝ๋์ ๋ค ๋ฒ์งธ ์ค์ "df_product_3" DataFrame์ "unit_price"์ "unit_cost" ์ปฌ๋ผ์ imp_values ๋ฐฐ์ด์ ๋ํ round() ๋ฉ์๋๊ฐ ํธ์ถ๋์ด ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๋ก ๊ฐ์ ๋ฐ์ฌ๋ฆผํ๊ณ ์์ต๋๋ค.
์ฝ๋์ ๋ง์ง๋ง ์ค์ isnull() ๋ฉ์๋์ sum() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ 'df_product_3' DataFrame์ ์ฌ์ ํ ๋๋ฝ๋ ๊ฐ์ด ์๋์ง ํ์ธํ๋ค. ์ถ๋ ฅ์ ๋ ์ด ๋ชจ๋ ๋๋ฝ๋ ๊ฐ์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋๋ฉด, ์ธํ ์ฐ์ฐ์ด ์ฑ๊ณตํ์์ ํ์ธํ ์ ์๋ค.
P-083: ๋จ๊ฐ(unit_price)์ ์๊ฐ(unit_cost)์ ๊ฒฐ์๊ฐ์ ๋ํด ๊ฐ ์ํ์ ์นดํ ๊ณ ๋ฆฌ ์๋ถ๋ฅ ์ฝ๋(category_small_cd)๋ณ๋ก ์ฐ์ถํ ์ค๊ฐ๊ฐ์ผ๋ก ๋ณด์ํ ์๋ก์ด ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค. ๋จ, ์ค์๊ฐ์ 1์ ๋ฏธ๋ง์ ๋ฐ์ฌ๋ฆผํ๋ค(๋ฐ์ฌ๋ฆผ ๋๋ ์ง์๋ก ๋ฐ์ฌ๋ฆผํด๋ ๋ฌด๋ฐฉํ๋ค). ๋ณด์ ์ค์ ํ ๊ฐ ํญ๋ชฉ์ ๋ํด ๊ฒฐ์์ด ๋ฐ์ํ์ง ์์๋์ง๋ ํ์ธํด์ผ ํ๋ค.
# ์ฝ๋ ์์ 1
df_tmp = (df_product.groupby('category_small_cd')
.agg(median_price=('unit_price', 'median'),
median_cost=('unit_cost', 'median')).reset_index())
df_product_4 = pd.merge(df_product, df_tmp, how='inner', on='category_small_cd')
df_product_4['unit_price'] = df_product_4[['unit_price', 'median_price']]. \
apply(lambda x: np.round(x[1]) if np.isnan(x[0]) else x[0], axis=1)
df_product_4['unit_cost'] = df_product_4[['unit_cost', 'median_cost']]. \
apply(lambda x: np.round(x[1]) if np.isnan(x[0]) else x[0], axis=1)
df_product_4.isnull().sum()
product_cd 0 category_major_cd 0 category_medium_cd 0 category_small_cd 0 unit_price 0 unit_cost 0 median_price 0 median_cost 0 dtype: int64
ํด์ค:
์ด ์ฝ๋๋ DataFrame "df_product"์ "unit_price"์ "unit_cost" ์ด์ ๊ฒฐ์๋ ๊ฐ์ ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ์ค์๊ฐ์ ์ฌ์ฉํ์ฌ ์ธํํ๋ ์ฝ๋์ด๋ค. ์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์ด๋ฅผ ๊ตฌํํ๋ค.
์ฒซ ๋ฒ์งธ ํ์ DataFrame "df_product"๋ฅผ "category_small_cd" ์ด๋ก ๊ทธ๋ฃนํํ๊ณ ๊ฐ ๊ทธ๋ฃน์ "unit_price"์ "unit_cost"์ ์ค์๊ฐ์ ๊ณ์ฐํ๋ค. ์์ฑ๋ DataFrame์ ์ด๋ฆ์ "df_tmp"์ด๋ฉฐ, ์ธ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง๋ค." category_small_cd", "median_price", "median_cost"์ ์ธ ๊ฐ์ ์ด์ ๊ฐ์ง๋ค.
๋ ๋ฒ์งธ ํ์ Pandas ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ merge() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ "category_small_cd" ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก "df_product"์ "df_tmp" DataFrame์ ๊ฒฐํฉํ๊ณ ์๋ค. ๊ฒฐ๊ณผ DataFrame์ธ "df_product_4"๋ "df_product"์ ๋ชจ๋ ์ปฌ๋ผ๊ณผ "df_tmp"์ "median_price"์ "median_cost" ์ปฌ๋ผ์ ํฌํจํ๋ค.
3๋ฒ์งธ ์ค์ "df_product_4"์ "unit_price"๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ ์์ฑํ๋ค." "unit_price"์ "median_price" ์ด์ ๋๋ค ํจ์๋ฅผ ์ ์ฉํ์ฌ ๊ณ์ฐํ๋ค. ๋๋ค ํจ์๋ "unit_price" ์ด์ด ์กด์ฌํ์ง ์๋์ง(์ฆ, NaN) ํ์ธํ๊ณ , ์กด์ฌํ๋ค๋ฉด "median_price"์ ๋ฐ์ฌ๋ฆผ๋ ๊ฐ์ ๋ฐํํ๋ค. ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ "unit_price"์ ์๋ ๊ฐ์ ๋ฐํํ๋ค. ์ด ์์ ์ ํตํด "unit_price" ์ด์ ๋๋ฝ๋ ๊ฐ์ ์ฑ์ด๋ค.
4๋ฒ์งธ ์ค์ "df_product_4"์ "unit_cost"๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ๋ค." "unit_cost"์ "median_cost" ์ด์ ์ ์ฌํ ๋๋ค ํจ์๋ฅผ ์ ์ฉํ์ฌ ๊ณ์ฐ๋๋ค. ์ด ์์ ์ "unit_cost" ์ด์ ๋๋ฝ๋ ๊ฐ์ ์ฑ์ฐ๋ ๊ฒ์ด๋ค.
๋ง์ง๋ง ํ์ isnull() ๋ฉ์๋์ sum() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ "df_product_4" DataFrame์ ์ฌ์ ํ ๋๋ฝ๋ ๊ฐ์ด ์๋์ง ํ์ธํ๋ค. ์ถ๋ ฅ์ ๋ ์ด ๋ชจ๋ ๊ฒฐ์ธก๊ฐ์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋๋ฉด, ์ธํ ์ฐ์ฐ์ด ์ฑ๊ณตํ ๊ฒ์ผ๋ก ํ์ธ๋๋ค.
ย
# ์ฝ๋ ์์ 2 (mask ํ์ฉ)
df_tmp = (df_product.groupby('category_small_cd')
.agg(median_price=('unit_price', 'median'),
median_cost=('unit_cost', 'median')).reset_index())
df_product_4 = df_product.merge(df_tmp, how='inner', on='category_small_cd')
df_product_4['unit_price'] = (df_product_4['unit_price']
.mask(df_product_4['unit_price'].isnull(),
df_product_4['median_price'].round()))
df_product_4['unit_cost'] = (df_product_4['unit_cost']
.mask(df_product_4['unit_cost'].isnull(),
df_product_4['median_cost'].round()))
df_product_4.isnull().sum()
product_cd 0 category_major_cd 0 category_medium_cd 0 category_small_cd 0 unit_price 0 unit_cost 0 median_price 0 median_cost 0 dtype: int64
ํด์ค:
์ด ์ฝ๋๋ DataFrame "df_product"์ "unit_price"์ "unit_cost" ์ด์ ๊ฒฐ์๋ ๊ฐ์ ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ์ค์๊ฐ์ ์ฌ์ฉํ์ฌ ์ธํํ๋ ์ฝ๋์ด๋ค. ์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์ด๋ฅผ ๊ตฌํํ๋ค.
์ฒซ ๋ฒ์งธ ํ์ DataFrame "df_product"๋ฅผ "category_small_cd" ์ด๋ก ๊ทธ๋ฃนํํ๊ณ ๊ฐ ๊ทธ๋ฃน์ "unit_price"์ "unit_cost"์ ์ค์๊ฐ์ ๊ณ์ฐํ๋ค. ์์ฑ๋ DataFrame์ ์ด๋ฆ์ "df_tmp"์ด๋ฉฐ, ์ธ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง๋ค." category_small_cd", "median_price", "median_cost"์ ์ธ ๊ฐ์ ์ด์ ๊ฐ์ง๋ค.
๋ ๋ฒ์งธ ํ์ Pandas ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ merge() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ "category_small_cd" ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก "df_product"์ "df_tmp" DataFrame์ ๊ฒฐํฉํ๊ณ ์๋ค. ๊ฒฐ๊ณผ DataFrame์ธ "df_product_4"๋ "df_product"์ ๋ชจ๋ ์ปฌ๋ผ๊ณผ "df_tmp"์ "median_price"์ "median_cost" ์ปฌ๋ผ์ ํฌํจํ๋ค.
3๋ฒ์งธ ํ์ "df_product_4"์ Pandas์ mask() ๋ฉ์๋๋ก ๊ณ์ฐ๋ "unit_price"๋ผ๋ ์๋ก์ด ์ปฌ๋ผ์ ์์ฑํ๊ณ ์์ต๋๋ค. ํฉ๋๋ค. ์ด ์์ ์ผ๋ก "unit_price" ์ด์ ๋๋ฝ๋ ๊ฐ์ด ์ฑ์์ง๋ค.
4๋ฒ์งธ ์ค์ "df_product_4"์ "unit_cost"๋ผ๋ ์๋ก์ด ์ด์ ๋ง๋ค๊ณ "unit_price"์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ณ์ฐํ๋ค. ์ด ์์ ์ ํตํด "unit_cost" ์ด์ ๊ฒฐ์๋ ๊ฐ์ ์ฑ์ด๋ค.
๋ง์ง๋ง ํ์ isnull() ๋ฉ์๋์ sum() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ "df_product_4"์ DataFrame์ ์ฌ์ ํ ๋๋ฝ๋ ๊ฐ์ด ์๋์ง ํ์ธํ๋ค. ์ถ๋ ฅ์ ๋ ์ด ๋ชจ๋ ๊ฒฐ์๊ฐ์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋๋ฉด, ์ธํ ์ฐ์ฐ์ด ์ฑ๊ณตํ์์ ํ์ธํฉ๋๋ค.
# ์ฝ๋ ์์ 3 (fillna, transform ํ์ฉ)
df_product_4 = df_product.copy()
for x in ['unit_price', 'unit_cost']:
df_product_4[x] = (df_product_4[x]
.fillna(df_product_4.groupby('category_small_cd')[x]
.transform('median')
.round()))
df_product_4.isnull().sum()
product_cd 0 category_major_cd 0 category_medium_cd 0 category_small_cd 0 unit_price 0 unit_cost 0 dtype: int64
ํด์ค:
์ด ์ฝ๋๋ DataFrame "df_product"์ "unit_price"์ "unit_cost" ์ด์ ๊ฒฐ์๋ ๊ฐ์ ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ์ค์๊ฐ์ ์ฌ์ฉํ์ฌ ์ธํํ๋ ์ฝ๋์ด๋ค. ์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์ ์ฐจ๋ก ์ด๋ฅผ ๊ตฌํํ๋ค.
์ฒซ ๋ฒ์งธ ์ค์ ์๋ DataFrame "df_product"์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค๊ณ "df_product_4"๋ผ๋ ์ด๋ฆ์ ๋ถ์ธ๋ค.
๋ ๋ฒ์งธ ์ค์ for ๋ฃจํ๋ฅผ ์์ํ์ฌ 'unit_price'์ 'unit_cost' ์ปฌ๋ผ์ ๋ํด ๋ฐ๋ณต ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค.
์ธ ๋ฒ์งธ ์ค์ ๊ฐ ์ปฌ๋ผ์ ๊ฒฐ์๊ฐ์ ์ฑ์ฐ๊ณ ์์ต๋๋ค. fillna() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ด์ ๋๋ฝ๋ ๊ฐ์ ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ์ค๊ฐ๊ฐ์ผ๋ก ๋์ฒดํ๊ณ ์์ต๋๋ค. ์ด๋ 'df_product_4'๋ฅผ 'category_small_cd' ์ด๋ก ๊ทธ๋ฃนํํ๊ณ transform() ๋ฉ์๋๋ก ๊ฐ ์ด์ ์ค์๊ฐ์ ๊ณ์ฐํ์ฌ ์ํ๋๋ฉฐ, round() ๋ฉ์๋๋ ์ค์๊ฐ์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์๋ก ๋ฐ์ฌ๋ฆผํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
4๋ฒ์งธ ์ค์ isnull() ๋ฉ์๋์ sum() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ 'df_product_4' DataFrame์ ์ฌ์ ํ ๋๋ฝ๋ ๊ฐ์ด ์๋์ง ํ์ธํ๋ค. ์ถ๋ ฅ์์ ๋ ์ด ๋ชจ๋ ๊ฒฐ์๊ฐ์ด ์๋ ๊ฒ์ผ๋ก ๋ํ๋๋ฉด, ์ธํ ์ฐ์ฐ์ด ์ฑ๊ณตํ ๊ฒ์ผ๋ก ํ์ธ๋๋ค.
์ด์ฒ๋ผ ์ด ์ฝ๋๋ ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ์ค์๊ฐ์ ์ฌ์ฉํ์ฌ DataFrame "df_product"์ "unit_price"์ "unit_cost" ์ด์ ๊ฒฐ์๊ฐ์ ์ ๋ ฅํ ํ, ์ ๋ ฅํ ๊ฐ์ผ๋ก ์๋ก์ด DataFrame "df_product_4"๋ฅผ ์์ฑํ๋ค. ์ธํ์ ์๋ณธ DataFrame์ ๋ณต์ฌํ์ฌ ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ์ค์๊ฐ์ ์ด์ฉํ์ฌ ๊ฐ ์ด์ ๊ฒฐ์๊ฐ์ ์ฑ์ฐ๊ณ ๊ฒฐ์๊ฐ์ด ๋จ์๋์ง ํ์ธํ๋ ๋ฐฉ์์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
P-084: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ์ ์ฒด ๊ณ ๊ฐ์ ๋ํด ์ ์ฒด ๊ธฐ๊ฐ์ ๋งค์ถ ๊ธ์ก์์ 2019๋ ๋งค์ถ ๊ธ์ก์ด ์ฐจ์งํ๋ ๋น์จ์ ๊ณ์ฐํ์ฌ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค. ๋จ, ๋งค์ถ ์ค์ ์ด ์๋ ๊ฒฝ์ฐ 0์ผ๋ก ์ฒ๋ฆฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณ์ฐํ ๋น์จ์ด 0์ ์ด๊ณผํ๋ ๊ฒ์ ์ถ์ถํ์ฌ ๊ฒฐ๊ณผ๋ฅผ 10๊ฑด์ฉ ํ์ํ๋ผ. ๋ํ, ์์ฑ๋ ๋ฐ์ดํฐ์ ๊ฒฐ์์ด ์๋์ง ํ์ธํ๋ผ.
df_receipt_2019 = df_receipt.query('20190101 <= sales_ymd <= 20191231') \
.groupby('customer_id') \
.agg(amount_2019=('amount', 'sum')) \
.reset_index()
df_receipt_all = df_receipt.groupby('customer_id')\
.agg(amount_all=('amount', 'sum')) \
.reset_index()
df_sales_rate = df_customer[['customer_id']] \
.merge(df_receipt_2019, how='left', on='customer_id') \
.merge(df_receipt_all, how='left', on='customer_id')
df_sales_rate['amount_2019'] = df_sales_rate['amount_2019'].fillna(0)
df_sales_rate['amount_all'] = df_sales_rate['amount_all'].fillna(0)
df_sales_rate['amount_rate'] = \
df_sales_rate[['amount_2019','amount_all']] \
.apply(lambda x: 0 if x[0] == 0 else x[0] / x[1], axis=1)
df_sales_rate['amount_rate'] = df_sales_rate['amount_rate'].fillna(0)
df_sales_rate.query('amount_rate > 0').head(10)
ย | customer_id | amount_2019 | amount_all | amount_rate |
---|---|---|---|---|
2 | CS031415000172 | 2971.0 | 5088.0 | 0.583923 |
6 | CS015414000103 | 874.0 | 3122.0 | 0.279949 |
12 | CS011215000048 | 248.0 | 3444.0 | 0.072009 |
15 | CS029415000023 | 3767.0 | 5167.0 | 0.729050 |
21 | CS035415000029 | 5823.0 | 7504.0 | 0.775986 |
23 | CS023513000066 | 208.0 | 771.0 | 0.269780 |
24 | CS035513000134 | 463.0 | 1565.0 | 0.295847 |
27 | CS001515000263 | 216.0 | 216.0 | 1.000000 |
30 | CS006415000279 | 229.0 | 229.0 | 1.000000 |
32 | CS031415000106 | 215.0 | 7741.0 | 0.027774 |
df_tmp.isnull().sum()
category_small_cd 0 median_price 0 median_cost 0 dtype: int64
ํด์ค:
์ด ์ฝ๋๋ df_receipt๋ผ๋ Pandas์ DataFrame์ ๋ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ์ฌ 2019๋ ๊ณ ๊ฐ์ ์ด ๋งค์ถ ๋๋น ๋งค์ถ ๋น์จ์ ๊ณ์ฐํฉ๋๋ค. ์๋๋ ์ด ์ฝ๋๊ฐ ๋ฌด์์ ํ๋์ง ๋จ๊ณ๋ณ๋ก ์ค๋ช ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ํ์ df_receipt_2019๋ผ๋ ์๋ก์ด DataFrame์ ์์ฑํ๊ณ , 2019๋ (20190101 <= sales_ymd <= 20191231)์ ๋งค์ถ๋ง ํฌํจํ๋๋ก df_receipt์ ํ์ ํํฐ๋งํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ customer_id๋ก ํ์ ๊ทธ๋ฃนํํ์ฌ ๊ฐ ๊ทธ๋ฃน์ ๊ธ์ก ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ฒฐ๊ณผ DataFrame์ customer_id์ amount_2019์ ๋ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ๊ฒ ๋๋ค.
๋ ๋ฒ์งธ ํ์ df_receipt_all์ด๋ผ๋ ์๋ก์ด DataFrame์ ๋ง๋ค๊ณ , df_receipt์ ํ์ customer_id๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ ๊ทธ๋ฃน์ ๊ธ์ก ์ปฌ๋ผ์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค. ์์ฑ๋ DataFrame์ customer_id์ amount_all ๋ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ๊ฒ ๋๋ค.
์ธ ๋ฒ์งธ ํ์ df_sales_rate๋ผ๋ ์๋ก์ด DataFrame์ ๋ง๋ค์ด df_customer์ customer_id ์ด์ df_receipt_2019์ df_receipt_all์ amount_2019 ์ด๊ณผ amount_all ์ด์ ๊ฐ๊ฐ ๊ฒฐํฉํ๊ณ ์์ต๋๋ค. ์ฆ, df_customer์ ๋ชจ๋ ํ์ด ๊ฒฐ๊ณผ DataFrame์ ํฌํจ๋์ง๋ง, df_receipt_2019์ df_receipt_all์ ์ผ์นํ๋ ํ๋ง ํฌํจ๋๋ค. ๊ฒฐ๊ณผ DataFrame์๋ customer_id, amount_2019, amount_all์ ์ธ ๊ฐ์ ์ด์ด ์์ต๋๋ค.
4๋ฒ์งธ์ 5๋ฒ์งธ ํ์์๋ amount_2019์ amount_all ์ด์์ ๋๋ฝ๋ ๊ฐ์ 0์ผ๋ก ์ฑ์ด๋ค.
6ํ์ amount_2019์ amount_all ์ด์ ๋๋ค ํจ์๋ฅผ ์ ์ฉํ์ฌ df_sales_rate์ amount_rate๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ๊ณ ์์ผ๋ฉฐ, ฮป ํจ์๋ amount_2019๊ฐ 0์ธ ๊ฒฝ์ฐ 0์, ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ amount_2019์ amount_all์ ๋น์จ์ ๋ฐํํฉ๋๋ค. ๊ฒฐ๊ณผ column amount_rate ์ด์ ๊ฐ ๊ณ ๊ฐ์ ์ด ๋งค์ถ๊ณผ ๋น๊ตํ์ฌ 2019๋ ์ ๋งค์ถ ๋น์จ์ ๋ํ๋ธ๋ค.
7๋ฒ์งธ ์ค์ amount_rate ์ด์ ๊ฒฐ์๊ฐ์ 0์ผ๋ก ์ฑ์ด๋ค.
8ํ์ df_sales_rate ํ์ ํํฐ๋งํ์ฌ ์์ amount_rate๋ฅผ ๊ฐ์ง ๊ณ ๊ฐ๋ง ํฌํจํ๋๋ก ํ๊ณ , DataFrame์ amount_rate๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํ๋ค. ์ด๋ค์ ์ด ๋งค์ถ ๋๋น 2019๋ ๋งค์ถ ๋น์จ์ด ๊ฐ์ฅ ๋์ ์์ 10๋ช ์ ๊ณ ๊ฐ์ด๋ค.
ย
P-085: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ๋ชจ๋ ๊ณ ๊ฐ์ ๋ํด ์ฐํธ๋ฒํธ(postal_cd)๋ฅผ ์ด์ฉํ์ฌ ์ง์ค์ฝ๋ ๋ฐ์ดํฐ(df_geocode)๋ฅผ ์ฐ๊ฒฐํ์ฌ ์๋ก์ด ๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค. ๋จ, ํ๋์ ์ฐํธ๋ฒํธ(postal_cd)์ ์ฌ๋ฌ ๊ฐ์ ๊ฒฝ๋(longitude), ์๋(latitude) ์ ๋ณด๊ฐ ์ฐ๊ฒฐ๋ ๊ฒฝ์ฐ์๋ ๊ฒฝ๋(longitude), ์๋(latitude)์ ํ๊ท ๊ฐ์ ์ฐ์ถํ์ฌ ์ฌ์ฉํด์ผ ํ๋ค. ๋ํ, ์์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๊ธฐ ์ํด 10๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํ๋ค.
df_geocode_1 = df_geocode.groupby('postal_cd') \
.agg(m_longitude=('longitude', 'mean'),
m_latitude=('latitude', 'mean')).reset_index()
df_customer_1 = pd.merge(df_customer, df_geocode_1,
how='inner', on='postal_cd')
df_customer_1.head(10)
ย | customer_id | customer_name | gender_cd | gender | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd | m_longitude | m_latitude |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | CS021313000114 | ๅคง้ ใใๅญ | 1 | ๅฅณๆง | 1981-04-29 | 37 | 259-1113 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | S14021 | 20150905 | 0-00000000-0 | 139.31779 | 35.41358 |
1 | CS021303000023 | ๅ ไธๅพณ | 0 | ็ทๆง | 1980-04-05 | 38 | 259-1113 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | S14021 | 20160411 | 0-00000000-0 | 139.31779 | 35.41358 |
2 | CS021303000007 | ็ณๅ ไฟไบ | 0 | ็ทๆง | 1987-07-04 | 31 | 259-1113 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | S14021 | 20150707 | 0-00000000-0 | 139.31779 | 35.41358 |
3 | CS021313000183 | ่้ ๆชไพ | 1 | ๅฅณๆง | 1986-12-21 | 32 | 259-1113 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | S14021 | 20170611 | 0-00000000-0 | 139.31779 | 35.41358 |
4 | CS021314000098 | ็ญไบ ใใใช | 1 | ๅฅณๆง | 1985-09-21 | 33 | 259-1113 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | S14021 | 20160901 | 0-00000000-0 | 139.31779 | 35.41358 |
5 | CS021314000093 | ๆฑ่ค ็พไฝ | 1 | ๅฅณๆง | 1986-06-03 | 32 | 259-1113 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | S14021 | 20151015 | 0-00000000-0 | 139.31779 | 35.41358 |
6 | CS021413000049 | ๅคง้ ๅนธๅญ | 1 | ๅฅณๆง | 1973-04-17 | 45 | 259-1113 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | S14021 | 20150703 | 0-00000000-0 | 139.31779 | 35.41358 |
7 | CS037613000071 | ๅ ญ่ง ้ ๅฝฆ | 9 | ไธๆ | 1952-04-01 | 66 | 136-0076 | ๆฑไบฌ้ฝๆฑๆฑๅบๅ็ ********** | S13037 | 20150414 | 0-00000000-0 | 139.83502 | 35.67193 |
8 | CS015415000209 | ๅคง่ฐท ๅซๅญ | 1 | ๅฅณๆง | 1970-11-25 | 48 | 136-0076 | ๆฑไบฌ้ฝๆฑๆฑๅบๅ็ ********** | S13015 | 20150909 | B-20090610-C | 139.83502 | 35.67193 |
9 | CS037614000045 | ้ทๆฒข ้บป็ท | 1 | ๅฅณๆง | 1952-06-19 | 66 | 136-0076 | ๆฑไบฌ้ฝๆฑๆฑๅบๅ็ ********** | S13037 | 20150209 | 5-20091207-6 | 139.83502 | 35.67193 |
ํด์ค:
์ด ์ฝ๋๋ df_geocode์ df_customer๋ผ๋ ๋ ๊ฐ์ Pandas DataFrame์ ๋ํด ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค. ๋ค์์ ์ด ์ฝ๋๊ฐ ๋ฌด์์ ํ๋์ง ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๋ค.
์ฒซ ๋ฒ์งธ ํ์ df_geocode์ ํ์ postal_cd(์ฐํธ๋ฒํธ)๋ก ๊ทธ๋ฃนํํ๊ณ ๊ฐ ๊ทธ๋ฃน์ ํ๊ท ๊ฒฝ๋์ ์๋๋ฅผ ๊ณ์ฐํ์ฌ df_geocode_1์ด๋ผ๋ ์๋ก์ด DataFrame์ ์์ฑํฉ๋๋ค. ์์ฑ๋ DataFrame์ postal_cd, m_longitude, m_latitude์ ์ธ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง๋ค.
๋ ๋ฒ์งธ ํ์ df_customer์ df_geocode_1์ postal_cd ์ปฌ๋ผ์ผ๋ก ๋ณํฉํ์ฌ df_customer_1์ด๋ผ๋ ์๋ก์ด DataFrame์ ์์ฑํฉ๋๋ค. ์ฆ, ๋ DataFrame์์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ์ง ํ๋ง ๊ฒฐ๊ณผ DataFrame์ ํฌํจ๋๋ค. ๊ฒฐ๊ณผ DataFrame์ df_customer์ ๋ชจ๋ ์ปฌ๋ผ๊ณผ df_geocode_1์ m_longitude์ m_latitude ์ปฌ๋ผ์ ํฌํจํ๋ค.
3๋ฒ์งธ ์ค์ .head(10) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ DataFrame(df_customer_1)์ ์ฒ์ 10๊ฐ์ ํ์ ํ์ํ๊ณ ์๋ค. ์ด๋ ๊ณ ๊ฐ ์ ๋ณด์ ํด๋น ์ฐํธ๋ฒํธ์ ํ๊ท ๊ฒฝ๋ ๋ฐ ์๋ ๊ฐ์ ํฌํจํ๋ ๋ณํฉ๋ ๋ฐ์ดํฐ ์ํ์ ๋ณด์ฌ์ค๋๋ค.
ย
P-086: 085์์ ์์ฑํ ์๋๊ฒฝ๋๋ณ ๊ณ ๊ฐ ๋ฐ์ดํฐ์ ๋ํด ํ์ ์ ์ฒญ ๋งค์ฅ ์ฝ๋(application_store_cd)๋ฅผ ํค๋ก ๋งค์ฅ ๋ฐ์ดํฐ(df_store)์ ๊ฒฐํฉํ๋ผ. ๊ทธ๋ฆฌ๊ณ ์ ์ฒญ ๋งค์ฅ์ ์๋(latitude)-๊ฒฝ๋ ์ ๋ณด(longitude)์ ๊ณ ๊ฐ ์ฃผ์(address)์ ์๋-๊ฒฝ๋๋ฅผ ์ด์ฉํ์ฌ ์ ์ฒญ ๋งค์ฅ๊ณผ ๊ณ ๊ฐ ์ฃผ์์ ๊ฑฐ๋ฆฌ(๋จ์: km)๋ฅผ ๊ตฌํ๊ณ , ๊ณ ๊ฐ ID(customer_id), ๊ณ ๊ฐ ์ฃผ์(address), ๋งค์ฅ ์ฃผ์(address)์ ํจ๊ป ํ์ํ๋ผ. ๊ณผ ํจ๊ป ํ์ํ๋ผ. ๊ณ์ฐ์์ ์๋์ ๊ฐ๋จํ ์์ ์ฌ์ฉํ๋, ๊ทธ ์ธ ์ ๋ฐ๋๊ฐ ๋์ ๋ฐฉ์์ ์ด์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ๋ค. ๊ฒฐ๊ณผ๋ 10๊ฑด์ ํ์ํ๋ค.
์๋๏ผ๋ผ๋์๏ผ๏ผฯ๊ฒฝ๋๏ผ๋ผ๋์๏ผ๏ผฮป:๊ฑฐ๋ฆฌL=6371โarccosโก(sinโกฯ1โsinฯ2+cosโกฯ1โcosโกฯ2โcosโก(ฮป1โฮป2))
# ์ฝ๋ ์์ 1
def calc_distance(x1, y1, x2, y2):
distance = 6371 * math.acos(math.sin(math.radians(x1))
* math.sin(math.radians(x2))
+ math.cos(math.radians(x1))
* math.cos(math.radians(x2))
* math.cos(math.radians(y1) - math.radians(y2)))
return distance
df_tmp = pd.merge(df_customer_1, df_store,
how='inner',
left_on='application_store_cd',
right_on='store_cd') \
.rename(columns={'address_x':'customer_address',
'address_y':'store_address'})
df_tmp['distance'] = df_tmp[['m_latitude',
'm_longitude',
'latitude',
'longitude']] \
.apply(lambda x: calc_distance(x[0], x[1], x[2], x[3]),
axis=1)
df_tmp[['customer_id', 'customer_address',
'store_address', 'distance']].head(10)
ย | customer_id | customer_address | store_address | distance |
---|---|---|---|---|
0 | CS021313000114 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
1 | CS021303000023 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
2 | CS021303000007 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
3 | CS021313000183 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
4 | CS021314000098 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
5 | CS021314000093 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
6 | CS021413000049 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
7 | CS021313000025 | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅ********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 0.474282 |
8 | CS021413000022 | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅ********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 0.474282 |
9 | CS021413000094 | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅ********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 0.474282 |
ํด์ค:
์ด ์ฝ๋๋ df_customer_1, df_store, df_tmp๋ผ๋ 3๊ฐ์ Pandas DataFrame์ ๋ํด ๋ช ๊ฐ์ง ์ง๋ฆฌ์ ๊ณต๊ฐ ๊ณ์ฐ๊ณผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค. ์ฌ๊ธฐ์๋ ์ด ์ฝ๋๊ฐ ๋ฌด์์ ํ๋์ง ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๋ค.
์ฒซ ๋ฒ์งธ ์ค์ calc_distance๋ผ๋ ํ์ด์ฌ ํจ์๋ฅผ ์ ์ํ๊ณ x1๊ณผ y1(์ 1์ ์๋์ ๊ฒฝ๋), x2์ y2(์ 2์ ์๋์ ๊ฒฝ๋)๋ผ๋ 4๊ฐ์ ์ธ์๋ฅผ ์ทจํ๋ค. ์ด ํจ์๋ ๋ฐ๊ฒฝ 6371km์ ๊ตฌํ ์ง๊ตฌ๋ฅผ ๊ฐ์ ํ๊ณ ํ๋ฒ์ ์ ๊ณต์์ ์ฌ์ฉํ์ฌ ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ํฌ๋ก๋ฏธํฐ ๋จ์๋ก ๊ณ์ฐํ๋ค. ๊ฒฐ๊ณผ๋ distance๋ก ๋ฐํ๋๋ค.
๋ ๋ฒ์งธ ํ์ df_customer_1๊ณผ df_store๋ฅผ ๊ฐ๊ฐ application_store_cd์ store_cd ์ปฌ๋ผ์ผ๋ก ๋ณํฉํ์ฌ df_tmp๋ผ๋ ์๋ก์ด DataFrame์ ์์ฑํ๊ณ ์๋ค. ์ฆ, ๋ DataFrame์์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ์ง ํ๋ง ๊ฒฐ๊ณผ DataFrame์ ํฌํจ๋๋ค. ๊ฒฐ๊ณผ DataFrame์ ๋ DataFrame์ ๋ชจ๋ ์ปฌ๋ผ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ฃผ์_x๋ customer_address๋ก, address_y๋ store_address๋ก ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ ๋ช ๊ฐ์ ์ปฌ๋ผ์ ๋ ๊ฐ์ง๊ณ ์๋ค.
์ธ ๋ฒ์งธ ์ค์ .apply() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ m_latitude, m_longitude, latitude, longitude ์ด์ calc_distance ํจ์๋ฅผ ์ ์ฉํ์ฌ df_tmp์ distance๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ๊ณ ์๋ค. .apply() ๋ฉ์๋๋ axis=1 ์ธ์์ ํจ๊ป ํจ์๋ฅผ ํ ๋จ์๋ก ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ๊ฒฐ๊ณผ ๊ฑฐ๋ฆฌ ๊ฐ์ distance ์ด์ ์ ์ฅ๋๋ค.
4๋ฒ์งธ ์ค์ ์ด์ค ๋๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ df_tmp์์ ์ปฌ๋ผ์ ์ผ๋ถ(customer_id, customer_address, store_address, and distance)๋ฅผ ์ ํํ๊ณ , .head(10) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ DataFrame์ ์ฒ์ 10๊ฐ์ ํ์ ํ์ํ๊ณ ์์ต๋๋ค. ์ด๋ ๊ณ ๊ฐ ๋ฐ ๋งค์ฅ ์ ๋ณด๊ฐ ํฌํจ๋ ๋ณํฉ๋ ๋ฐ์ดํฐ ์ํ๊ณผ ๊ทธ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
ย
# ์ฝ๋ ์์ 2
def calc_distance_numpy(x1, y1, x2, y2):
x1_r = np.radians(x1)
x2_r = np.radians(x2)
y1_r = np.radians(y1)
y2_r = np.radians(y2)
return 6371 * np.arccos(np.sin(x1_r) * np.sin(x2_r)
+ np.cos(x1_r) * np.cos(x2_r)
* np.cos(y1_r - y2_r))
df_tmp = df_customer_1.merge(df_store,
how='inner',
left_on='application_store_cd',
right_on='store_cd') \
.rename(columns={'address_x':'customer_address',
'address_y':'store_address'})
df_tmp['distance'] = calc_distance_numpy(df_tmp['m_latitude'],
df_tmp['m_longitude'],
df_tmp['latitude'],
df_tmp['longitude'])
df_tmp[['customer_id', 'customer_address',
'store_address', 'distance']].head(10)
ย | customer_id | customer_address | store_address | distance |
---|---|---|---|---|
0 | CS021313000114 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
1 | CS021303000023 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
2 | CS021303000007 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
3 | CS021313000183 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
4 | CS021314000098 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
5 | CS021314000093 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
6 | CS021413000049 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 1.394409 |
7 | CS021313000025 | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅ********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 0.474282 |
8 | CS021413000022 | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅ********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 0.474282 |
9 | CS021413000094 | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅ********** | ็ฅๅฅๅท็ไผๅขๅๅธไผๅขๅๅไธ็ฎ | 0.474282 |
ํด์ค:
์ด ์ฝ๋๋ df_customer_1, df_store, df_tmp๋ผ๋ 3๊ฐ์ Pandas DataFrame์ ๋ํด ๋ช ๊ฐ์ง ์ง๋ฆฌ์ ๊ณต๊ฐ ๊ณ์ฐ๊ณผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ค. ์ฌ๊ธฐ์๋ ์ด ์ฝ๋๊ฐ ๋ฌด์์ ํ๋์ง ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๋ค.
์ฒซ ๋ฒ์งธ ์ค์ calc_distance_numpy๋ผ๋ ํ์ด์ฌ ํจ์๋ฅผ ์ ์ํ๊ณ x1๊ณผ y1(์ 1์ ์๋์ ๊ฒฝ๋), x2์ y2(์ 2์ ์๋์ ๊ฒฝ๋)๋ผ๋ 4๊ฐ์ ์ธ์๋ฅผ ์ทจํ๋ค. ์ด ํจ์๋ ๋ฐ๊ฒฝ 6371km์ ๊ตฌํ ์ง๊ตฌ๋ฅผ ๊ฐ์ ํ๊ณ ํ๋ฒ์ ์ ๊ณต์์ ์ฌ์ฉํ์ฌ ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ํฌ๋ก๋ฏธํฐ ๋จ์๋ก ๊ณ์ฐํ๋ค. ์ด ๊ตฌํ์์๋ NumPy ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๊ตฌํ๋ณด๋ค ๋ ํจ์จ์ ์ผ๋ก ๊ณ์ฐ์ ์ํํฉ๋๋ค.
๋ ๋ฒ์งธ ํ์ df_customer_1๊ณผ df_store๋ฅผ ๊ฐ๊ฐ application_store_cd์ store_cd ์ด๋ก ๋ณํฉํ์ฌ df_tmp๋ผ๋ ์๋ก์ด DataFrame์ ์์ฑํ๊ณ ์์ต๋๋ค. ์ฆ, ๋ DataFrame์์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ์ง ํ๋ง ๊ฒฐ๊ณผ DataFrame์ ํฌํจ๋๋ค. ๊ฒฐ๊ณผ DataFrame์ ๋ DataFrame์ ๋ชจ๋ ์ปฌ๋ผ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ฃผ์_x๋ customer_address๋ก, address_y๋ store_address๋ก ์ด๋ฆ์ด ๋ณ๊ฒฝ๋ ๋ช ๊ฐ์ ์ปฌ๋ผ์ ๋ ๊ฐ์ง๊ณ ์๋ค.
์ธ ๋ฒ์งธ ์ค์ df_tmp์ 4๊ฐ ์ด์ ๋ํด NumPy์ ๋ฐฐ์ด ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ calc_distance_numpy ํจ์๋ฅผ ํธ์ถํ์ฌ distance๋ผ๋ ์๋ก์ด ์ด์ ์์ฑํ๊ณ ์๋ค. ์ด ๊ตฌํ์์๋ .apply() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๋์ NumPy์ ๋ฐฐ์ด์ ๋ํด ์์๋ณ ๊ณ์ฐ์ ์ํํ๋ ๊ธฐ๋ฅ์ ํ์ฉํ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ณผ ๊ฑฐ๋ฆฌ ๊ฐ์ distance ์ด์ ์ ์ฅ๋ฉ๋๋ค.
4๋ฒ์งธ ์ค์ ์ด์ค ๋๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ df_tmp์์ ์ปฌ๋ผ์ ํ์ ์งํฉ(customer_id, customer_address, store_address, and distance)์ ์ ํํ๊ณ .head(10) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ DataFrame์ ์ฒ์ 10๊ฐ์ ํ์ ํ์ํ๊ณ ์์ต๋๋ค. ์ด๋ ๊ณ ๊ฐ ๋ฐ ๋งค์ฅ ์ ๋ณด๊ฐ ํฌํจ๋ ๋ณํฉ๋ ๋ฐ์ดํฐ ์ํ๊ณผ ๊ทธ ์ฌ์ด์ ํด๋น ๊ฑฐ๋ฆฌ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
P-087: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์๋ ๋ค๋ฅธ ๋งค์ฅ์์์ ์ ์ฒญ ๋ฑ์ผ๋ก ๋์ผ ๊ณ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ ๋ฑ๋ก๋์ด ์๋ค. ์ด๋ฆ(customer_name)๊ณผ ์ฐํธ๋ฒํธ(postal_cd)๊ฐ ๊ฐ์ ๊ณ ๊ฐ์ ๋์ผ ๊ณ ๊ฐ์ผ๋ก ๊ฐ์ฃผํ์ฌ 1๊ณ ๊ฐ 1๋ ์ฝ๋๊ฐ ๋๋๋ก ์ด๋ฆ์ ๋ถ์ธ ๋ช ๋ชฉ ๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ , ๊ณ ๊ฐ ๋ฐ์ดํฐ ๊ฐ์, ๋ช ๋ชฉ ๊ณ ๊ฐ ๋ฐ์ดํฐ ๊ฐ์, ์ค๋ณต ํ์๋ฅผ ๊ณ์ฐํ๋ผ. ๋จ, ๋์ผ ๊ณ ๊ฐ์ ๋ํด์๋ ๋งค์ถ ๊ธ์ก ํฉ๊ณ๊ฐ ๊ฐ์ฅ ๋์ ๊ฒ์ ๋จ๊ธฐ๊ณ , ๋งค์ถ ๊ธ์ก ํฉ๊ณ๊ฐ ๋์ผํ๊ฑฐ๋ ๋งค์ถ ์ค์ ์ด ์๋ ๊ณ ๊ฐ์ ๋ํด์๋ ๊ณ ๊ฐ ID(customer_id)์ ๋ฒํธ๊ฐ ์์ ๊ฒ์ ๋จ๊ธด๋ค.
df_receipt_tmp = df_receipt.groupby('customer_id') \
.agg(sum_amount=('amount','sum')).reset_index()
df_customer_u = pd.merge(df_customer, df_receipt_tmp,
how='left',
on='customer_id')
df_customer_u['sum_amount'] = df_customer_u['sum_amount'].fillna(0)
df_customer_u = df_customer_u.sort_values(['sum_amount', 'customer_id'],
ascending=[False, True])
df_customer_u.drop_duplicates(subset=['customer_name', 'postal_cd'],
keep='first', inplace=True)
print('df_customer_cnt:', len(df_customer),
'df_customer_u_cnt:', len(df_customer_u),
'diff:', len(df_customer) - len(df_customer_u))
df_customer_cnt: 21971 df_customer_u_cnt: 21941 diff: 30
ํด์ค:
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ๋ค.
df_receipt ๋ฐ์ดํฐ ํ๋ ์์ customer_id๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ ๊ณ ๊ฐ์ ๊ธ์ก ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ df_receipt_tmp์ ์ ์ฅ๋๋ค.
customer_id ์ด์ ๊ธฐ์ค์ผ๋ก df_customer ๋ฐ์ดํฐ ํ๋ ์์ df_receipt_tmp ๋ฐ์ดํฐ ํ๋ ์๊ณผ ๊ฒฐํฉํ๋ค. ์ด๊ฒ์ ์ผ์ชฝ ๊ฒฐํฉ์ด๋ฏ๋ก df_customer์ ๋ชจ๋ ๊ณ ๊ฐ์ด ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์ df_customer_u์ ํฌํจ๋๋ค.
sum_amount ์ปฌ๋ผ์ ๋๋ฝ๋ ๊ฐ์ 0์ผ๋ก ๋์ฒดํฉ๋๋ค.
df_customer_u์ ํ์ sum_amount๋ก ๋ด๋ฆผ์ฐจ์, customer_id๋ก ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
customer_name ์ด๊ณผ postal_cd ์ด์ ๊ธฐ์ค์ผ๋ก df_customer_u์ ์ค๋ณต์ ์ญ์ ํ๊ณ ์ค๋ณต์ ์ฒซ ๋ฒ์งธ ์ถํ๋ง ๋จ๊ฒจ๋๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ด df_customer_u๋ก ๋๋์๊ฐ๋ค.
์๋ df_customer ๋ฐ์ดํฐ ํ๋ ์์ ํ ์ (df_customer_cnt), ์ ๋ฐ์ดํธ ํ df_customer_u ๋ฐ์ดํฐ ํ๋ ์์ ํ ์ (df_customer_u_cnt), ๋ ์ฌ์ด์ ์ฐจ์ด (diff)๋ฅผ ์ธ์ํฉ๋๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ ๋ฐ์ดํฐ ์ ๋ฆฌ์ ์กฐ์์ ํตํด ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์ df_customer_u๋ฅผ ์์ฑํ๋ค. ์ด ๋ฐ์ดํฐ ํ๋ ์์๋ ๊ฐ ๊ณ ๊ฐ์ ์ด ๊ตฌ๋งค ๊ธ์ก(sum_amount)์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ์ด ๊ธ์ก์ ๋ฐ๋ผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋๊ณ , customer_name๊ณผ postal_cd ์ด์ ๊ธฐ์ค์ผ๋ก ์ค๋ณต๋๋ ํญ๋ชฉ์ ์ญ์ ๋ฉ๋๋ค.
P-088: 087์์ ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ๊ณ ๊ฐ ๋ฐ์ดํฐ์ ํตํฉ๋ช ์นญ ID๋ฅผ ๋ถ์ฌํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค. ๋จ, ํตํฉ๋ช ์นญ ID๋ ์๋์ ์ฌ์์ผ๋ก ๋ถ์ฌํ๋ค.
- ์ค๋ณต๋์ง ์์ ๊ณ ๊ฐ : ๊ณ ๊ฐ ID(customer_id) ์ค์
- ์ค๋ณต๋๋ ๊ณ ๊ฐ: ์ด์ ์ค๋ฌธ์์ ์ถ์ถํ ๋ ์ฝ๋์ ๊ณ ๊ฐ ID๋ฅผ ์ค์ ํ๋ค.
๊ณ ๊ฐ ID์ ๊ณ ์ ๊ฑด์์ ํตํฉ๋ช ์นญ ID์ ๊ณ ์ ๊ฑด์ ์ฐจ์ด๋ ํ์ธํด์ผ ํ๋ค.
ย
df_customer_n = pd.merge(df_customer,
df_customer_u[['customer_name',
'postal_cd', 'customer_id']],
how='inner', on =['customer_name', 'postal_cd'])
df_customer_n.rename(columns={'customer_id_x':'customer_id',
'customer_id_y':'integration_id'}, inplace=True)
print('ID ์์ ์ฐจ์ด', len(df_customer_n['customer_id'].unique())
- len(df_customer_n['integration_id'].unique()))
ID ์์ ์ฐจ์ด 30
ํด์ค:
์ด ์ฝ๋๋ df_customer์ df_customer_u๋ผ๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ ํ๋ ์์ ๋ณํฉํ์ฌ ์ด๋ฆ๊ณผ ์ฐํธ๋ฒํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณ ์ ํ ๊ณ ๊ฐ์ ์๋ณํ๊ณ ์ผ์น์ํจ๋ค.
๋ณํฉ๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ df_customer_n์ด๋ผ๋ ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ ์ ์ฅ๋๋ฉฐ, merge ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋ณํฉํ๊ณ , on=['customer_name', 'postal_cd']๋ผ๋ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ๋ ์ด์ ๊ธฐ๋ฐ์ผ๋ก ๋ณํฉํ ๊ฒ์ ์ง์ ํ๋ค.
๋ณํฉ๋ ๋ฐ์ดํฐ ํ๋ ์์๋ customer_id_x์ customer_id_y๋ผ๋ ๋ ๊ฐ์ ๊ณ ๊ฐ ID ์ปฌ๋ผ์ด ํฌํจ๋๋ค. ํผ๋์ ํผํ๊ธฐ ์ํด rename ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ด์ ์ด๋ฆ์ ๊ฐ๊ฐ customer_id์ integration_id๋ก ๋ณ๊ฒฝํ๋ค.
๋ง์ง๋ง ํ์์ customer_id ์ด์ ๊ณ ์ ํ ๊ณ ๊ฐ ID ์์ integration_id ์ด์ ๊ณ ์ ํ ๊ณ ๊ฐ ID ์๋ฅผ ๋น๊ตํ๋ค. ์ฐจ์ด๊ฐ 0์ด๋ฉด ๋ณํฉ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ค๋ณต๋ ๊ณ ๊ฐ์ด ์์์ ์๋ฏธํฉ๋๋ค. ์ฐจ์ด๊ฐ 0์ด ์๋๋ผ๋ฉด ์ด๋ฆ๊ณผ ์ฐํธ๋ฒํธ๊ฐ ์ผ์นํ์ง ์๋ ๊ณ ๊ฐ์ด ์ฌ์ ํ ์กด์ฌํ๊ณ ๊ทธ ID๊ฐ ์ค๋ณต๋์ด ์์์ ์๋ฏธํฉ๋๋ค.
ย
P-closure: df_customer_1, df_customer_n์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์ญ์ ํ๋ค.
del df_customer_1
del df_customer_n
P-089: ์์ธก ๋ชจ๋ธ ๊ตฌ์ถ์ ์ํด ํ๋งค ์ค์ ์ด ์๋ ๊ณ ๊ฐ์ ํ์ต์ฉ ๋ฐ์ดํฐ์ ํ ์คํธ์ฉ ๋ฐ์ดํฐ๋ก ๋๋๊ณ ์ถ๋ค. ๊ฐ๊ฐ 8:2์ ๋น์จ๋ก ๋ฌด์์๋ก ๋ฐ์ดํฐ๋ฅผ ๋ถํ ํ๋ผ.
df_sales_customer = df_receipt.groupby('customer_id') \
.agg({'amount':sum}).reset_index()
df_sales_customer = df_sales_customer.query('amount > 0')
df_tmp = pd.merge(df_customer, df_sales_customer['customer_id'],
how='inner', on='customer_id')
df_train, df_test = train_test_split(df_tmp, test_size=0.2, random_state=71)
print('ํ์ต ๋ฐ์ดํฐ ๋น์จ: ', len(df_train) / len(df_tmp))
print('ํ
์คํธ ๋ฐ์ดํฐ ๋น์จ: ', len(df_test) / len(df_tmp))
ํ์ต ๋ฐ์ดํฐ ๋น์จ: 0.7999036840837949
ํ
์คํธ ๋ฐ์ดํฐ ๋น์จ: 0.20009631591620516
ํด์ค:
์ด ์ฝ๋๋ ๊ฐ ๊ณ ๊ฐ์ ๋งค์ถ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐ์ดํฐ ํ๋ จ ๋ฐ ํ ์คํธ ๋ถํ ์ ์ํํ๋ค.
๋จผ์ df_receipt dataframe์ customer_id๋ก ๊ทธ๋ฃนํํ๊ณ amount ์ด์ ํฉ์ฐํ์ฌ ๊ฐ ๊ณ ๊ฐ์ ๋งค์ถ ์ ๋ณด๋ฅผ ์ง๊ณํ๋ค. ์ด๋ ๊ฒ ์ป์ ๋ฐ์ดํฐ ํ๋ ์์ df_sales_customer์ ์ ์ฅ๋๋ค.
๊ทธ๋ฐ ๋ค์ ์ฟผ๋ฆฌ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋งค๋ฅผ ํ์ง ์์ ๊ณ ๊ฐ(์ฆ, ๊ธ์ก์ด 0์ธ ๊ณ ๊ฐ)์ ํํฐ๋งํ๊ณ df_sales_customer๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์ด๋ค ๊ณ ๊ฐ๋ง ํฌํจํ๋๋ก ํ๋ค.
๊ทธ๋ฐ ๋ค์ df_sales_customer์ customer_id ์ปฌ๋ผ๊ณผ df_customer์ ๋ด๋ถ ๊ฒฐํฉ์ ์ํํ์ฌ ๊ตฌ๋งค๋ฅผ ํ ๊ณ ๊ฐ๋ง ์ ์งํ๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ df_tmp์ ์ ์ฅ๋๋ค.
๋ง์ง๋ง์ผ๋ก scikit-learn์ train_test_split ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ df_tmp๋ฅผ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ๋ก ๋ถํ ํ๋ค. ํ ์คํธ ํฌ๊ธฐ๋ 0.2, ๋๋ค ์ํ๋ 71์ด๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ จ ์ธํธ์ ํ ์คํธ ์ธํธ์ ํฌํจ๋ ๋ฐ์ดํฐ์ ๋น์จ์ ํ์ํ๋ค.
P-090: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)๋ 2017๋ 1์ 1์ผ๋ถํฐ 2019๋ 10์ 31์ผ๊น์ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋งค์ถ ๊ธ์ก(amount)์ ์๋ณ๋ก ์ง๊ณํ์ฌ ํ์ต์ฉ 12๊ฐ์, ํ ์คํธ์ฉ 6๊ฐ์์ ์๊ณ์ด ๋ชจ๋ธ ๊ตฌ์ถ์ฉ ๋ฐ์ดํฐ 3์ธํธ๋ฅผ ์์ฑํ๋ค.
# ์ฝ๋ ์์ 1 (์์ ํจ์)
df_ts_amount = df_receipt[['sales_ymd', 'amount']].copy()
df_ts_amount['sales_ym'] = df_ts_amount['sales_ymd'].astype('str').str[0:6]
df_ts_amount = df_ts_amount.groupby('sales_ym') \
.agg({'amount':'sum'}).reset_index()
# ์ฅ๊ธฐ๊ฐ์ ๋ฐ์ดํฐ์ ๋ํ ๋ค์์ ๋ฐ์ดํฐ ์ธํธ๋ ๋ฃจํ ๋ฑ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ๊ธฐ๋ฅํ
def split_data(df, train_size, test_size, slide_window, start_point):
train_start = start_point * slide_window
test_start = train_start + train_size
return df[train_start:test_start], df[test_start:test_start + test_size]
df_train_1, df_test_1 = split_data(df_ts_amount, train_size=12,
test_size=6, slide_window=6, start_point=0)
df_train_2, df_test_2 = split_data(df_ts_amount, train_size=12,
test_size=6, slide_window=6, start_point=1)
df_train_3, df_test_3 = split_data(df_ts_amount, train_size=12,
test_size=6, slide_window=6, start_point=2)
# df_train_2์ df_train_3์ ํ์๋ ์๋ตํฉ๋๋ค.
df_train_1
ย | sales_ym | amount |
---|---|---|
0 | 201701 | 902056 |
1 | 201702 | 764413 |
2 | 201703 | 962945 |
3 | 201704 | 847566 |
4 | 201705 | 884010 |
5 | 201706 | 894242 |
6 | 201707 | 959205 |
7 | 201708 | 954836 |
8 | 201709 | 902037 |
9 | 201710 | 905739 |
10 | 201711 | 932157 |
11 | 201712 | 939654 |
ํด์ค:
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ์์ ์ ์ํํ๋ค.
'sales_ymd', 'amount', 'sales_ym' ์ปฌ๋ผ์ ๊ฐ์ง df_ts_amount dataframe์ ์์ฑํ๊ณ , sales_ym ์ปฌ๋ผ์ sales_ymd ์ปฌ๋ผ์ ์ฒซ 6๊ธ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ ์์ฑํ๋ค.
df_ts_amount ๋ฐ์ดํฐ ํ๋ ์์ 'sales_ym' ์ปฌ๋ผ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ , 'sum' ํจ์๋ก 'amount' ์ปฌ๋ผ์ ์ง๊ณํ์ฌ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ๋ค. ์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋์ผํ ๋ณ์ 'df_ts_amount'์ ์ ์ฅ๋๋ค.
split_data ํจ์๋ df, train size, test size, slide window, start point๋ฅผ ์ธ์๋ก ์ทจํ๋ฉฐ, split_data ํจ์๋ train ๋ฐ์ดํฐ ํ๋ ์๊ณผ test ๋ฐ์ดํฐ ํ๋ ์ ๋ ๊ฐ์ ๋ฐ์ดํฐ ํ๋ ์์ ๋ฐํํ๋ค.
split_data ํจ์๋ df_ts_amount ๋ฐ์ดํฐ ํ๋ ์์ train ๋ฐ์ดํฐ ํ๋ ์๊ณผ test ๋ฐ์ดํฐ ํ๋ ์์ผ๋ก ๋ถํ ํ๊ธฐ ์ํด ๋งค๋ฒ ๋ค๋ฅธ ์ธ์๋ก ์ธ ๋ฒ ํธ์ถ๋๋ค. ํ๋ จ ๋ฐ์ดํฐ์ ํ ์คํธ ๋ฐ์ดํฐ ์ธ ์ธํธ๊ฐ ์์ฑ๋์ด df_train_1, df_test_1, df_train_2, df_test_2, df_train_3, df_test_3์ ์ ์ฅ๋๋ค.
๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ๋ถํ ํ๋ ๋ชฉ์ ์ ์๊ณ์ด ์์ธก ๋ชจ๋ธ์ ํ๋ จ ์ธํธ์ ๊ฒ์ฆ ์ธํธ๋ก ์ฌ์ฉํ๊ธฐ ์ํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ธํธ๋ก ๋ถํ ํ๋ฉด ๋ชจ๋ธ์ ๋ค๋ฅธ ๊ธฐ๊ฐ ๋์ ํ์ต์ํค๊ณ ๋ค๋ฅธ ํ ์คํธ ๊ธฐ๊ฐ ๋์ ์ฑ๋ฅ์ ํ๊ฐํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ค๋ฒํผํ ์ ํผํ๊ณ ๋ชจ๋ธ์ ์ฑ๋ฅ์ ๋ณด๋ค ์ ํํ๊ฒ ์ถ์ ํ ์ ์๋ค.
# df_test_2์ df_test_3์ ํ์๋ ์๋ตํฉ๋๋ค.
df_test_1
ย | sales_ym | amount |
---|---|---|
12 | 201801 | 944509 |
13 | 201802 | 864128 |
14 | 201803 | 946588 |
15 | 201804 | 937099 |
16 | 201805 | 1004438 |
17 | 201806 | 1012329 |
# ์ฝ๋ ์์ 2 (scikit-learn์ TimeSeriesSplit)
tscv = TimeSeriesSplit(gap=0, max_train_size=12, n_splits=3, test_size=6)
# TimeSeriesSplit์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ๋ถํ ํ์ง๋ง
# SQL, R์ ํด๋ต ์์ ์ ๋์ผํ๊ฒ ๋ฐ์ดํฐ ๊ธฐ๊ฐ์ ์กฐ์
# ์ต๋ํ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ค๋ฉด ๋ถํ์
df_ts_amount = df_ts_amount.query('sales_ym <= "201906"')
series_list = []
for train_index, test_index in tscv.split(df_ts_amount):
series_list.append((df_ts_amount.loc[train_index],
df_ts_amount.loc[test_index]))
df_train_1, df_test_1 = series_list[0]
df_train_2, df_test_2 = series_list[1]
df_train_3, df_test_3 = series_list[2]
# df_train_2์ df_train_3์ ํ์๋ ์๋ตํฉ๋๋ค.
df_train_1
ย | sales_ym | amount |
---|---|---|
0 | 201701 | 902056 |
1 | 201702 | 764413 |
2 | 201703 | 962945 |
3 | 201704 | 847566 |
4 | 201705 | 884010 |
5 | 201706 | 894242 |
6 | 201707 | 959205 |
7 | 201708 | 954836 |
8 | 201709 | 902037 |
9 | 201710 | 905739 |
10 | 201711 | 932157 |
11 | 201712 | 939654 |
# df_test_2์ df_test_3์ ํ์๋ ์๋ตํฉ๋๋ค.
df_test_1
ย | sales_ym | amount |
---|---|---|
12 | 201801 | 944509 |
13 | 201802 | 864128 |
14 | 201803 | 946588 |
15 | 201804 | 937099 |
16 | 201805 | 1004438 |
17 | 201806 | 1012329 |
ํด์ค:
์ด ์ฝ๋๋ pandas์ DataFrame df_ts_amount์ ๋ํด ์๊ณ์ด ๊ต์ฐจ ๊ฒ์ฆ์ ์ํํ๊ณ ์์ผ๋ฉฐ, sklearn.model_selection ๋ชจ๋์ TimeSeriesSplit ํจ์๋ฅผ ์ฌ์ฉํ์ฌ 3๊ฐ์ ํ๋ จ๊ณผ ํ ์คํธ ๋ถํ ์ ์์ฑํ์ฌ ํ๊ณ ์์ต๋๋ค.
TimeSeriesSplit์ ์๊ณ์ด ๋ฐ์ดํฐ ์ํ์ ๋ถํ ํ๊ธฐ ์ํ ํ๋ จ/ํ ์คํธ ์ธ๋ฑ์ค๋ฅผ ์ ๊ณตํ๋ ๊ต์ฐจ ๊ฒ์ฆ๊ธฐ์ด๋ฉฐ, 4๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
n_splits: ๋ถํ ํ์
max_train_size: ํ์ต ๋ฐ์ดํฐ์ ์ต๋ ํฌ๊ธฐ
test_size: ํ ์คํธ ๋ฐ์ดํฐ์ ํฌ๊ธฐ
gap: ์๋ก์ด ๋ถํ ์ ์์ํ๊ธฐ ์ ์ ๊ฑด๋๋ธ ์ํ ์
์ฝ๋์์๋ n_splits=3, max_train_size=12, test_size=6, gap=0์ผ๋ก ์ค์ ํ์ฌ ํ์ต ๊ธฐ๊ฐ 12๊ฐ์, ํ ์คํธ ๊ธฐ๊ฐ 6๊ฐ์์ 3๋ถํ ์ ์์ฑํ๋ค.
๋ค์ ์ฝ๋๋ 2019๋ 6์๊น์ง์ ๋งค์ถ ๋ฐ์ดํฐ๋ง ํฌํจํ๋๋ก ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํ๊ณ (df_ts_amount.query('sales_ym <= "201906"')), list series_list๋ฅผ ์์ฑํ์ฌ TimeSeriesSplit์์ ์์ฑํ ํ์ต ์ธํธ์ ํ ์คํธ ์ธํธ๋ฅผ ์ ์ฅํ๋ค. for ๋ฃจํ๋ TimeSeriesSplit์ ์ํด ์์ฑ๋ ๋ถํ ์ ๋ฐ๋ณตํ์ฌ ๊ฐ ๋ถํ ์ series_list์ ์ถ๊ฐํ๊ณ ์๋ค. ๋ง์ง๋ง์ผ๋ก ์ฒซ ๋ฒ์งธ ํ๋ จ๊ณผ ํ ์คํธ ๋ถํ ์ df_train_1๊ณผ df_test_1์, ๋ ๋ฒ์งธ ๋ถํ ์ df_train_2์ df_test_2์, ์ธ ๋ฒ์งธ ๋ถํ ์ df_train_3๊ณผ df_test_3์ ํ ๋นํ๊ณ ์๋ค.
ย
P-091: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ๊ฐ ๊ณ ๊ฐ์ ๋ํด ๋งค์ถ ์ค์ ์ด ์๋ ๊ณ ๊ฐ ์์ ๋งค์ถ ์ค์ ์ด ์๋ ๊ณ ๊ฐ ์๊ฐ 1:1์ด ๋๋๋ก ์ธ๋์ํ๋ง์ผ๋ก ์ถ์ถํ๋ผ.
df_tmp = df_receipt.groupby('customer_id').agg({'amount':'sum'}).reset_index()
df_tmp = pd.merge(df_customer, df_tmp, how='left', on='customer_id')
df_tmp['is_buy_flag'] = np.where(df_tmp['amount'].isnull(), 0, 1)
rs = RandomUnderSampler(random_state=71)
df_down_sampling, _ = rs.fit_resample(df_tmp, df_tmp.is_buy_flag)
print('0์ ๊ฑด์', len(df_down_sampling.query('is_buy_flag == 0')))
print('1์ ๊ฑด์', len(df_down_sampling.query('is_buy_flag == 1')))
0์ ๊ฑด์ 8306 1์ ๊ฑด์ 8306
ํด์ค:
์ด ์ฝ๋๋ ๋ฐ์ด๋๋ฆฌ ๋์ ๋ณ์ is_buy_flag์ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด ๋ฌด์์ ์ธ๋์ํ๋ง์ ์ํํ๋ค.
๋จผ์ ๊ฐ ๊ณ ๊ฐ์ ๊ตฌ๋งค ๊ธ์ก ํฉ๊ณ๊ฐ groupby๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋์ด df_tmp์ ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ df_customer์ df_tmp๋ ์ผ์ชฝ ๊ฒฐํฉ์ ์ฌ์ฉํ์ฌ ๋ณํฉํ์ฌ ๊ตฌ๋งค๋ฅผ ํ์ง ์์๋๋ผ๋ ๋ชจ๋ ๊ณ ๊ฐ์ ํฌํจํ๋๋ก ํ๊ณ , is_buy_flag ์ด์ np.where๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ๋งค๋ฅผ ํ ๊ณ ๊ฐ์๊ฒ๋ 1์, ๊ตฌ๋งค๋ฅผ ํ์ง ์์ ๊ณ ๊ฐ์๊ฒ๋ 0์ ํ ๋นํ์ฌ ์์ฑํ๋ค. ์์ฑ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ imblearn ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ RandomUnderSampler ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ๋ณ์์ ๊ท ํ์ ๋ง์ถ๊ณ , is_buy_flag ์ด์ ๋์ ๋ณ์๋ก ํ๋ fit_resample ๋ฉ์๋๋ฅผ df_tmp์ ์ ์ฉํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ๋์ ๋ณ์์ ๊ฐ์ ๋ํด ๋์ผํ ์์ ์ผ์ด์ค๋ฅผ ๊ฐ์ง ์๋ก์ด DataFrame์ธ df_down_sampling์ด ์์ฑ๋๋ค.
๋ง์ง๋ง์ผ๋ก is_buy_flag์ ๊ฐ์ด 0๊ณผ 1์ธ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ๋ ฅํ์ฌ ๋๋ค ์ธ๋์ํ๋ง์ด ์ฑ๊ณตํ์์ ํ์ธํ๋ค.
ย
P-092: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ์ฑ๋ณ์ ์ 3์ ๊ทํ์ผ๋ก ์ ๊ทํํ๋ผ.
df_gender_std = df_customer[['gender_cd', 'gender']].drop_duplicates()
df_customer_std = df_customer.drop(columns='gender')
# ๋ฐ์ดํฐ ๋ด์ฉ ํ์ธ
df_customer_std.head(3)
ย | customer_id | customer_name | gender_cd | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd |
---|---|---|---|---|---|---|---|---|---|---|
0 | CS021313000114 | ๅคง้ ใใๅญ | 1 | 1981-04-29 | 37 | 259-1113 | ็ฅๅฅๅท็ไผๅขๅๅธ็ฒ็ชช********** | S14021 | 20150905 | 0-00000000-0 |
1 | CS037613000071 | ๅ ญ่ง ้ ๅฝฆ | 9 | 1952-04-01 | 66 | 136-0076 | ๆฑไบฌ้ฝๆฑๆฑๅบๅ็ ********** | S13037 | 20150414 | 0-00000000-0 |
2 | CS031415000172 | ๅฎๅค็ฐ ่ฒด็พๅญ | 1 | 1976-10-04 | 42 | 151-0053 | ๆฑไบฌ้ฝๆธ่ฐทๅบไปฃใ ๆจ********** | S13031 | 20150529 | D-20100325-C |
# ๋ฐ์ดํฐ ๋ด์ฉ ํ์ธ
df_gender_std.head(3)
ย | gender_cd | gender |
---|---|---|
0 | 1 | ๅฅณๆง |
1 | 9 | ไธๆ |
5 | 0 | ็ทๆง |
ํด์ค:
์ด ์ฝ๋์์๋ df_customer ๋ฐ์ดํฐ ํ๋ ์์์ 'gender_cd'์ 'gender' ์ด์ ์ ํํ๊ณ drop_duplicates() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต๋ ํ์ ์ญ์ ํ์ฌ df_gender_std๋ฅผ ์์ฑํ๊ณ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด 'gender_cd'์ 'gender' ๊ฐ์ ๊ณ ์ ํ ์กฐํฉ์ผ๋ก ์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์์ด ์์ฑ๋ฉ๋๋ค.
df_customer_std๋ df_customer dataframe์์ 'gender' ์ด์ drop() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ columns ํ๋ผ๋ฏธํฐ๋ฅผ 'gender'๋ก ์ค์ ํ์ฌ ์ญ์ ํจ์ผ๋ก์จ ์์ฑ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด df_customer์์ 'gender' ์ปฌ๋ผ์ ์ ์ธํ ๋ชจ๋ ์ปฌ๋ผ์ ๊ฐ์ง ์๋ก์ด dataframe์ด ์์ฑ๋๋ค.
์ด ์ฝ๋์ ๋ชฉ์ ์ 'gender_cd'์ 'gender'์ ๊ณ ์ ํ ์กฐํฉ์ ๊ฐ์ง ๋ฐ์ดํฐ ํ๋ ์๊ณผ df_customer์ 'gender'๋ฅผ ์ ์ธํ ๋ชจ๋ ์ปฌ๋ผ์ ๊ฐ์ง ๋ฐ์ดํฐ ํ๋ ์์ ๋ณ๋๋ก ์์ฑํ๋ ๊ฒ์ด๋ค. ์ด๋ฌํ ๋ฐ์ดํฐ ํ๋ ์์ ์ถ๊ฐ ๋ถ์ ๋ฐ ๋ชจ๋ธ๋ง์ ์ฌ์ฉํ ์ ์๋ค.
ย
P-093: ์ํ ๋ฐ์ดํฐ(df_product)๋ ๊ฐ ์นดํ ๊ณ ๋ฆฌ์ ์ฝ๋ ๊ฐ๋ง ๋ณด์ ํ๊ณ ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ์ ๋ณด์ ํ์ง ์๋๋ค. ์นดํ ๊ณ ๋ฆฌ ๋ฐ์ดํฐ(df_category)์ ๊ฒฐํฉํ์ฌ ๋น์ ๊ทํํ์ฌ ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ์ ๋ณด์ ํ ์๋ก์ด ์ํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ค.
df_product_full = pd.merge(df_product, df_category[['category_small_cd',
'category_major_name',
'category_medium_name',
'category_small_name']],
how = 'inner', on = 'category_small_cd')
# ๋ฐ์ดํฐ ๋ด์ฉ ํ์ธ
df_product_full.head(3)
ย | product_cd | category_major_cd | category_medium_cd | category_small_cd | unit_price | unit_cost | category_major_name | category_medium_name | category_small_name |
---|---|---|---|---|---|---|---|---|---|
0 | P040101001 | 04 | 0401 | 040101 | 198.0 | 149.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
1 | P040101002 | 04 | 0401 | 040101 | 218.0 | 164.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
2 | P040101003 | 04 | 0401 | 040101 | 230.0 | 173.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
ํด์ค:
์ด ์ฝ๋๋ ๋ ๋ฐ์ดํฐ ํ๋ ์ df_product์ df_category ์ฌ์ด์์ category_small_cd ์ปฌ๋ผ์ผ๋ก ๋ด๋ถ ๋ฐ์ธ๋ฉ์ ์ํํ๋ค. ๊ฒฐ๊ณผ df_product_full์ df_product์ df_category์ ๋ชจ๋ ์ปฌ๋ผ์ ํฌํจํ๋ฉฐ, ๊ฒฐํฉ์ category_small_cd์ ์ผ์นํ๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
์๋ก์ด ๋ฐ์ดํฐ ํ๋ ์ df_product_full์๋ df_category์ ์ถ๊ฐ ์ปฌ๋ผ, ํนํ category_major_name, category_medium_name, category_small_name๋ ํฌํจ๋์ด ์๋ค. ์ด ์ด๋ค์ ์ํ ์นดํ ๊ณ ๋ฆฌ์ ๋ํ ์นดํ ๊ณ ๋ฆฌ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์ผ๋ฉฐ, ๋ ๋ฐ์ดํฐ ํ๋ ์์์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ์ง ํ๋ง ์ ์งํ๋ how='inner' ์ต์ ์ ์ฌ์ฉํ์ฌ ๋ณํฉ๋ ๋ฐ์ดํฐ ํ๋ ์์ ํฌํจ๋๋ค. .head(3) ๋ฉ์๋๋ ๋ณํฉ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ฒ์ ์ธ ํ์ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
P-094: 093์์ ์์ฑํ ์นดํ ๊ณ ๋ฆฌ๋ช ์ํ๋ฐ์ดํฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ ์ฌ์์ผ๋ก ํ์ผ ์ถ๋ ฅํ๋ค.
|ํ์ผ ํ์| ํค๋ ์ ๋ฌด| ๋ฌธ์ ์ธ์ฝ๋ฉ|
|:โ:|:โ:|:โ:|
CSV(์ผํ๋ก ๊ตฌ๋ถ) | ์์ | UTF-8|
# ์ฝ๋ ์์ 1
# ๋ต์ ํ์ผ์ ์์น๊ฐ ๋ฌธ์ ํ์ผ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๊ฐ '. /data'๋ก ๋์ด ์๋ ์ ์ฐธ๊ณ
df_product_full.to_csv('../data/P_df_product_full_UTF-8_header.csv',
encoding='UTF-8', index=False)
ํด์ค:
์ด ์ฝ๋๋ Pandas์ DataFrame df_product_full์ ํ์ผ ๊ฒฝ๋ก์ ํ์ผ๋ช ์ ์ง์ ํ์ฌ CSV ํ์ผ . /data/P_df_product_full_UTF-8_header.csv๋ก ๋ด๋ณด๋ด๊ณ ์์ต๋๋ค. ๋ด๋ณด๋ด๋ CSV ํ์ผ์ ๋ค์ํ ๋ฌธ์๋ฅผ ์ง์ํ๊ธฐ ์ํด UTF-8 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋ฉฐ, index=False ์ธ์๋ DataFrame์ ํ ์ธ๋ฑ์ค๋ฅผ ๋ด๋ณด๋ด๋ CSV ํ์ผ์ ํฌํจํ์ง ์๋๋ก ์ง์ ํฉ๋๋ค.
ย
# ์ฝ๋ ์์ 2 (BOM์ด ์๋ ์์
์ ๊นจ์ง ๋ฌธ์ ๋ฐฉ์ง)
df_product_full.to_csv('../data/P_df_product_full_UTF-8BOM_header.csv',
encoding='utf_8_sig', index=False)
ํด์ค:
์ด ์ฝ๋๋ df_product_full์ DataFrame์ P_df_product_full_UTF-8BOM_header.csv๋ผ๋ ํ์ผ๋ช ์ผ๋ก CSV ํ์ผ๋ก ๋ด๋ณด๋ด๊ณ ์๋ค.
pandas DataFrame์ to_csv() ๋ฉ์๋๋ DataFrame์ ๋ด์ฉ์ CSV ํ์ผ๋ก ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๋ฉ์๋์๋ ํ์ผ ์ด๋ฆ๊ณผ ์ฌ์ฉํ ์ธ์ฝ๋ฉ ๋ฑ ๋ช ๊ฐ์ง ํ๋ผ๋ฏธํฐ๊ฐ ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ, filename ๋งค๊ฐ๋ณ์์๋ '. /data/P_df_product_full_UTF-8BOM_header.csv'๋ก ์ค์ ๋์ด ์์ผ๋ฉฐ, CSV ํ์ผ์ ๋๋ ํ ๋ฆฌ์ ํ์ผ๋ช ์ ์ง์ ํฉ๋๋ค. . /data/' ์ ๋์ฌ๋ ํ์ผ์ ์ ์ฅํ ์๋์ ์ธ ๋๋ ํ ๋ฆฌ๋ฅผ ์ง์ ํ๋ค.
encoding ๋งค๊ฐ๋ณ์์๋ CSV ํ์ผ์ ์ฌ์ฉํ ์ธ์ฝ๋ฉ ํ์์ ์ง์ ํ๋ 'utf_8_sig'๊ฐ ์ค์ ๋๋ฉฐ, 'utf_8_sig'๋ ํ์ผ ์์ ๋ถ๋ถ์ ๋ฐ์ดํธ ์์ ํ์(BOM)๋ฅผ ํฌํจํ๋ UTF-8 ์ธ์ฝ๋ฉ์ ์ผ์ข ์ด๋ค. ์์๋ฅผ ๋ํ๋ด๋ ํน์ ๋ง์ปค๋ก, ํ์ผ์ ์ด ๋ ํ๋ก๊ทธ๋จ์ด ์ธ์ฝ๋ฉ ํ์์ ํ๋จํ๋ ๋ฐ ๋์์ด ๋๋ค.
index ๋งค๊ฐ ๋ณ์๋ False๋ก ์ค์ ๋์ด DataFrame์ ์ธ๋ฑ์ค๋ฅผ CSV ํ์ผ์ ํฌํจํ์ง ์๋๋ก ์ง์ ํ๋ค.
ย
P-095: 093์์ ์์ฑํ ์นดํ ๊ณ ๋ฆฌ๋ช ์ํ ๋ฐ์ดํฐ๋ฅผ ์๋ ์ฌ์์ผ๋ก ํ์ผ ์ถ๋ ฅํ๋ผ.
|ํ์ผ ํ์| ํค๋ ์ ๋ฌด| ๋ฌธ์ ์ธ์ฝ๋ฉ|
|:โ:|:โ:|:โ:|
CSV(์ผํ๋ก ๊ตฌ๋ถ) | ์์ |CP932|
ย
์ถ๋ ฅ์ฒ ๊ฒฝ๋ก๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค.
|์ถ๋ ฅ์ฒ||:โ:||./data|
# ๋ต์ ํ์ผ์ ์์น๊ฐ ๋ฌธ์ ํ์ผ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๊ฐ '. /data'๋ก ๋์ด ์๋ ์ ์ฐธ๊ณ
df_product_full.to_csv('../data/P_df_product_full_CP932_header.csv',
encoding='CP932', index=False)
ํด์ค:
์ด ์ฝ๋๋ pandas์ DataFrame์ธ df_product_full์ ". /data/' ๋๋ ํ ๋ฆฌ์ ์๋ 'P_df_product_full_CP932_header.csv'๋ผ๋ ์ด๋ฆ์ CSV ํ์ผ๋ก ๋ด๋ณด๋ด๊ณ ์์ต๋๋ค.
๋ด๋ณด๋ธ CSV ํ์ผ์ 'Windows-31J'๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์ผ๋ณธ์ด ๋ฌธ์ ์ธ์ฝ๋ฉ์ธ 'CP932' ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํฉ๋๋ค. ์ด ์ธ์ฝ๋ฉ์ ์ผ๋ณธ์์ ํ ์คํธ ๋ฐ์ดํฐ์ ์์ฃผ ์ฌ์ฉ๋๋ ์ธ์ฝ๋ฉ์ผ๋ก Windows ์ด์ ์ฒด์ ์ ํธํ๋ฉ๋๋ค.
parameter encoding='CP932'๋ CSV ํ์ผ์ ๋ด๋ณด๋ผ ๋ ์ฌ์ฉํ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ง์ ํ๋ค.
index=False ๋งค๊ฐ ๋ณ์๋ ๋ด๋ณด๋ธ CSV ํ์ผ์ index ์ปฌ๋ผ์ ํฌํจํ์ง ์๋๋ก ์ง์ ํฉ๋๋ค.
ย
P-096: 093์์ ์์ฑํ ์นดํ ๊ณ ๋ฆฌ๋ช ์ํ ๋ฐ์ดํฐ๋ฅผ ์๋ ์ฌ์์ผ๋ก ํ์ผ ์ถ๋ ฅํ๋ผ.
|ํ์ผ ํ์| ํค๋ ์ ๋ฌด| ๋ฌธ์ ์ธ์ฝ๋ฉ|
|:โ:|:โ:|:โ:|
CSV(์ผํ๋ก ๊ตฌ๋ถ) | ์์ |CP932|
ย
์ถ๋ ฅ์ฒ ๊ฒฝ๋ก๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค.
|์ถ๋ ฅ์ฒ||:โ:||./data|
ย
# ๋ต์ ํ์ผ์ ์์น๊ฐ ๋ฌธ์ ํ์ผ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๊ฐ '. /data'๋ก ๋์ด ์๋ ์ ์ฐธ๊ณ
df_product_full.to_csv('../data/P_df_product_full_UTF-8_noh.csv',
header=False, encoding='UTF-8', index=False)
ํด์ค:
df_product_full DataFrame์ ". /data/" ๋๋ ํ ๋ฆฌ์ "P_df_product_full_UTF-8_noh.csv"๋ผ๋ CSV ํ์ผ์ ์ ์ฅํ๋ ์ฝ๋์ด๋ค.
์ฒซ ๋ฒ์งธ ์ธ์์๋ CSV ํ์ผ์ ์ ์ฅํ ํ์ผ๋ช ๊ณผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ณ , header ์ธ์๋ False๋ก ์ค์ ํ์ฌ DataFrame์ ํค๋ ๋ผ์ธ์ด ์ถ๋ ฅ ํ์ผ์ ํฌํจ๋์ง ์์์ ์๋ฏธํ๋ฉฐ, encoding ์ธ์๋ 'UTF-8'๋ก ์ค์ ํ์ฌ ํ์ผ ์ฐ๊ธฐ ์ ์ฌ์ฉํ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ง์ ํ๋ค. ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ง์ ํ๋ค. ์ด๋ DataFrame์ ์ธ๋ฑ์ค๊ฐ ์ถ๋ ฅ ํ์ผ์ ํฌํจ๋์ง ์์์ ์๋ฏธํฉ๋๋ค.
์ ์ฒด์ ์ผ๋ก ์ด ์ฝ๋๋ df_product_full DataFrame์ UTF-8 ์ธ์ฝ๋ฉ์ผ๋ก CSV ํ์ผ๋ก ๋ด๋ณด๋ด๋๋ฐ, ํค๋ ๋ผ์ธ์ ํฌํจ๋์ง ์๋๋ค.
ย
P-097: 094์์ ์์ฑํ ์๋ ํ์์ ํ์ผ์ ๋ถ๋ฌ์์ ๋ฐ์ดํฐ 3๊ฑด์ ํ์ํ์ฌ ์ ๋๋ก ์ ๋ ฅ๋์๋์ง ํ์ธํ๋ผ
|ํ์ผ ํ์| ํค๋ ์ ๋ฌด| ๋ฌธ์ ์ธ์ฝ๋ฉ|
|:โ:|:โ:|:โ:|
CSV(์ผํ๋ก ๊ตฌ๋ถ) | ์์ |UTF-8|
ย
์ถ๋ ฅ์ฒ ๊ฒฝ๋ก๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค.
|์ถ๋ ฅ์ฒ||:โ:||./data|
# ๋ต์ ํ์ผ์ ์์น๊ฐ ๋ฌธ์ ํ์ผ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๊ฐ '. /data'๋ก ๋์ด ์๋ ์ ์ฐธ๊ณ
df_product_full = pd.read_csv('../data/P_df_product_full_UTF-8_header.csv',
dtype={'category_major_cd':str,
'category_medium_cd':str,
'category_small_cd':str},
encoding='UTF-8')
df_product_full.head(3)
ย | product_cd | category_major_cd | category_medium_cd | category_small_cd | unit_price | unit_cost | category_major_name | category_medium_name | category_small_name |
---|---|---|---|---|---|---|---|---|---|
0 | P040101001 | 04 | 0401 | 040101 | 198.0 | 149.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
1 | P040101002 | 04 | 0401 | 040101 | 218.0 | 164.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
2 | P040101003 | 04 | 0401 | 040101 | 230.0 | 173.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
ํด์ค:
์ ์ฝ๋๋ UTF-8 ์ธ์ฝ๋ฉ์ผ๋ก ํค๋ ํ์ด ์๋ CSV ํ์ผ P_df_product_full_UTF-8_no.csv๋ฅผ ์ฝ๊ณ ๋ฐ์ดํฐ ํ๋ ์์ ์ด ์ด๋ฆ์ ํ ๋นํ๊ณ ์์ต๋๋ค.
pd.read_csv('... /data/P_df_product_full_UTF-8_noh.csv', dtype={1:str, 2:str, 3:str}, encoding='UTF-8', header=None): ํค๋ ๋ผ์ธ์ด ์๋ CSV ํ์ผ์ ๋ถ๋ฌ์ 2์ด, 3์ด, 4์ด์ ๋ฌธ์์ด ๋ฐ์ดํฐ ํ์ ์ผ๋ก ์ค์ ํ๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์๋ 0, 1, 2, 3, 4, 5, 6, 7, 8์ด๋ผ๋ ์ด๋ฆ์ ์ด์ด ์์ต๋๋ค.
df_product_full.columns = ['product_cd', 'category_major_cd', 'category_medium_cd', 'category_small_cd', 'unit_price', 'unit_cost',' category_major_name', 'category_medium_name', 'category_small_name']: ๋ฐ์ดํฐ ํ๋ ์์ ์ปฌ๋ผ์ ์๋ก์ด ์ปฌ๋ผ ์ด๋ฆ์ ๋ถ์ฌํ๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ product_cd, category_major_cd, category_major_cd, category_medium_cd, category_small_cd, unit_price, unit_cost, category_major_name, category_medium_name, and category_small_name ์ด์ ๊ฐ์ง๋ค.
df_product_full.head(3): df_product_full์ ์ฒ์ ์ธ ์ค์ ํ์ํ๋ค.
ย
P-098: 096์์ ์์ฑํ ์๋ ํ์์ ํ์ผ์ ๋ถ๋ฌ์์ ๋ฐ์ดํฐ 3๊ฑด์ ํ์ํ์ฌ ์ ๋๋ก ์ ๋ ฅ๋์๋์ง ํ์ธํ๋ค.
|ํ์ผ ํ์| ํค๋ ์ ๋ฌด| ๋ฌธ์ ์ธ์ฝ๋ฉ|
|:โ:|:โ:|:โ:|
CSV(์ผํ๋ก ๊ตฌ๋ถ) | ์์ |UTF-8|
ย
# ์ฝ๋ ์์ 1 (๋์ค์ ํญ๋ชฉ ์ด๋ฆ ๋ถ์ด๊ธฐ)
# ๋ต์ ํ์ผ์ ์์น๊ฐ ๋ฌธ์ ํ์ผ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๊ฐ '. /data'๋ก ๋์ด ์๋ ์ ์ฐธ๊ณ
df_product_full = pd.read_csv('../data/P_df_product_full_UTF-8_noh.csv',
dtype={1:str,
2:str,
3:str},
encoding='UTF-8', header=None)
df_product_full.columns = ['product_cd','category_major_cd',
'category_medium_cd', 'category_small_cd',
'unit_price','unit_cost','category_major_name',
'category_medium_name', 'category_small_name']
df_product_full.head(3)
ย | product_cd | category_major_cd | category_medium_cd | category_small_cd | unit_price | unit_cost | category_major_name | category_medium_name | category_small_name |
---|---|---|---|---|---|---|---|---|---|
0 | P040101001 | 04 | 0401 | 040101 | 198.0 | 149.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
1 | P040101002 | 04 | 0401 | 040101 | 218.0 | 164.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
2 | P040101003 | 04 | 0401 | 040101 | 230.0 | 173.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
ํด์ค:
์ด ์ฝ๋๋ '. /data' ๋๋ ํฐ๋ฆฌ์ ์๋ 'P_df_product_full_UTF-8_noh.csv'๋ผ๋ ์ด๋ฆ์ CSV ํ์ผ์ ๋ถ๋ฌ์ค๋ฉฐ, 'names' ํ๋ผ๋ฏธํฐ๋ 'c_names'๋ผ๋ ๋ฌธ์์ด ๋ชฉ๋ก์ผ๋ก ์ฌ์ฉํ๋ฉฐ, 'dtype' ํ๋ผ๋ฏธํฐ๋ 'category_major_cd', 'category_medium_cd', 'category_small_cd'๋ผ๋ ์ด๋ฆ์ ์ด์ ๋ํ ๋ฐ์ดํฐ, 'category_major_cd', 'category_medium_cd', 'category_small_cd'๋ผ๋ ์ด๋ฆ์ ์ปฌ๋ผ์ ๋ฐ์ดํฐ ํ์ ์ 'str'(๋ฌธ์์ด)๋ก ์ง์ ํ๋ค. ๋ ๊ฒ์ ์ง์ ํ๋ค. ๋ง์ง๋ง์ผ๋ก 'header' ๋งค๊ฐ๋ณ์๋ ํ์ผ์ ํค๋ ํ์ด ์์์ ๋ํ๋ด๊ธฐ ์ํด 'None'์ผ๋ก ์ค์ ํ๋ค.
์์ฑ๋ ๋ฐ์ดํฐ ํ๋ ์์ 'df_product_full' ๋ณ์์ ํ ๋น๋๊ณ , 'head' ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ์ ์ธ ์ค์ ํ์ํ๋ค.
ย
# ์ฝ๋ ์์ 2 (ํญ๋ชฉ๋ช
์ ๋จผ์ ์ ์ํ๋ค)
c_names = ['product_cd','category_major_cd','category_medium_cd',
'category_small_cd','unit_price','unit_cost',
'category_major_name','category_medium_name','category_small_name']
df_product_full = pd.read_csv('../data/P_df_product_full_UTF-8_noh.csv',
names=c_names,
dtype={'category_major_cd':str,
'category_medium_cd':str,
'category_small_cd':str},
encoding='UTF-8', header=None)
df_product_full.head(3)
ย | product_cd | category_major_cd | category_medium_cd | category_small_cd | unit_price | unit_cost | category_major_name | category_medium_name | category_small_name |
---|---|---|---|---|---|---|---|---|---|
0 | P040101001 | 04 | 0401 | 040101 | 198.0 | 149.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
1 | P040101002 | 04 | 0401 | 040101 | 218.0 | 164.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
2 | P040101003 | 04 | 0401 | 040101 | 230.0 | 173.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
ํด์ค:
์ด ์ฝ๋๋ read_csv ํจ์๋ฅผ ์ฌ์ฉํ์ฌ CSV ํ์ผ์ ์ฌ์ฉ์ ์ ์๋ ์ปฌ๋ผ ์ด๋ฆ์ ๊ฐ์ง Pandas DataFrame์ ๋ถ๋ฌ์ค๋ ์ฝ๋์ ๋๋ค.
๋ค์์ ์ฝ๋์ ๋ํ ์ค๋ช ์ ๋๋ค.
c_names: ์ปค์คํฐ๋ง์ด์ง๋ ์ปฌ๋ผ ์ด๋ฆ์ ์ ์ํ๋ ๋ฌธ์์ด ๋ชฉ๋ก์ ๋๋ค.
pd.read_csv(): CSV ํ์ผ์ ์ฝ์ด์ DataFrame์ ๋ฐํํ๋ Pandas ํจ์์ ๋๋ค.
'... /data/P_df_product_full_UTF-8_noh.csv': ๋ถ๋ฌ์ฌ CSV ํ์ผ์ ํ์ผ ๊ฒฝ๋ก์ ๋๋ค.
names=c_names: c_names ๋ชฉ๋ก์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ์ํ ์ปฌ๋ผ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
dtype={'category_major_cd':str, 'category_medium_cd':str, 'category_small_cd':str}: category_major_cd, category_medium_cd, category_small_cd, category_small_cd small_cd ์ปฌ๋ผ์ ๋ฐ์ดํฐ ํ์ ์ str๋ก ์ง์ ํ๋ค.
encoding='UTF-8': ํ์ผ์ ์ธ์ฝ๋ฉ์ 'UTF-8'๋ก ์ง์ ํ๋ค.
header=None: CSV ํ์ผ์ ํค๋ ๋ผ์ธ์ด ์์์ ์ง์ ํ๋ค.
๋ง์ง๋ง์ผ๋ก head() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ DataFrame์ ํ์ํ๊ณ ์ฒ์ ์ธ ์ค์ ํ์ํฉ๋๋ค.
ย
P-099: 093์์ ์์ฑํ ์นดํ ๊ณ ๋ฆฌ๋ช ์ํ ๋ฐ์ดํฐ๋ฅผ ์๋ ์ฌ์์ผ๋ก ํ์ผ ์ถ๋ ฅํ๋ผ.
|ํ์ผ ํ์| ํค๋ ์ ๋ฌด| ๋ฌธ์ ์ธ์ฝ๋ฉ|
|:โ:|:โ:|:โ:|
TSV(ํญ์ผ๋ก ๊ตฌ๋ถ)ย | ์์ |UTF-8|
ย
์ถ๋ ฅ์ฒ ๊ฒฝ๋ก๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค.
|์ถ๋ ฅ์ฒ||:โ:||./data|
# ๋ต์ ํ์ผ์ ์์น๊ฐ ๋ฌธ์ ํ์ผ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๊ฐ '. /data'๋ก ๋์ด ์๋ ์ ์ฐธ๊ณ
df_product_full.to_csv('../data/P_df_product_full_UTF-8_header.tsv',
sep='\t', encoding='UTF-8', index=False)
ํด์ค:
์ด ์ฝ๋๋ df_product_full์ด๋ผ๋ pandas์ DataFrame์ ๋ด์ฉ์ '. /d/P_df_product_full_UTF-8_header.tsv'์ ์๋ TSV(Tab-Separated Values) ํ์ผ์ ์์ฑํฉ๋๋ค.
.to_csv() ๋ฉ์๋๋ df_product_full DataFrame์ ๋ํด ํธ์ถ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ CSV (Comma-Separated Values) ๋๋ TSV ํ์ผ๋ก ๋ด๋ณด๋ด๊ธฐ ์ํด pandas๊ฐ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ฉ์๋์ ์ฒซ ๋ฒ์งธ ์ธ์์ธ '. /d/P_df_product_full_UTF-8_header.tsv'๋ DataFrame์ ์ ์ฅํ ํ์ผ ๊ฒฝ๋ก์ ํ์ผ ์ด๋ฆ์ด๋ค. ํ์ผ์ . /d/ ๋๋ ํ ๋ฆฌ์ P_df_product_full_UTF-8_header.tsv๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
๋ ๋ฒ์งธ ์ธ์ sep='หถ'๋ ํ์ผ ๋ด ๊ฐ์ ์ผํ ๋์ ํญ์ผ๋ก ๊ตฌ๋ถํ๋๋ก ์ง์ ํ๋ค.
์ธ ๋ฒ์งธ ์ธ์ encoding='UTF-8'์ ํ์ผ์ ์ธ์ฝ๋ฉ์ ์ ๋์ฝ๋ ๋ฌธ์์ ํ์ค ์ธ์ฝ๋ฉ์ธ UTF-8๋ก ์ง์ ํ๋ค.
๋ค ๋ฒ์งธ ์ธ์ index=False๋ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ถ๋ ฅ ํ์ผ์ ํฌํจํ์ง ์๋๋ก ์ง์ ํ๋ค.
ย
P-100: 099์์ ์์ฑํ ์๋ ํ์์ ํ์ผ์ ๋ถ๋ฌ์์ ๋ฐ์ดํฐ 3๊ฑด์ ํ์ํ์ฌ ์ ๋๋ก ์ ๋ ฅ๋์๋์ง ํ์ธํ๋ค.
|ํ์ผ ํ์| ํค๋ ์ ๋ฌด| ๋ฌธ์ ์ธ์ฝ๋ฉ|
|:โ:|:โ:|:โ:|
TSV(ํญ์ผ๋ก ๊ตฌ๋ถ)ย | ์์ |UTF-8|
# ์ฝ๋ ์์ 1 (read_table)
# ๋ต์ ํ์ผ์ ์์น๊ฐ ๋ฌธ์ ํ์ผ๊ณผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ก๊ฐ '. /data'๋ก ๋์ด ์๋ ์ ์ฐธ๊ณ
df_product_full = pd.read_table('../data/P_df_product_full_UTF-8_header.tsv',
dtype={'category_major_cd':str,
'category_medium_cd':str,
'category_small_cd':str},
encoding='UTF-8')
df_product_full.head(3)
ย | product_cd | category_major_cd | category_medium_cd | category_small_cd | unit_price | unit_cost | category_major_name | category_medium_name | category_small_name |
---|---|---|---|---|---|---|---|---|---|
0 | P040101001 | 04 | 0401 | 040101 | 198.0 | 149.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
1 | P040101002 | 04 | 0401 | 040101 | 218.0 | 164.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
2 | P040101003 | 04 | 0401 | 040101 | 230.0 | 173.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
ํด์ค:
์ด ์ฝ๋์์๋ '. /data/P_df_product_full_UTF-8_header.tsv'์ ์๋ TSV(Tab-Separated Values) ํ์ผ์์ df_product_full์ด๋ผ๋ pandas DataFrame์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์์ต๋๋ค.
ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด pd.read_table() ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์์ธ '. /data/P_df_product_full_UTF-8_header.tsv'๋ ์ฝ์ ํ์ผ์ ๊ฒฝ๋ก์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
ํจ์์ ๋ ๋ฒ์งธ ์ธ์์ธ dtype={'category_major_cd':str, 'category_medium_cd':str, 'category_small_cd':str}๋ DataFrame์ ํน์ ์ด์ ๋ฐ์ดํฐ ํ์ ์ ์ง์ ํ๋ค. ๊ตฌ์ฒด์ ์ผ๋ก category_major_cd, category_medium_cd, category_small_cd์ ๊ฐ ์ด์ string(str) ํ์ ์ผ๋ก ์ค์ ํ๋ค.
์ด ํจ์์ ์ธ ๋ฒ์งธ ์ธ์ encoding='UTF-8'์ ํ์ผ์ ์ธ์ฝ๋ฉ์ด UTF-8์์ ์ง์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์์ฑ๋ DataFrame์ธ df_product_full์ head(3) ๋ฉ์๋๋ก ํ์ํ๋ฉด DataFrame์ ์ฒซ 3ํ์ด ํ์๋๋ค.
ย
# ์ฝ๋ ์์ 2 (read_csv)
df_product_full = pd.read_csv('../data/P_df_product_full_UTF-8_header.tsv',
dtype={'category_major_cd':str,
'category_medium_cd':str,
'category_small_cd':str},
sep='\t', encoding='UTF-8')
df_product_full.head(3)
ย | product_cd | category_major_cd | category_medium_cd | category_small_cd | unit_price | unit_cost | category_major_name | category_medium_name | category_small_name |
---|---|---|---|---|---|---|---|---|---|
0 | P040101001 | 04 | 0401 | 040101 | 198.0 | 149.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
1 | P040101002 | 04 | 0401 | 040101 | 218.0 | 164.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
2 | P040101003 | 04 | 0401 | 040101 | 230.0 | 173.0 | ๆฃ่ | ๅพก้ฃฏ้ก | ๅผๅฝ้ก |
์ค๋ช :
์ด ์ฝ๋์์๋ '. /data/P_df_product_full_UTF-8_header.tsv'์ ์๋ TSV(Tab-Separated Values) ํ์ผ์์ df_product_full์ด๋ผ๋ pandas DataFrame์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ณ ์์ต๋๋ค.
ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด pd.read_csv() ํจ์๊ฐ ํธ์ถ๋ฉ๋๋ค. ํจ์์ ์ฒซ ๋ฒ์งธ ์ธ์์ธ '. /data/P_df_product_full_UTF-8_header.tsv'๋ ์ฝ์ ํ์ผ์ ๊ฒฝ๋ก์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค.
ํจ์์ ๋ ๋ฒ์งธ ์ธ์์ธ dtype={'category_major_cd':str, 'category_medium_cd':str, 'category_small_cd':str}๋ DataFrame์ ํน์ ์ด์ ๋ฐ์ดํฐ ํ์ ์ ์ง์ ํ๋ค. ๊ตฌ์ฒด์ ์ผ๋ก category_major_cd, category_medium_cd, category_small_cd์ ๊ฐ ์ด์ string(str) ํ์ ์ผ๋ก ์ค์ ํ๊ณ ์๋ค.
์ธ ๋ฒ์งธ ์ธ์ sep='หถ'๋ ํ์ผ ๋ด ๊ฐ์ ์ผํ๊ฐ ์๋ ํญ์ผ๋ก ๊ตฌ๋ถํ ๊ฒ์ ์ง์ ํ๋ค.
๋ค ๋ฒ์งธ ์ธ์ encoding='UTF-8'์ ํ์ผ์ ์ธ์ฝ๋ฉ์ด UTF-8์์ ์ง์ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์์ฑ๋ DataFrame์ธ df_product_full์ head(3) ๋ฉ์๋๋ก ํ์ํ๋ฉด DataFrame์ ์ฒซ 3ํ์ด ํ์๋๋ค.
ย
Comment