๋ฐ์ดํฐ ์ฌ์ด์ธ์ค 100๋ฒ์ ๋ ธํฌ(๊ตฌ์กฐํ ๋ฐ์ดํฐ ์ฒ๋ฆฌํธ) โ Python Part 2 (Q21 to Q40)์ ํด์ค์ ๋๋ค.
ย
ย
์ฒ์์
- ๋จผ์ ๋ค์ ์ ์ ์คํํฉ๋๋ค.
- ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค(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-021: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๊ฑด์๋ฅผ ์ธ์ด๋ผ.
len(df_receipt)
104681
ํด์ค:
์ฝ๋ len(df_receipt)์ DataFrame df_receipt์ ๊ธธ์ด๋ฅผ ๋ฐํํ๋ค.
์๋์์๋ ๊ฐ ๊ตฌ์ฑ ์์์ ๋ํด ์ค๋ช ํ๋ค.
lens(): : ํ์ด์ฌ์ ๋ด์ฅ ํจ์๋ก, ๋ฆฌ์คํธ๋ ๋ฌธ์์ด๊ณผ ๊ฐ์ ๊ฐ์ฒด์ ๊ธธ์ด๋ฅผ ๋ฐํํฉ๋๋ค.
df_receipt : df_receipt : pandas์์ DataFrame ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ณ์์ด๋ฉฐ, df_receipt๋ผ๋ ์ด๋ฆ์ ์์์ ์ ํจํ ๋ณ์๋ช ์ผ ์ ์๋ค.
len()๊ณผ df_receipt์ ์กฐํฉ์ผ๋ก, len() ํจ์์ ์ธ์๋ก DataFrame์ df_receipt๋ฅผ ์ ๋ฌํ์ฌ df_receipt์ ํ ์๋ฅผ ๋ฐํํ๋๋ก ํ์ด์ฌ์ ์์ฒญํ๊ณ ์์ต๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ ๋จ์ํ DataFrame์ ํ ์๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๋ถ๊ณผํ๋ค.
P-022: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๊ณ ๊ฐ ID(customer_id)์ ๋ํด ๊ณ ์ ๊ฑด์๋ฅผ ์ธ์ด๋ผ.
len(df_receipt['customer_id'].unique())
8307
ํค์ค:
len(df_receipt['customer_id'.unique())
len(df_receipt['customer_id'].unique())๋ df_receipt DataFrame์ customer_id ์ด์ ํฌํจ๋ ๊ณ ์ ํ ๊ณ ๊ฐ ID์ ๊ฐ์๋ฅผ ๋ฐํํ๋ ์ฝ๋์ ๋๋ค.
์๋์์๋ ๊ฐ ๊ตฌ์ฑ ์์์ ๋ํด ์ค๋ช ํฉ๋๋ค.
len() : ํ์ด์ฌ์ ๋ด์ฅ ํจ์๋ก ๋ชฉ๋ก์ด๋ ๋ฌธ์์ด ๋ฑ์ ๊ฐ์ฒด์ ๊ธธ์ด๋ฅผ ๋ฐํํฉ๋๋ค.
df_receipt : df_receipt : pandas์์ DataFrame ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ณ์์ด๋ฉฐ, df_receipt๋ผ๋ ์ด๋ฆ์ ์์์ ์ ํจํ ๋ณ์๋ช ์ผ ์ ์๋ค.
['customer_id']: df_receipt์์ customer_id๋ผ๋ ๋ ์ด๋ธ์ ๊ฐ์ง ์ปฌ๋ผ์ ์ ํํ๋ DataFrame ์ธ๋ฑ์ฑ ์์ ์ด๋ค. ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ pandas Series์ ๋๋ค.
.unique(): pandas์ Series ๋ฉ์๋๋ก Series ๋ด์ ๊ณ ์ ํ ๊ฐ์ numpy ๋ฐฐ์ด๋ก ๋ฐํํ๋ค. ์ด ๊ฒฝ์ฐ ๊ณ ์ ํ ๊ณ ๊ฐ ID์ numpy ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
len(), df_receipt['customer_id'].unique(),()๋ฅผ ์กฐํฉํ๊ณ ์๋๋ฐ, len() ํจ์์ ์ธ์๋ก ๊ณ ์ ํ ๊ณ ๊ฐ ID์ numpy ๋ฐฐ์ด์ ์ ๋ฌํ์ฌ ๊ณ ์ ํ ๊ณ ๊ฐ ID์ ๊ฐ์๋ฅผ ๋ฐํํ๋๋ก ํ์ด์ฌ์ ์๊ตฌํ๊ณ ์์ต๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ DataFrame ๋ด์ ๊ณ ์ ํ ๊ณ ๊ฐ ID์ ์๋ฅผ ๋ฐํํ๊ณ ์๋ ๊ฒ์ด๋ค.
P-023: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๋งค์ฅ ์ฝ๋(store_cd)๋ณ ํ๋งค ๊ธ์ก(amount)๊ณผ ํ๋งค ์๋(quantity)์ ํฉ์ฐํ๋ผ.
# ์ฝ๋ ์์ 1
df_receipt.groupby('store_cd').agg({'amount':'sum',
'quantity':'sum'}).reset_index()
ย | store_cd | amount | quantity |
---|---|---|---|
0 | S12007 | 638761 | 2099 |
1 | S12013 | 787513 | 2425 |
2 | S12014 | 725167 | 2358 |
3 | S12029 | 794741 | 2555 |
4 | S12030 | 684402 | 2403 |
5 | S13001 | 811936 | 2347 |
6 | S13002 | 727821 | 2340 |
7 | S13003 | 764294 | 2197 |
8 | S13004 | 779373 | 2390 |
9 | S13005 | 629876 | 2004 |
10 | S13008 | 809288 | 2491 |
11 | S13009 | 808870 | 2486 |
12 | S13015 | 780873 | 2248 |
13 | S13016 | 793773 | 2432 |
14 | S13017 | 748221 | 2376 |
15 | S13018 | 790535 | 2562 |
16 | S13019 | 827833 | 2541 |
17 | S13020 | 796383 | 2383 |
18 | S13031 | 705968 | 2336 |
19 | S13032 | 790501 | 2491 |
20 | S13035 | 715869 | 2219 |
21 | S13037 | 693087 | 2344 |
22 | S13038 | 708884 | 2337 |
23 | S13039 | 611888 | 1981 |
24 | S13041 | 728266 | 2233 |
25 | S13043 | 587895 | 1881 |
26 | S13044 | 520764 | 1729 |
27 | S13051 | 107452 | 354 |
28 | S13052 | 100314 | 250 |
29 | S14006 | 712839 | 2284 |
30 | S14010 | 790361 | 2290 |
31 | S14011 | 805724 | 2434 |
32 | S14012 | 720600 | 2412 |
33 | S14021 | 699511 | 2231 |
34 | S14022 | 651328 | 2047 |
35 | S14023 | 727630 | 2258 |
36 | S14024 | 736323 | 2417 |
37 | S14025 | 755581 | 2394 |
38 | S14026 | 824537 | 2503 |
39 | S14027 | 714550 | 2303 |
40 | S14028 | 786145 | 2458 |
41 | S14033 | 725318 | 2282 |
42 | S14034 | 653681 | 2024 |
43 | S14036 | 203694 | 635 |
44 | S14040 | 701858 | 2233 |
45 | S14042 | 534689 | 1935 |
46 | S14045 | 458484 | 1398 |
47 | S14046 | 412646 | 1354 |
48 | S14047 | 338329 | 1041 |
49 | S14048 | 234276 | 769 |
50 | S14049 | 230808 | 788 |
51 | S14050 | 167090 | 580 |
ํด์ค:
df_receipt.groupby('store_cd').agg({'amount':'sum', 'quantity':'sum'}).reset_index()๋ผ๋ ์ฝ๋๋ df_receipt DataFrame์ ํ์ store_cd ์ด๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ ๊ทธ๋ฃน ๋ด ํด๋น ์ด์ ๋ ๊ฐ์ ์ง๊ณ ํจ์(๊ธ์ก๊ณผ ์๋์ ๋ํ sum() )๋ฅผ ๊ฑธ๊ณ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ๊ณ ์์ต๋๋ค.
๋ค์์ ๊ฐ ๊ตฌ์ฑ ์์์ ๋ํ ์ค๋ช ์ด๋ค.
df_receipt: df_receipt: pandas์ DataFrame ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ณ์์ด๋ฉฐ, df_receipt๋ผ๋ ์ด๋ฆ์ ์ ํจํ ๋ณ์ ์ด๋ฆ์ด๋ฉด ๋ฌด์์ด๋ ์๊ด์๋ค.
.groupby('store_cd'): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ํ์ store_cd ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๋ค. ๊ฐ ๊ทธ๋ฃน์ ๊ฐ๋ณ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ GroupBy ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
.agg({'amount':'sum', 'quantity':'sum'}): pandas์ GroupBy ๊ฐ์ฒด์ ๋ฉ์๋์ด๋ฉฐ, GroupBy ๊ฐ์ฒด์ ๊ฐ ๊ทธ๋ฃน์ amount ์ด๊ณผ quantity ์ด์ sum() ์ง๊ณ ํจ์๋ฅผ ์ ์ฉํ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๊ฐ ๊ทธ๋ฃน์ ํด๋น ์ด์ ํฉ๊ณ๋ฅผ ํฌํจํ๋ amount์ quantity ๋ ๊ฐ์ ์ด์ ๊ฐ์ง DataFrame์ด ๋ฉ๋๋ค.
.reset_index(): ์ด๊ฒ์ pandas์ DataFrame ๋ฉ์๋๋ก, ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํฉ๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ ํน์ ์ด์ ๊ฐ์ผ๋ก DataFrame์ ํ์ ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ๋ค๋ฅธ ๋ ์ด์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ์ด๋ค ์ด์ ํฉ๊ณ์ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง DataFrame์ ๋ฐํํ๊ณ ์์ต๋๋ค.
# ์ฝ๋ ์์ 2
df_receipt.groupby('store_cd')[['amount','quantity']].agg('sum').reset_index()
ย | store_cd | amount | quantity |
---|---|---|---|
0 | S12007 | 638761 | 2099 |
1 | S12013 | 787513 | 2425 |
2 | S12014 | 725167 | 2358 |
3 | S12029 | 794741 | 2555 |
4 | S12030 | 684402 | 2403 |
5 | S13001 | 811936 | 2347 |
6 | S13002 | 727821 | 2340 |
7 | S13003 | 764294 | 2197 |
8 | S13004 | 779373 | 2390 |
9 | S13005 | 629876 | 2004 |
10 | S13008 | 809288 | 2491 |
11 | S13009 | 808870 | 2486 |
12 | S13015 | 780873 | 2248 |
13 | S13016 | 793773 | 2432 |
14 | S13017 | 748221 | 2376 |
15 | S13018 | 790535 | 2562 |
16 | S13019 | 827833 | 2541 |
17 | S13020 | 796383 | 2383 |
18 | S13031 | 705968 | 2336 |
19 | S13032 | 790501 | 2491 |
20 | S13035 | 715869 | 2219 |
21 | S13037 | 693087 | 2344 |
22 | S13038 | 708884 | 2337 |
23 | S13039 | 611888 | 1981 |
24 | S13041 | 728266 | 2233 |
25 | S13043 | 587895 | 1881 |
26 | S13044 | 520764 | 1729 |
27 | S13051 | 107452 | 354 |
28 | S13052 | 100314 | 250 |
29 | S14006 | 712839 | 2284 |
30 | S14010 | 790361 | 2290 |
31 | S14011 | 805724 | 2434 |
32 | S14012 | 720600 | 2412 |
33 | S14021 | 699511 | 2231 |
34 | S14022 | 651328 | 2047 |
35 | S14023 | 727630 | 2258 |
36 | S14024 | 736323 | 2417 |
37 | S14025 | 755581 | 2394 |
38 | S14026 | 824537 | 2503 |
39 | S14027 | 714550 | 2303 |
40 | S14028 | 786145 | 2458 |
41 | S14033 | 725318 | 2282 |
42 | S14034 | 653681 | 2024 |
43 | S14036 | 203694 | 635 |
44 | S14040 | 701858 | 2233 |
45 | S14042 | 534689 | 1935 |
46 | S14045 | 458484 | 1398 |
47 | S14046 | 412646 | 1354 |
48 | S14047 | 338329 | 1041 |
49 | S14048 | 234276 | 769 |
50 | S14049 | 230808 | 788 |
51 | S14050 | 167090 | 580 |
ํด์ค:
์ด ์ฝ๋์์๋ df_receipt ๋ฐ์ดํฐ ํ๋ ์์ ๋ํด store_cd ์ปฌ๋ผ์ ์ฌ์ฉํ์ฌ groupby ์ฐ์ฐ์ ์ํํ๊ณ amount์ quantity ์ปฌ๋ผ์ ํฉ์ฐํ์ฌ ์ง๊ณํ๋ค.
๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์ store_cd ์ปฌ๋ผ์ ๊ณ ์ ํ ๊ฐ๋ง๋ค ํ๋์ ํ๊ณผ amount์ quantity ๋ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง๋ฉฐ, ๋ ์ปฌ๋ผ ๋ชจ๋ ๋์ผํ store_cd ๊ฐ์ ๊ฐ์ง ๋ชจ๋ ํ์ ๊ฐ ๊ฐ์ ํฉ๊ณ๋ฅผ ํฌํจํ๋ค.
๊ทธ๋ฐ ๋ค์ .reset_index() ๋ฉ์๋๊ฐ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์์ ํธ์ถ๋์ด store_cd ์ปฌ๋ผ์ ์ธ๋ฑ์ค์์ ์ผ๋ฐ ์ปฌ๋ผ์ผ๋ก ๋ณํํ๋ค.
P-024: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๊ณ ๊ฐ ID(customer_id)๋ณ๋ก ๊ฐ์ฅ ์ต๊ทผ ๋งค์ถ ๋ ์ง(sales_ymd)๋ฅผ ๊ตฌํ์ฌ 10๊ฑด ํ์ํ๋ผ.
df_receipt.groupby('customer_id').agg({'sales_ymd': 'max'}).reset_index().head(10)
ย | customer_id | sales_ymd |
---|---|---|
0 | CS001113000004 | 20190308 |
1 | CS001114000005 | 20190731 |
2 | CS001115000010 | 20190405 |
3 | CS001205000004 | 20190625 |
4 | CS001205000006 | 20190224 |
5 | CS001211000025 | 20190322 |
6 | CS001212000027 | 20170127 |
7 | CS001212000031 | 20180906 |
8 | CS001212000046 | 20170811 |
9 | CS001212000070 | 20191018 |
ํด์ค:
์ด ์ฝ๋์์๋ df_receipt๋ผ๋ DataFrame์ ๋ํด customer_id ์ปฌ๋ผ์ ๊ธฐ๋ฐ์ผ๋ก groupby ์ฐ์ฐ์ ์คํํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ ๊ทธ๋ฃน์ sales_ymd ์ปฌ๋ผ์ ๊ฐ์ max ํจ์๋ก ์ง๊ณํ์ฌ ๊ฐ ๊ณ ๊ฐ์ ์ต์ ๊ตฌ๋งค์ผ์ ๊ตฌํ๊ณ ์์ต๋๋ค.
์ง๊ณ ๊ฒฐ๊ณผ customer_id์ sales_ymd ๋ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง ์๋ก์ด DataFrame์ด ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ reset_index ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ค์ ํ๊ณ head(10) ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ DataFrame์ ์ฒ์ 10๊ฐ์ ํ์ ํ์ํฉ๋๋ค.
์ฆ, ์ด ์ฝ๋์ ์ถ๋ ฅ์ ๊ฐ customer_id์ ์ต๋ ๊ตฌ๋งค์ผ(sales_ymd)์ ๋ํ๋ด๋ DataFrame์ด๋ฉฐ, ์ฒ์ 10์ค๋ง ํ์๋ฉ๋๋ค.
ย
P-025: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๊ณ ๊ฐ ID(customer_id)๋ณ๋ก ๊ฐ์ฅ ์ค๋๋ ๋งค์ถ ๋ ์ง(sales_ymd)๋ฅผ ๊ตฌํ์ฌ 10๊ฑด ํ์ํ๋ผ.
# 024์ ๊ฐ์ ๋ฐฉ์์ผ๋ก๋ ์์ฑํ ์ ์์ง๋ง ๊ตณ์ด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์์ฑํ์ฌ ํด๋ต ์์๋ฅผ ์๊ฐํฉ๋๋ค.
df_receipt.groupby('customer_id').sales_ymd.min().reset_index().head(10)
ย | customer_id | sales_ymd |
---|---|---|
0 | CS001113000004 | 20190308 |
1 | CS001114000005 | 20180503 |
2 | CS001115000010 | 20171228 |
3 | CS001205000004 | 20170914 |
4 | CS001205000006 | 20180207 |
5 | CS001211000025 | 20190322 |
6 | CS001212000027 | 20170127 |
7 | CS001212000031 | 20180906 |
8 | CS001212000046 | 20170811 |
9 | CS001212000070 | 20191018 |
ํด์ค:
df_receipt.groupby('customer_id').agg({'sales_ymd': 'max'}).reset_index().head(10)๋ df_receipt DataFrame ์ ํ์ customer_id ์ด๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ ๊ทธ๋ฃน ์ sales_ymd ์ด์ max() ์ง์ฝ ํจ์๋ฅผ ์ ์ฉํ๊ณ ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ์ฌ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํฉ๋๋ค.
๋ค์์ ๊ฐ ์ปดํฌ๋ํธ์ ๋ํ ์ค๋ช ์ ๋๋ค.
df_receipt: df_receipt: pandas์ DataFrame ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ณ์์ด๋ฉฐ, df_receipt๋ผ๋ ์ด๋ฆ์ ์์์ ์ ํจํ ๋ณ์ ์ด๋ฆ์ผ ์ ์๋ค.
.groupby('customer_id'): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ํ์ customer_id ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๋ค. ๊ฐ ๊ทธ๋ฃน์ ๊ฐ๋ณ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ GroupBy ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
.agg({'sales_ymd': 'max'}): pandas์ GroupBy ๊ฐ์ฒด์ ๋ฉ์๋์ด๋ฉฐ, GroupBy ๊ฐ์ฒด์ ๊ฐ ๊ทธ๋ฃน์ sales_ymd ์ปฌ๋ผ์ max() ์ง๊ณ ํจ์๋ฅผ ์ ์ฉํ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๊ฐ ๊ทธ๋ฃน์ sales_ymd ์ปฌ๋ผ์ ์ต๋๊ฐ์ ํฌํจํ๋ sales_ymd ์ปฌ๋ผ์ ํ๋ ๊ฐ์ง DataFrame์ด ๋๋ค.
.reset_index() : pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํ๋ค.
.head(10) : pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ์ฒซ 10๊ฐ์ ํ์ ๋ฐํํ๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ DataFrame์ ํ์ ํน์ ์ด์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ๋ค๋ฅธ ์ด์ ์ต๋๊ฐ์ ๊ตฌํ๊ณ , ์ต๋๊ฐ๊ณผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๊ฐ ์๋ DataFrame์ ๋ฐํํ๊ณ , ํด๋น DataFrame์ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํ๊ณ ์์ต๋๋ค. ์ด ์ฝ๋๋ ๊ฐ ๊ณ ๊ฐ์ ์ต๊ทผ ๊ตฌ๋งค ๋ ์ง๋ฅผ ํ์ ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
P-026: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๊ณ ๊ฐ ID(customer_id)๋ณ๋ก ๊ฐ์ฅ ์ต๊ทผ ๋งค์ถ ๋ ์ง(sales_ymd)์ ๊ฐ์ฅ ์ค๋๋ ๋งค์ถ ๋ ์ง(sales_ymd)๋ฅผ ๊ตฌํ๊ณ , ์์๊ฐ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ 10๊ฑด์ ํ์ํ๋ผ.
df_tmp = df_receipt.groupby('customer_id'). \
agg({'sales_ymd':['max','min']}).reset_index()
# ๋ค์ค ์ธ๋ฑ์ค(ํญ๋ชฉ) ๊ณ์ธต์ "_"๋ก ์ฐ๊ฒฐํ์ฌ 1๊ณ์ธต ์ธ๋ฑ์ค(ํญ๋ชฉ)๋ก ๋ง๋ค๊ธฐ
# df_tmp.columns = ['customer_id', 'sales_ymd_max', 'sales_ymd_min']์ผ๋ก ํด๋ ๋๋ค.
df_tmp.columns = ["_".join(pair) for pair in df_tmp.columns]
df_tmp.query('sales_ymd_max != sales_ymd_min').head(10)
ย
ย | customer_id_ | sales_ymd_max | sales_ymd_min |
---|---|---|---|
1 | CS001114000005 | 20190731 | 20180503 |
2 | CS001115000010 | 20190405 | 20171228 |
3 | CS001205000004 | 20190625 | 20170914 |
4 | CS001205000006 | 20190224 | 20180207 |
13 | CS001214000009 | 20190902 | 20170306 |
14 | CS001214000017 | 20191006 | 20180828 |
16 | CS001214000048 | 20190929 | 20171109 |
17 | CS001214000052 | 20190617 | 20180208 |
20 | CS001215000005 | 20181021 | 20170206 |
21 | CS001215000040 | 20171022 | 20170214 |
ํด์ค:
์ฝ๋ df_tmp = df_receipt.groupby('customer_id').agg({'sales_ymd':['max','min']}).reset_index() df_tmp.query('sales_ymd_max ! = sales_ymd_min'). head(10)์ df_receipt DataFrame์ ํ์ customer_id ์ด๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ sales_ymd ์ด์ ๋ ๊ฐ์ ์ง๊ณ ํจ์(max(), min())๋ฅผ ์ ์ฉํ์ฌ ๊ฐ ๊ณ ๊ฐ์ ๊ตฌ๋งค ๋ ์ง์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ํฌํจํ DataFrame์ ๋ฐํํ๋ค. ๊ทธ๋ฆฌ๊ณ query() ๋ฉ์๋์์ ์ต๋ ๊ตฌ๋งค์ผ๊ณผ ์ต์ ๊ตฌ๋งค์ผ์ด ๋ค๋ฅธ ํ๋ง ์ ํํ์ฌ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํฉ๋๋ค.
๋ค์์ ๊ฐ ์ปดํฌ๋ํธ์ ๋ํ ์ค๋ช ์ ๋๋ค.
df_receipt: df_receipt: pandas์์ DataFrame ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ณ์์ด๋ฉฐ, df_receipt๋ผ๋ ์ด๋ฆ์ ์์์ ์ ํจํ ๋ณ์ ์ด๋ฆ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
.groupby('customer_id'): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ํ์ customer_id ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๋ค. ๊ฐ ๊ทธ๋ฃน์ ๊ฐ๋ณ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ GroupBy ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
.agg({'sales_ymd':['max','min']}): pandas์ GroupBy ๊ฐ์ฒด์ ๋ฉ์๋๋ก, GroupBy ๊ฐ์ฒด์ ๊ฐ ๊ทธ๋ฃน์ sales_ymd ์ปฌ๋ผ์ ๋ ๊ฐ์ ์ง๊ณ ํจ์(max()์ min())๋ฅผ ์ ์ฉํ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๊ฐ ๊ทธ๋ฃน์ sales_ymd ์ปฌ๋ผ์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๊ฐ๊ฐ ํฌํจํ๋ sales_ymd_max์ sales_ymd_min์ด๋ผ๋ ๋ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง DataFrame์ด ๋ฉ๋๋ค.
.reset_index() : ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํ๋ pandas DataFrame ๋ฉ์๋์ ๋๋ค.
.query('sales_ymd_max ! = sales_ymd_min') : sales_ymd_max ์ด์ ๊ฐ์ด sales_ymd_min ์ด์ ๊ฐ๊ณผ ๊ฐ์ง ์์ DataFrame์ ํ๋ง ์ ํํ๋ pandas DataFrame ๋ฉ์๋์ด๋ค. ์ด๋ query() ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌ๋ ๋ฌธ์์ด์ ๋ถ์ธ ์์ ์ฌ์ฉํ์ฌ ์ํํ๋ค.
.head(10)์ด๋ค. ์ด๊ฒ์ pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํฉ๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ DataFrame์ ํ์ ํน์ ์ด์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ๋ค๋ฅธ ์ด์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๊ตฌํ๊ณ , ์ต๋๊ฐ๊ณผ ์ต์๊ฐ, ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๊ฐ ํฌํจ๋ DataFrame์ ๋ฐํํ๋ค. ๊ทธ๋ฐ ๋ค์ ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ด ๋ค๋ฅธ ํ๋ง ์ ํํ๊ณ ๊ฒฐ๊ณผ DataFrame์ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํ๋ค. ์ด ์ฝ๋๋ ๋ค๋ฅธ ๋ ์ง์ ๊ตฌ๋งคํ ๊ณ ๊ฐ์ ์๋ณํ๋ ๋ฐ ์ ์ฉํ๋ค.
ย
P-027: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๋งค์ฅ ์ฝ๋(store_cd)๋ณ ๋งค์ถ ๊ธ์ก(amount)์ ํ๊ท ์ ๊ณ์ฐํ์ฌ ๋ด๋ฆผ์ฐจ์์ผ๋ก TOP5๋ฅผ ํ์ํ๋ผ.
df_receipt.groupby('store_cd').agg({'amount':'mean'}).reset_index(). \
sort_values('amount', ascending=False).head(5)
ย | store_cd | amount |
---|---|---|
28 | S13052 | 402.867470 |
12 | S13015 | 351.111960 |
7 | S13003 | 350.915519 |
30 | S14010 | 348.791262 |
5 | S13001 | 348.470386 |
ํด์ค:
df_receipt.groupby('store_cd').agg({'amount':'mean'}).reset_index().sort_values('amount', ascending=False).head(5)๋ df_receipt DataFrame์ ํ์ store_cd ์ปฌ๋ผ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด amount ์ปฌ๋ผ์ ํ๊ท ๊ฐ์ ๊ณ์ฐํ์ฌ ํ๊ท ๊ฐ๊ณผ store_cd ์ปฌ๋ผ์ผ๋ก DataFrame์ ๋ฐํํ๋ ์ฝ๋์ด๋ค. ๊ทธ๋ฐ ๋ค์, ์ป์ด์ง DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ๊ณ ๊ธ์ก์ ํ๊ท ๊ฐ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค. ๋ง์ง๋ง์ผ๋ก ๊ฒฐ๊ณผ DataFrame์ ์ฒ์ 5์ค์ ๋ฐํํ๋ค.
๋ค์์ ๊ฐ ์ปดํฌ๋ํธ์ ๋ํ ์ค๋ช ์ ๋๋ค.
df_receipt: df_receipt: pandas์ DataFrame ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ณ์์ด๋ฉฐ, df_receipt๋ผ๋ ์ด๋ฆ์ ์ ํจํ ๋ณ์ ์ด๋ฆ์ด๋ฉด ๋ฌด์์ด๋ ์๊ด์๋ค.
.groupby('store_cd'): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ํ์ store_cd ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๋ค. ๊ฐ ๊ทธ๋ฃน์ ๊ฐ๋ณ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ GroupBy ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
.agg({'amount':'mean'}): pandas์ GroupBy ๊ฐ์ฒด์ ๋ฉ์๋์ด๋ฉฐ, GroupBy ๊ฐ์ฒด์ ๊ฐ ๊ทธ๋ฃน์ amount ์ด์ mean() ์ง๊ณ ํจ์๋ฅผ ์ ์ฉํ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๊ฐ ๊ทธ๋ฃน์ ๊ธ์ก ์ปฌ๋ผ์ ํ๊ท ๊ฐ์ ํฌํจํ๋ amount๋ผ๋ ํ๋์ ์ปฌ๋ผ์ ๊ฐ์ง DataFrame์ด ๋ฉ๋๋ค.
.reset_index(): ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํ๋ pandas์ DataFrame ๋ฉ์๋์ ๋๋ค.
.sort_values('amount', ascending=False): pandas์ DataFrame ๋ฉ์๋๋ก DataFrame์ ํ์ amount ์ด์ ๊ฐ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ฉฐ, ascending=False ํ๋ผ๋ฏธํฐ๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๊ฒ์ ์ง์ ํฉ๋๋ค. ์ ์ง์ ํฉ๋๋ค.
.head(5): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ์ฒ์ 5์ค์ ๋ฐํํฉ๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ DataFrame์ ํ์ ํน์ ์ด์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ๋ค๋ฅธ ์ด์ ํ๊ท ๊ฐ์ ๊ตฌํ๊ณ , ํ๊ท ๊ฐ๊ณผ ๊ทธ๋ฃนํ๋ ์ด์ ํฌํจํ DataFrame์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ป์ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ๊ณ ํ๊ท ๊ฐ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ป์ DataFrame์ ์ฒ์ 5๊ฐ ํ์ ๋ฐํํฉ๋๋ค. ์ด ์ฝ๋๋ ํ๊ท ๋งค์ถ์ด ๊ฐ์ฅ ๋์ ๋งค์ฅ์ ์๋ณํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
ย
P-028: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๋งค์ฅ ์ฝ๋(store_cd)๋ณ ๋งค์ถ ๊ธ์ก(amount)์ ์ค์๊ฐ์ ๊ณ์ฐํ์ฌ ๋ด๋ฆผ์ฐจ์์ผ๋ก TOP5๋ฅผ ํ์ํ๋ผ.
df_receipt.groupby('store_cd').agg({'amount':'median'}).reset_index(). \
sort_values('amount', ascending=False).head(5)
ย | store_cd | amount |
---|---|---|
28 | S13052 | 190.0 |
30 | S14010 | 188.0 |
51 | S14050 | 185.0 |
44 | S14040 | 180.0 |
7 | S13003 | 180.0 |
ํด์ค:
df_receipt.groupby('store_cd').agg({'amount':'median'}).reset_index().sort_values('amount', ascending=False).head(5)๋ df_receipt DataFrame์ ํ์ store_cd ์ปฌ๋ผ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด amount ์ปฌ๋ผ์ ์ค์๊ฐ์ ๊ณ์ฐํ์ฌ store_cd ์ปฌ๋ผ๊ณผ ์ค์๊ฐ์ผ๋ก DataFrame์ ๋ฐํํ๊ณ ์๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ๊ณ ๊ธ์ก์ ์ค์๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ๊ฒฐ๊ณผ DataFrame์ ์ฒ์ 5์ค์ ๋ฐํํฉ๋๋ค.
๋ค์์ ๊ฐ ์ปดํฌ๋ํธ์ ๋ํ ์ค๋ช ์ ๋๋ค.
df_receipt: df_receipt: pandas์ DataFrame ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ณ์์ด๋ฉฐ, df_receipt๋ผ๋ ์ด๋ฆ์ ์ ํจํ ๋ณ์ ์ด๋ฆ์ด๋ฉด ๋ฌด์์ด๋ ์๊ด์๋ค.
.groupby('store_cd'): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ํ์ store_cd ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๋ค. ๊ฐ ๊ทธ๋ฃน์ ๊ฐ๋ณ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ GroupBy ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
.agg({'amount':'median'}): pandas์ GroupBy ๊ฐ์ฒด์ ๋ฉ์๋์ด๋ฉฐ, GroupBy ๊ฐ์ฒด์ ๊ฐ ๊ทธ๋ฃน์ amount ์ปฌ๋ผ์ median() ์ง๊ณ ํจ์๋ฅผ ์ ์ฉํ๊ณ ์์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๊ฐ ๊ทธ๋ฃน์ amount ์ปฌ๋ผ์ ์ค์๊ฐ์ ํฌํจํ๋ amount๋ผ๋ ํ๋์ ์ปฌ๋ผ์ ๊ฐ์ง DataFrame์ด ๋๋ค.
.reset_index(): ์ด๊ฒ์ pandas์ DataFrame ๋ฉ์๋๋ก, ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํ๊ณ ์์ต๋๋ค.
.sort_values('amount', ascending=False): pandas์ DataFrame ๋ฉ์๋๋ก DataFrame์ ํ์ amount ์ด์ ๊ฐ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ DataFrame ๋ฉ์๋์ด๋ฉฐ, ascending=False ํ๋ผ๋ฏธํฐ๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๊ฒ์ ์ง์ ํ๋ค. ์ ์ง์ ํฉ๋๋ค.
.head(5): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ์ฒ์ 5์ค์ ๋ฐํํ๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ DataFrame์ ํ์ ํน์ ์ด์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ๋ค๋ฅธ ์ด์ ์ค์๊ฐ์ ๊ตฌํ๊ณ , ์ค์๊ฐ๊ณผ ๊ทธ๋ฃนํ๋ ์ด์ด ํฌํจ๋ DataFrame์ ๋ฐํํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ป์ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ๊ณ ์ค์๊ฐ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ป์ DataFrame์ ์ฒ์ 5๊ฐ ํ์ ๋ฐํํฉ๋๋ค. ์ด ์ฝ๋๋ ๋งค์ถ์ ์ค์๊ฐ์ด ๊ฐ์ฅ ๋์ ๋งค์ฅ์ ์๋ณํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
ย
P-029: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๋งค์ฅ ์ฝ๋(store_cd)๋ณ๋ก ์ํ ์ฝ๋(product_cd)์ ์ต๋น๊ฐ์ ๊ตฌํ์ฌ 10๊ฑด์ฉ ํ์ํ๋ผ.
df_receipt.groupby('store_cd').product_cd. \
apply(lambda x: x.mode()).reset_index().head(10)
ย | store_cd | level_1 | product_cd |
---|---|---|---|
0 | S12007 | 0 | P060303001 |
1 | S12013 | 0 | P060303001 |
2 | S12014 | 0 | P060303001 |
3 | S12029 | 0 | P060303001 |
4 | S12030 | 0 | P060303001 |
5 | S13001 | 0 | P060303001 |
6 | S13002 | 0 | P060303001 |
7 | S13003 | 0 | P071401001 |
8 | S13004 | 0 | P060303001 |
9 | S13005 | 0 | P040503001 |
ํค์ค:
df_receipt.groupby('store_cd').product_cd.apply(lambda x: x.mode()).reset_index().head(10)๋ df_receipt DataFrame์ ํ์ store_cd ์ด๋ก ๊ทธ๋ฃนํํ์ฌ, ๊ฐ ๊ทธ๋ฃน์ ๋ํด product_cd ์ด์ ๋ชจ๋ ๊ฐ์ ๊ตฌํ๋ ์ฝ๋์ ๋๋ค. reset_index() ๋ฉ์๋๋ ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํ๋ ๋ฉ์๋์ด๋ฉฐ, ํด๋น ๋ชจ๋ ๊ฐ๊ณผ store_cd ์ด์ด ํฌํจ๋ DataFrame์ ๋ฐํํ๋ค.
๋ค์์ ๊ฐ ์ปดํฌ๋ํธ์ ๋ํ ์ค๋ช ์ ๋๋ค.
df_receipt: df_receipt: pandas์์ DataFrame ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ณ์์ด๋ฉฐ, df_receipt๋ผ๋ ์ด๋ฆ์ ์์์ ์ ํจํ ๋ณ์ ์ด๋ฆ์ผ ์ ์๋ค.
.groupby('store_cd'): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ํ์ store_cd ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๋ค. ๊ฐ ๊ทธ๋ฃน์ ๊ฐ๋ณ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ GroupBy ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
.product_cd : DataFrame์ product_cd ์ปฌ๋ผ์ ์ ๊ทผํ๋ pandas DataFrame ์์ฑ์ ๋๋ค.
.apply(lambda x: x.mode()) : pandas GroupBy ๊ฐ์ฒด์ ๊ฐ ๊ทธ๋ฃน์ mode() ํจ์๋ฅผ ์ ์ฉํ๋ pandas GroupBy ๊ฐ์ฒด์ ๋ฉ์๋์ด๋ฉฐ, mode() ํจ์๋ ๊ฐ ๊ทธ๋ฃน์์ ๊ฐ์ฅ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ๊ฐ์ ๋ฐํํ๋ค. ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ ์๋ ๊ทธ๋ฃน๊ณผ ๋์ผํ ๊ธธ์ด์ ์๋ฆฌ์ฆ์ ๋๋ค.
.reset_index(): pandas์ DataFrame ๋ฉ์๋๋ก, ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํฉ๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ ํน์ ์ด์ ๊ฐ์ผ๋ก DataFrame์ ํ์ ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ๋ค๋ฅธ ์ด์ ๋ชจ๋ ๊ฐ์ ๊ตฌํ๊ณ , ๋ชจ๋ ๊ฐ๊ณผ ๊ทธ๋ฃนํ ๋ ์ด์ ํฌํจํ๋ DataFrame์ ๋ฐํํ๊ณ ์์ต๋๋ค. ์ฌ์ฉ๋ฉ๋๋ค. ์ด ์ฝ๋๋ ๊ฐ ๋งค์ฅ์์ ํ๋งค๋๋ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์ํ์ ํ์ ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
ย
P-030: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๋งค์ฅ ์ฝ๋(store_cd)๋ณ ๋งค์ถ ๊ธ์ก(amount)์ ๋ถ์ฐ์ ๊ณ์ฐํ์ฌ ๋ด๋ฆผ์ฐจ์์ผ๋ก 5๊ฐ์ฉ ํ์ํ์์ค.
df_receipt.groupby('store_cd').amount.var(ddof=0).reset_index(). \
sort_values('amount', ascending=False).head(5)
ย | store_cd | amount |
---|---|---|
28 | S13052 | 440088.701311 |
31 | S14011 | 306314.558164 |
42 | S14034 | 296920.081011 |
5 | S13001 | 295431.993329 |
12 | S13015 | 295294.361116 |
ํด์ค:
df_receipt.groupby('store_cd').amount.var(ddof=0).reset_index().sort_values('amount', ascending=False).head(5)๋ df_receipt DataFrame์ ํ์ store_cd ์ด๋ก ๊ทธ๋ฃนํํ๊ณ , ddof=0์ผ๋ก ๊ฐ ๊ทธ๋ฃน์ ๋ํด ๊ธ์ก ์ด์ ๋ํ ๋ถ์ฐ์ ๊ณ์ฐํ์ฌ ๊ทธ ๋ถ์ฐ ๊ฐ๊ณผ store_cd ์ด์ ๋ฐ์ดํฐ ํ๋ ์์ ๋ฐํํ๋ ์ฝ๋์ ๋๋ค. reset_index() ๋ฉ์๋๋ ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ DataFrame์ ๋ถ์ฐ๊ฐ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ฒ์ 5๊ฐ ํ์ ๋ฐํํ๋ค.
๋ค์์ ๊ฐ ๊ตฌ์ฑ ์์์ ๋ํ ์ค๋ช ์ ๋๋ค.
df_receipt: df_receipt: pandas์ DataFrame ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ณ์์ด๋ฉฐ, df_receipt๋ผ๋ ์ด๋ฆ์ ์์์ ์ ํจํ ๋ณ์ ์ด๋ฆ์ผ ์ ์๋ค.
.groupby('store_cd'): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ํ์ store_cd ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ๊ทธ๋ฃน์ ๊ฐ๋ณ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ GroupBy ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค.
.amount.var(ddof=0): GroupBy ๊ฐ์ฒด์ ๊ฐ ๊ทธ๋ฃน์ ๋ํด ddof=0์ผ๋ก amount ์ด์ ๋ถ์ฐ์ ๊ณ์ฐํ๋ pandas DataFrame ๋ฉ์๋์ด๋ฉฐ, ddof ๋งค๊ฐ ๋ณ์๋ ํ๋ณธ ๋ถ์ฐ ๊ณ์ฐ์ ์ฌ์ฉํ ์ ๊ณฑ๊ทผ์ธ ์์ ๋ ๋ธํ๋ฅผ ์ง์ ํฉ๋๋ค. ddof์ 0์ ์ง์ ํ๋ฉด ํ๋ณธ ๋ถ์ฐ์ด ์๋ ๋ชจ์ง๋จ ๋ถ์ฐ์ ๊ณ์ฐํด์ผ ํจ์ ๋ํ๋ธ๋ค. ๊ฒฐ๊ณผ๋ ๋ถ์ฐ๊ฐ๊ณผ store_cd ๊ฐ์ ์ธ๋ฑ์ค๋ก ํ๋ Series์ ๋๋ค.
.reset_index() : pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํ๋ ๋ฉ์๋์ ๋๋ค.
.sort_values('amount', ascending=False) : pandas์ DataFrame ๋ฉ์๋๋ก DataFrame์ ํ์ amount ์ด์ ๊ฐ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ DataFrame ๋ฉ์๋์ด๋ฉฐ, ascending=False ํ๋ผ๋ฏธํฐ๋ ์ ๋ ฌ ์์๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ํ ๊ฒ ์ ์ง์ ํฉ๋๋ค.
.head(5): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ์ฒ์ 5์ค์ ๋ฐํํฉ๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ DataFrame์ ํ์ ํน์ ์ด์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ๋ค๋ฅธ ์ด์ ๋ชจ๋ถ์ฐ์ ๊ตฌํ๊ณ , ๋ถ์ฐ ๊ฐ๊ณผ ๊ทธ๋ฃนํ ๋ ์ด์ ํฌํจํ๋ DataFrame์ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ป์ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ๊ณ ๋ถ์ฐ๊ฐ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ป์ DataFrame์ ์ฒ์ 5๊ฐ ํ์ ๋ฐํํฉ๋๋ค. ์ด ์ฝ๋๋ ๋งค์ถ ๋ณ๋์ด ํฐ ๋งค์ฅ์ ์๋ณํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
P-031: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๋งค์ฅ ์ฝ๋(store_cd)๋ณ ๋งค์ถ ๊ธ์ก(amount)์ ํ์คํธ์ฐจ๋ฅผ ๊ณ์ฐํ์ฌ ๋ด๋ฆผ์ฐจ์์ผ๋ก 5๊ฑด์ฉ ํ์ํ๋ผ.
TIPS:
Pandas์ Numpy์์ ddof์ ๊ธฐ๋ณธ๊ฐ์ด ๋ค๋ฅด๋ค๋ ์ ์ ์ฃผ๋ชฉํ์Pandas๏ผ DataFrame.std(self, axis=None, skipna=None, level=None, ddof=1, numeric_only=None, **kwargs) Numpy: numpy.std(a, axis=None, dtype=None, out=None, ddof=0, keepdims=)
df_receipt.groupby('store_cd').amount.std(ddof=0).reset_index(). \
sort_values('amount', ascending=False).head(5)
ย | store_cd | amount |
---|---|---|
28 | S13052 | 663.391816 |
31 | S14011 | 553.456916 |
42 | S14034 | 544.903736 |
5 | S13001 | 543.536561 |
12 | S13015 | 543.409938 |
ํด์ค:ย
df_receipt.groupby('store_cd').amount.std(ddof=0).reset_index().sort_values('amount', ascending=False).head(5)๋ df_receipt DataFrame ์ ํ์ store_cd ์ด๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ddof=0์ผ๋ก amount ์ด์ ํ์ค ํธ์ฐจ๋ฅผ ๊ณ์ฐํ์ฌ ํ์ค ํธ์ฐจ ๊ฐ๊ณผ store_cd ์ด์ด ์๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋ฐํํ๋ ์ฝ๋์ ๋๋ค. ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ป์ DataFrame์ ํ์คํธ์ฐจ ๊ฐ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ฒ์ 5๊ฐ ํ์ ๋ฐํํฉ๋๋ค.
๋ค์์ ๊ฐ ๊ตฌ์ฑ ์์์ ๋ํ ์ค๋ช ์ ๋๋ค.
df_receipt: df_receipt: pandas์ DataFrame ๊ฐ์ฒด๋ฅผ ๋ํ๋ด๋ ๋ณ์์ด๋ฉฐ, df_receipt๋ผ๋ ์ด๋ฆ์ ์์์ ์ ํจํ ๋ณ์ ์ด๋ฆ์ผ ์ ์๋ค.
.groupby('store_cd'): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ํ์ store_cd ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ๊ทธ๋ฃน์ ๊ฐ๋ณ์ ์ผ๋ก ํจ์๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ GroupBy ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค.
.amount.std(ddof=0) : GroupBy ๊ฐ์ฒด์ ๊ฐ ๊ทธ๋ฃน์ amount ์ด์ ํ์คํธ์ฐจ๋ฅผ ddof=0์ผ๋ก ๊ณ์ฐํ๋ pandas DataFrame ๋ฉ์๋์ ๋๋ค. degrees of freedom)๋ฅผ ์ง์ ํ๋๋ฐ, ddof์ 0์ ์ง์ ํ๋ฉด ํ๋ณธ ํ์คํธ์ฐจ๊ฐ ์๋ ๋ชจ์ง๋จ์ ํ์คํธ์ฐจ๋ฅผ ๊ณ์ฐํ๊ฒ ๋๋ค. ๊ฒฐ๊ณผ๋ ํ์คํธ์ฐจ ๊ฐ๊ณผ store_cd์ ๊ฐ์ ์ธ๋ฑ์ค๋ก ํ๋ Series๊ฐ ๋๋ค.
.reset_index() : pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ๋ณธ ์ธ๋ฑ์ค๋ก ์ฌ์ค์ ํ๋ค.
.sort_values('amount', ascending=False) : pandas์ DataFrame ๋ฉ์๋๋ก DataFrame์ ํ์ amount ์ด์ ๊ฐ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ DataFrame ๋ฉ์๋์ด๋ฉฐ, ascending=False ํ๋ผ๋ฏธํฐ๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ๊ฒ ์ ์ง์ ํฉ๋๋ค.
.head(5): pandas์ DataFrame ๋ฉ์๋์ด๋ฉฐ, DataFrame์ ์ฒ์ 5์ค์ ๋ฐํํ๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ DataFrame์ ํ์ ํน์ ์ด์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ , ๊ฐ ๊ทธ๋ฃน์ ๋ํด ๋ค๋ฅธ ์ด์ ๋ชจํ์คํธ์ฐจ๋ฅผ ๊ตฌํ๊ณ , ํ์คํธ์ฐจ ๊ฐ๊ณผ ๊ทธ๋ฃนํํ ์ด์ด ํฌํจ๋ DataFrame์ ๋ฐํํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ป์ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ๊ณ ํ์คํธ์ฐจ ๊ฐ์ผ๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์ป์ DataFrame์ ์ฒ์ 5๊ฐ ํ์ ๋ฐํํฉ๋๋ค. ์ด ์ฝ๋๋ ๋งค์ถ ํธ์ฐจ๊ฐ ํฐ ๋งค์ฅ์ ์๋ณํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
P-032: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ถ ๊ธ์ก(amount)์ ๋ํด 25% ๋จ์๋ก ๋ฐฑ๋ถ์์ ๊ฐ์ ๊ตฌํ๋ผ.
# ์ฝ๋ ์์ 1
np.percentile(df_receipt['amount'], q=np.arange(1, 5) * 25)
array([ 102., 170., 288., 10925.])
ํด์ค :ย
np.percentile(df_receipt['amount'], q=np.range(1, 5) * 25)๋ผ๋ ์ฝ๋๋ NumPy ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ np.percentile() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ df_receipt DataFrame์ amount ์ด์ ๊ฐ์ ์ฌ๋ถ์์ ์๋ฅผ ๊ณ์ฐํ๋ค.
๋ค์์ ๊ฐ ์์์ ๋ํด ์ค๋ช ํ๋ค.
np.percentile() : ๋ฐฐ์ด์ ๋ฐฑ๋ถ์จ์ ๊ณ์ฐํ๋ NumPy ํจ์์ด๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ฐฑ๋ถ์์๋ฅผ ๊ณ์ฐํ ๋ฐฐ์ด, ๋ ๋ฒ์งธ ์ธ์๋ ๊ณ์ฐํ ๋ฐฑ๋ถ์์ ๊ฐ. q ๋งค๊ฐ ๋ณ์๋ ๊ณ์ฐํ ๋ฐฑ๋ถ์์๋ฅผ ์ง์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค. ์๋ฅผ ๋ค์ด, q=np.range(1, 5) * 25๋ ๋ฐ์ดํฐ ๋ถํฌ์์ 25, 50, 75 ์์น์ ๋ฐฑ๋ถ์์๋ฅผ ๊ณ์ฐํ๋ค. ์ด๋ np.range(1, 5) * 25 ์์ด ๋ถํฌ์์ ๋ฐฑ๋ถ์์ ์์น์ธ ๊ฐ [25, 50, 75]์ ๋ฐฐ์ด์ ์์ฑํ๊ธฐ ๋๋ฌธ์ด๋ค.
df_receipt['amount'] : df_receipt['amount']: df_receipt DataFrame์ amount ์ด์ ๋ํ๋ด๋ pandas Series ๊ฐ์ฒด์ด๋ฉฐ, df_receipt DataFrame์ ํ์ฌ ํ๊ฒฝ์ ์กด์ฌํ๋ ๊ฒ์ผ๋ก ๊ฐ์ ํ๋ค. ๋ก ๊ฐ์ ํ๋ค.
q=np.range(1, 5) * 25: ๊ณ์ฐํ ๋ฐฑ๋ถ์์๋ฅผ ์ง์ ํ๋ NumPy ๋ฐฐ์ด์ด๋ค. np.range(1, 5) * 25 ์์ ๋ถํฌ์์ ๋ฐฑ๋ถ์์์ ์์น์ธ ๊ฐ [25, 50, 75]๋ฅผ ๊ฐ์ง ๋ฐฐ์ด์ ์์ฑํ๋ค.
์ด ์ฝ๋๋ df_receipt DataFrame์ amount ์ด์ ์ฌ๋ถ์๋ฅผ ๊ณ์ฐํ๋ค. ์ด๋ ๋ถํฌ๋ฅผ 4๋ฑ๋ถํ๋ ๊ฐ์ ๋๋ค. ์ฒซ ๋ฒ์งธ ์ฌ๋ถ์์(Q1)๋ 25๋ฒ์งธ ์ฌ๋ถ์์, ๋ ๋ฒ์งธ ์ฌ๋ถ์์(Q2)๋ 50๋ฒ์งธ ์ฌ๋ถ์์(์ค์๊ฐ์ด๋ผ๊ณ ๋ ํจ), ์ธ ๋ฒ์งธ ์ฌ๋ถ์์(Q3)๋ 75๋ฒ์งธ ์ฌ๋ถ์์์ด๋ค. ์ด ์ฝ๋์ ์ถ๋ ฅ์ ์ฌ๋ถ์์ ๋ฐฐ์ด์ด๋ฉฐ, ์ด๋ฅผ ํตํด ๊ธ์ก ํญ๋ชฉ์ ๋ถํฌ๋ฅผ ์์ฝํ ์ ์๋ค.
# ์ฝ๋ ์์ 2
df_receipt.amount.quantile(q=np.arange(1, 5) / 4)
0.25 102.0 0.50 170.0 0.75 288.0 1.00 10925.0 Name: amount, dtype: float64
ํด์ค :ย
์ด ์ฝ๋๋ pandas์ quantile() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ df_receipt dataframe์ amount ์ด์ ์ฌ๋ถ์๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋์ ๋๋ค. q ๋งค๊ฐ ๋ณ์๋ 1/4, 2/4(์ค๊ฐ๊ฐ), 3/4, 4/4(์ต๋๊ฐ) ์ค ๊ณ์ฐํ ์ฌ๋ถ์๋ฅผ ์ง์ ํฉ๋๋ค.
์ด ์ฝ๋์์๋ df_receipt์ amount ์ด์ ๋ํด quantile()์ ํธ์ถํ๊ณ q ํ๋ผ๋ฏธํฐ์ ์ฌ๋ถ์์ 1, 2, 3, 4์ ๊ฐ๊ฐ ํด๋นํ๋ ๊ฐ[0.25, 0.5, 0.75, 1.0]์ ๋ฐฐ์ด์ ์ค์ ํ์ฌ ์ฌ๋ถ์๋ฅผ ๊ณ์ฐํ๊ณ ์์ต๋๋ค.
์ด ์ฝ๋์ ๊ฒฐ๊ณผ ์ถ๋ ฅ์ 4๊ฐ์ ๊ฐ์ ๋ฐฐ์ด์ด ๋๋ฉฐ, ๊ฐ ๊ฐ์ ํด๋น ์ฌ๋ถ์์ ๊ฐ์ ๋ํ๋ ๋๋ค.
ย
P-033: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๋งค์ฅ ์ฝ๋(store_cd)๋ณ ๋งค์ถ ๊ธ์ก(amount)์ ํ๊ท ์ ๊ณ์ฐํ์ฌ 330๊ฐ ์ด์์ ์ถ์ถํ๋ผ.
df_receipt.groupby('store_cd').amount.mean(). \
reset_index().query('amount >= 330')
ย | store_cd | amount |
---|---|---|
1 | S12013 | 330.194130 |
5 | S13001 | 348.470386 |
7 | S13003 | 350.915519 |
8 | S13004 | 330.943949 |
12 | S13015 | 351.111960 |
16 | S13019 | 330.208616 |
17 | S13020 | 337.879932 |
28 | S13052 | 402.867470 |
30 | S14010 | 348.791262 |
31 | S14011 | 335.718333 |
38 | S14026 | 332.340588 |
46 | S14045 | 330.082073 |
48 | S14047 | 330.077073 |
ํด์ค:
df_receipt.groupby('store_cd').amount.mean().reset_index().query('amount >= 330')๋ df_receipt DataFrame์ store_cd ์ด๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ ๊ทธ๋ฃน์ amount ์ด์ ํ๊ท ๊ฐ์ ๊ณ์ฐํ๊ณ , ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ๊ณ , ๊ฒฐ๊ณผ DataFrame์ amount์ ํ๊ท ๊ฐ์ด 330 ์ด์์ธ ํ๋ง ํฌํจํ๋๋ก ํํฐ๋งํ๋ ์ฝ๋์ ๋๋ค.
๋ค์์ ๊ฐ ๊ตฌ์ฑ ์์์ ๋ํ ์ค๋ช ์ ๋๋ค.
df_receipt.groupby('store_cd'): df_receipt์ DataFrame์ store_cd ์ปฌ๋ผ์ ๊ฐ์ผ๋ก ๊ทธ๋ฃนํํ๋ค.
.amount.mean(): ๊ฐ ๊ทธ๋ฃน์ amount ์ปฌ๋ผ์ ํ๊ท ๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
.reset_index(): ๊ฒฐ๊ณผ DataFrame์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํฉ๋๋ค.
.query('amount >= 330'): amount์ ํ๊ท ๊ฐ์ด 330 ์ด์์ธ ํ๋ง ํฌํจํ๋๋ก ๊ฒฐ๊ณผ DataFrame์ ํํฐ๋งํฉ๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ ํ๊ท ๊ฑฐ๋ ๊ธ์ก์ด 330 ์ด์์ธ ๋งค์ฅ๋ง ์ ํํ๋ค.
ย
P-034: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๊ณ ๊ฐ ID(customer_id)๋ณ๋ก ๋งค์ถ ๊ธ์ก(amount)์ ํฉ์ฐํ์ฌ ์ ์ฒด ๊ณ ๊ฐ์ ํ๊ท ์ ๊ตฌํ์์ค. ๋จ, ๊ณ ๊ฐ ID๊ฐ โZโ๋ก ์์ํ๋ ๊ฒ์ ๋นํ์์ ์๋ฏธํ๋ฏ๋ก ์ ์ธํ์ฌ ๊ณ์ฐํ๋ค.
# ์ฝ๋ ์์ 1: query๋ฅผ ์ฌ์ฉํ์ง ์๋ ๋ฐฉ๋ฒ
df_receipt[~df_receipt['customer_id'].str.startswith("Z")]. \
groupby('customer_id').amount.sum().mean()
2547.742234529256
ํด์ค:
df_receipt[~df_receipt['customer_id'].str.startswith("Z")].groupby('customer_id').amount.sum().mean()๋ผ๋ ์ฝ๋์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
df_receipt[~df_receipt['customer_id'].str.startswith("Z")]: ์ด๊ฒ์ df_receipt DataFrame์ ํํฐ๋งํ์ฌ customer_id ์ด์ด "Z"๋ก ์์ํ๋ ํ์ ์ ์ธํฉ๋๋ค. ํธ๋ค(~) ๋ฌธ์๋ str.startswith() ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๋ถ์ธ ๊ฐ์ ๋ฐ์ ์ํค๊ธฐ ์ํ ๋ถ์ธ ์ฐ์ฐ์๋ก ์ฌ์ฉ๋ฉ๋๋ค.
.groupby('customer_id').amount.sum(): ํํฐ๋ง๋ DataFrame์ customer_id ์ปฌ๋ผ์ผ๋ก ๊ทธ๋ฃนํํ๊ณ ๊ฐ ๊ทธ๋ฃน์ amount ์ปฌ๋ผ์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค.
.mean(): ๊ฐ ๊ณ ๊ฐ(customer_id๊ฐ "Z"๋ก ์์ํ๋ ๊ณ ๊ฐ ์ ์ธ)์ด ์ฌ์ฉํ ์ด ๊ธ์ก์ ๋ํ๋ด๋ ๊ฒฐ๊ณผ ์๋ฆฌ์ฆ์ ํ๊ท ๊ฐ์ ๊ณ์ฐํ๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ df_receipt DataFrame์ customer_id๊ฐ "Z"๋ก ์์ํ์ง ์๋ ๊ฐ ๊ณ ๊ฐ์ด ์ฌ์ฉํ ๊ธ์ก์ ํ๊ท ์ ๊ณ์ฐํ๋ค. ์ด๋ ๋จ๊ณจ ๊ณ ๊ฐ์ ๊ตฌ๋งค ํ๋์ ํ์ ํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
ย
# ์ฝ๋ ์์ 2: query๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
df_receipt.query('not customer_id.str.startswith("Z")',
engine='python').groupby('customer_id').amount.sum().mean()
2547.742234529256
ํด์ค:
์ด ์ฝ๋๋ ์ต๋ช ์ด ์๋ ๊ณ ๊ฐ์ ํ๊ท ์๋น์ก์ ๊ณ์ฐํ๋ค. ์๋๋ ๊ทธ ๊ตฌ์กฐ์ ๋๋ค.
df_receipt๋ ํธ๋์ญ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ DataFrame์ด๋ค.
query ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ customer_id๊ฐ "Z"๋ก ์์ํ๋ ํธ๋์ญ์ ์ ํํฐ๋งํ๊ณ ์๋ค. ์ด๋ str.startswith() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ด ํน์ ๋ฌธ์ ๋๋ ๋ถ๋ถ ๋ฌธ์์ด๋ก ์์ํ๋์ง ์ฌ๋ถ๋ฅผ ๊ฒ์ฌํ๋ str.startswith() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
์์ฑ๋ DataFrame์ groupby ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ customer_id๋ก ๊ทธ๋ฃนํ๋ฉ๋๋ค.
๊ธ์ก ์ด์ sum ๋ฉ์๋๋ก ์ ํ๋์ด ๊ฐ ๊ณ ๊ฐ์ด ์ฌ์ฉํ ๊ธ์ก์ ํฉ๊ณ๊ฐ ๊ณ์ฐ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ mean ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ๋จ๊ณ์์ ๊ณ์ฐ๋ ๊ธ์ก์ ํ๊ท ์ ๊ณ์ฐํฉ๋๋ค. ์ด๊ฒ์ด ์ด ์ฝ๋์ ์ต์ข ๊ฒฐ๊ณผ์ ๋๋ค.
ย
P-035: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋ํด ๊ณ ๊ฐ ID(customer_id)๋ณ๋ก ๋งค์ถ ๊ธ์ก(amount)์ ํฉ์ฐํ์ฌ ์ ์ฒด ๊ณ ๊ฐ์ ํ๊ท ์ ๊ตฌํ๊ณ , ํ๊ท ์ด์ ์ผํ์ ํ ๊ณ ๊ฐ์ ์ถ์ถํ์ฌ 10๊ฑด์ฉ ํ์ํ์์ค. ๋จ, ๊ณ ๊ฐ ID๊ฐ โZโ๋ก ์์ํ๋ ๊ฒ์ ๋นํ์์ ์๋ฏธํ๋ฏ๋ก ์ ์ธํ์ฌ ๊ณ์ฐํ๋ค.
df_amount_sum = df_receipt[~df_receipt['customer_id'].str.startswith("Z")].\
groupby('customer_id').amount.sum()
amount_mean = df_amount_sum.mean()
df_amount_sum = df_amount_sum.reset_index()
df_amount_sum[df_amount_sum['amount'] >= amount_mean].head(10)
ย | customer_id | amount |
---|---|---|
2 | CS001115000010 | 3044 |
4 | CS001205000006 | 3337 |
13 | CS001214000009 | 4685 |
14 | CS001214000017 | 4132 |
17 | CS001214000052 | 5639 |
21 | CS001215000040 | 3496 |
30 | CS001304000006 | 3726 |
32 | CS001305000005 | 3485 |
33 | CS001305000011 | 4370 |
53 | CS001315000180 | 3300 |
ํด์ค :ย
์ฝ๋ df_amount_sum = df_receipt[~df_receipt['customer_id'].str.startswith("Z")].groupby('customer_id').amount.sum(), amount_mean = df_amount. amount_sum. mean(), df_amount_sum = df_amount_sum.reset_index(), df_amount_sum[df_amount_sum['amount'] >= amount_mean].head(10) ์ ๋ค์๊ณผ ๊ฐ์ด ์์ต๋๋ค.
df_receipt[~df_receipt['customer_id'].str.startswith("Z")].groupby('customer_id').amount.sum(): df_receipt์ DataFrame์์ customer_id ์ปฌ๋ผ์ด "Z"๋ก ์์ํ๋ ํ์ ์ ์ธํ๊ณ customer_id ์ปฌ๋ผ์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ ๊ทธ๋ฃน์ amount ์ปฌ๋ผ์ ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค. ๊ฒฐ๊ณผ ๊ฐ์ฒด๋ ๊ฐ ๊ณ ๊ฐ(customer_id๊ฐ "Z"๋ก ์์ํ๋ ๊ณ ๊ฐ ์ ์ธ)์ด ์ฌ์ฉํ ๊ธ์ก์ ํฉ๊ณ๋ฅผ ๋ํ๋ด๋ Series์ด๋ค.
amount_mean = df_amount_sum.mean(): df_receipt DataFrame์ customer_id๊ฐ "Z"๋ก ์์ํ์ง ์๋ ๊ณ ๊ฐ์ ํ๊ท ์ง์ถ ๊ธ์ก์ ๋ํ๋ด๋ df_amount_sum Series์ ํ๊ท ๊ฐ์ ๊ณ์ฐํ๋ค.
df_amount_sum = df_amount_sum.reset_index(): df_amount_sum ์๋ฆฌ์ฆ์ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ค์ ํ์ฌ customer_id์ amount ๋ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง DataFrame์ผ๋ก ๋ณํํ๋ค.
df_amount_sum[df_amount_sum['amount'] >= amount_mean].head(10): df_amount_sum์ DataFrame์ ํํฐ๋งํ์ฌ amount ์นผ๋ผ์ด amount_mean ์ด์์ ํ๋ง ํฌํจํ๋๋ก ํ๊ณ , ๊ฒฐ๊ณผ DataFrame์ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํ๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ df_receipt DataFrame์ customer_id๊ฐ "Z"๋ก ์์ํ์ง ์๋ ๋ชจ๋ ๊ณ ๊ฐ์ ํ๊ท ์ง์ถ์ก ์ด์์ ์ง์ถ์ก์ ๊ฐ์ง ๊ณ ๊ฐ์ ์ ํํ๋ค. ๊ฒฐ๊ณผ DataFrame์๋ ์ ํ๋ ๊ฐ ๊ณ ๊ฐ์ customer_id์ ์ด ์ง์ถ ๊ธ์ก์ด ์ด ์ง์ถ ๊ธ์ก์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์ ์ฅ๋๋ค.
P-036: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์ ๋งค์ฅ ๋ฐ์ดํฐ(df_store)๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๊ฒฐํฉํ์ฌ ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ์ ๋ชจ๋ ํญ๋ชฉ๊ณผ ๋งค์ฅ ๋ฐ์ดํฐ์ ๋งค์ฅ๋ช (store_name)์ 10๊ฑด์ฉ ํ์ํ๋ผ.
pd.merge(df_receipt, df_store[['store_cd','store_name']],
how='inner', on='store_cd').head(10)
ย | sales_ymd | sales_epoch | store_cd | receipt_no | receipt_sub_no | customer_id | product_cd | quantity | amount | store_name |
---|---|---|---|---|---|---|---|---|---|---|
0 | 20181103 | 1541203200 | S14006 | 112 | 1 | CS006214000001 | P070305012 | 1 | 158 | ่ใ่ฐทๅบ |
1 | 20181116 | 1542326400 | S14006 | 112 | 2 | ZZ000000000000 | P080401001 | 1 | 48 | ่ใ่ฐทๅบ |
2 | 20170118 | 1484697600 | S14006 | 1162 | 1 | CS006815000006 | P050406035 | 1 | 220 | ่ใ่ฐทๅบ |
3 | 20190524 | 1558656000 | S14006 | 1192 | 1 | CS006514000034 | P060104003 | 1 | 80 | ่ใ่ฐทๅบ |
4 | 20190419 | 1555632000 | S14006 | 112 | 2 | ZZ000000000000 | P060501002 | 1 | 148 | ่ใ่ฐทๅบ |
5 | 20181119 | 1542585600 | S14006 | 1152 | 2 | ZZ000000000000 | P050701001 | 1 | 88 | ่ใ่ฐทๅบ |
6 | 20171211 | 1512950400 | S14006 | 1132 | 2 | CS006515000175 | P090903001 | 1 | 80 | ่ใ่ฐทๅบ |
7 | 20191021 | 1571616000 | S14006 | 1112 | 2 | CS006415000221 | P040602001 | 1 | 405 | ่ใ่ฐทๅบ |
8 | 20170710 | 1499644800 | S14006 | 1132 | 2 | CS006411000036 | P090301051 | 1 | 330 | ่ใ่ฐทๅบ |
9 | 20190805 | 1564963200 | S14006 | 112 | 1 | CS006211000012 | P050104001 | 1 | 115 | ่ใ่ฐทๅบ |
ํด์ค:
pd.merge(df_receipt, df_store[['store_cd','store_name']], how='inner', on='store_cd').head(10)๋ผ๋ ์ฝ๋์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํ๋ค.
df_store[['store_cd','store_name']] : df_store DataFrame ์ค store_cd์ store_name์ด๋ผ๋ ๋ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง ํ์ ์งํฉ์ ์ ํํ๋ค.
pd.merge(df_receipt, df_store[['store_cd','store_name']], how='inner', on='store_cd'): df_receipt DataFrame๊ณผ df_store['store_cd','store_name'] ์ฌ์ด์ ๋ด๋ถ DataFrame์ ๋ณํฉํ๋ค. name'] ์ฌ์ด์ ๋ด๋ถ ๊ฒฐํฉ์ ์ํํ์ฌ store_cd ์ปฌ๋ผ์ DataFrame์ ์์ฑํ๋ค. store_cd ์ปฌ๋ผ์ ๋ DataFrame์ ๋ณํฉํ์ฌ ๋ DataFrame์์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ์ง ํ๋ง ํฌํจํ๋ค.
.head(10): ๋ณํฉ๋ DataFrame์ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํ๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ df_receipt DataFrame๊ณผ df_store DataFrame์ store_cd ์ด๋ก ๋ณํฉํ๊ณ df_store DataFrame์ store_name ์ด์ ๋ณํฉ๋ DataFrame์ ์ถ๊ฐํ๊ณ ์๋ค. ๊ฒฐ๊ณผ DataFrame์๋ df_receipt์ ํธ๋์ญ์ ์ด ๋ฐ์ํ ๋งค์ฅ์ ๋ํ ์ ๋ณด(store_cd, store_name, ๊ธฐํ df_receipt DataFrame์ ๋ชจ๋ ์ด์ด ํฌํจ๋จ)๊ฐ ํฌํจ๋๋ค.
ย
P-037: ์ํ ๋ฐ์ดํฐ(df_product)์ ์นดํ ๊ณ ๋ฆฌ ๋ฐ์ดํฐ(df_category)๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๊ฒฐํฉํ์ฌ ์ํ ๋ฐ์ดํฐ์ ์ ์ฒด ํญ๋ชฉ๊ณผ ์นดํ ๊ณ ๋ฆฌ ๋ฐ์ดํฐ์ ์นดํ ๊ณ ๋ฆฌ ์๋ถ๋ฅ ์ด๋ฆ(category_small_name) 10๊ฐ๋ฅผ ํ์ํ๋ผ.
pd.merge(df_product
, df_category[['category_small_cd','category_small_name']]
, how='inner', on='category_small_cd').head(10)
ย | product_cd | category_major_cd | category_medium_cd | category_small_cd | unit_price | unit_cost | 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 | ๅผๅฝ้ก |
3 | P040101004 | 04 | 0401 | 040101 | 248.0 | 186.0 | ๅผๅฝ้ก |
4 | P040101005 | 04 | 0401 | 040101 | 268.0 | 201.0 | ๅผๅฝ้ก |
5 | P040101006 | 04 | 0401 | 040101 | 298.0 | 224.0 | ๅผๅฝ้ก |
6 | P040101007 | 04 | 0401 | 040101 | 338.0 | 254.0 | ๅผๅฝ้ก |
7 | P040101008 | 04 | 0401 | 040101 | 420.0 | 315.0 | ๅผๅฝ้ก |
8 | P040101009 | 04 | 0401 | 040101 | 498.0 | 374.0 | ๅผๅฝ้ก |
9 | P040101010 | 04 | 0401 | 040101 | 580.0 | 435.0 | ๅผๅฝ้ก |
ํด์ค:
์ฝ๋ pd.merge(df_product , df_category[['category_small_cd','category_small_name']] ์ ๋๋ค. , how='inner', on='category_small_cd').head(10)์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฉ๋๋ค.
df_category[['category_small_cd','category_small_name']]: ์ด๊ฒ์ df_category DataFrame ์ค category_small_cd์ category_small_name์ด๋ผ๋ ๋ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง ํ์ ์งํฉ์ ์ ํํ๋ ๊ฒ์ด๋ค.
pd.merge(df_product , df_category[['category_small_cd','category_small_name']]) , how='inner', on='category_small_cd'): df_product DataFrame๊ณผ df_category[['category_small_cd','category_small_name']] ๊ฐ์ ๋ด๋ถ ๊ฒฐํฉ์ ์ํํ๋ค. category_small_cd ์ปฌ๋ผ์ DataFrame์ ์์ฑํ๋ค. category_small_cd ์ปฌ๋ผ์ ๋ DataFrame์ ๋ณํฉํ์ฌ ๋ DataFrame์์ ์ผ์นํ๋ ๊ฐ์ ๊ฐ์ง ํ๋ง ํฌํจํ๋ค.
.head(10): ๋ณํฉ๋ DataFrame์ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํ๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ df_product DataFrame๊ณผ df_category DataFrame์ category_small_cd ์ด๋ก ๋ณํฉํ๊ณ , df_category DataFrame์์ category_small_name ์ด์ ๋ณํฉํ DataFrame์ ์ถ๊ฐํ๊ณ ์๋ค. ๊ฒฐ๊ณผ DataFrame์ df_product์ ์ํ์ ๋ํ ์ ๋ณด๋ฅผ ํฌํจํ๋ฉฐ, category_small_cd, category_small_name ๋ฐ df_product DataFrame์ ๋ค๋ฅธ ๋ชจ๋ ์ปฌ๋ผ์ ํฌํจํ๋ค.
P-038: ๊ณ ๊ฐ ๋ฐ์ดํฐ(df_customer)์ ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์์ ๊ณ ๊ฐ๋ณ ๋งค์ถ ๊ธ์ก์ ์ดํฉ์ ๊ตฌํ์ฌ 10๊ฑด์ ํ์ํ์์ค. ๋จ, ํ๋งค ์ค์ ์ด ์๋ ๊ณ ๊ฐ์ ๋ํด์๋ ํ๋งค๊ธ์ก์ 0์ผ๋ก ํ์ํ๋ค. ๋ํ, ๊ณ ๊ฐ์ ์ฑ๋ณ ์ฝ๋(gender_cd)๊ฐ ์ฌ์ฑ(1)์ธ ๊ณ ๊ฐ์ ๋์์ผ๋ก ํ๋ฉฐ, ๋นํ์(๊ณ ๊ฐ ID๊ฐ โZโ๋ก ์์ํ๋ ๊ณ ๊ฐ)์ ์ ์ธํ๋ค.
df_amount_sum = df_receipt.groupby('customer_id').amount.sum().reset_index()
df_tmp = df_customer. \
query('gender_cd == "1" and not customer_id.str.startswith("Z")',
engine='python')
pd.merge(df_tmp['customer_id'], df_amount_sum,
how='left', on='customer_id').fillna(0).head(10)
ย | customer_id | amount |
---|---|---|
0 | CS021313000114 | 0.0 |
1 | CS031415000172 | 5088.0 |
2 | CS028811000001 | 0.0 |
3 | CS001215000145 | 875.0 |
4 | CS015414000103 | 3122.0 |
5 | CS033513000180 | 868.0 |
6 | CS035614000014 | 0.0 |
7 | CS011215000048 | 3444.0 |
8 | CS009413000079 | 0.0 |
9 | CS040412000191 | 210.0 |
ํด์ค:
์ฝ๋ df_amount_sum = df_receipt.groupby('customer_id').amount.sum().reset_index() df_tmp = df_customer.query('gender_cd == "1" and not customer_id. str.startswith("Z")', engine='python') pd.merge(df_tmp['customer_id'], df_amount_sum, how='left', on='customer_id').fillna( 0).head(10)์์๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ด ์์ต๋๋ค.
df_amount_sum = df_receipt.groupby('customer_id').amount.sum().reset_index(): ์ด๊ฒ์ df_receipt DataFrame์ customer_id๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฐ ๊ณ ๊ฐ์ amount ์ด์ ํฉ๊ณํ์ฌ ์๋ก์ด DataFrame df_amount_sum์ ์์ฑํ๋ค. ์์ฑ๋ DataFrame์ customer_id์ amount ๋ ๊ฐ์ ์ปฌ๋ผ์ ๊ฐ์ง๋ค.
df_customer.query('gender_cd == "1" and not customer_id.str.startswith("Z")', engine='python'): ์ด๊ฒ์ df_customer DataFrame ์ค gender_cd๊ฐ 1์ด๊ณ ์ด๊ณ customer_id๊ฐ "Z"๋ก ์์ํ์ง ์๋ ํ์ ์งํฉ์ ์ ํํฉ๋๋ค. engine='python' ์ธ์๋ startswith์ ๊ฐ์ ๋ฌธ์์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ธฐ ์ํด ์ฌ์ฉ๋์์ต๋๋ค.
pd.merge(df_tmp['customer_id'], df_amount_sum, how='left', on='customer_id'): df_tmp DataFrame์ customer_id ์ปฌ๋ผ๊ณผ df_amount_sum์ ๋ณํฉํ๋ค. DataFrame์ customer_id ์ปฌ๋ผ์ ์ผ์ชฝ ๊ฒฐํฉ์ผ๋ก ๊ฒฐํฉํ๋ค. df_tmp DataFrame์ ๋ชจ๋ ํ์ ํฌํจํ๊ณ df_amount_sum DataFrame์ ๊ธ์ก ์ปฌ๋ผ์ ์ถ๊ฐํฉ๋๋ค(์ฌ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ).
.fillna(0): amount ์ปฌ๋ผ์ ๋๋ฝ๋ ๊ฐ์ 0์ผ๋ก ๋ง๋ญ๋๋ค.
.head(10): ๋ณํฉ๋ DataFrame์ ์ฒ์ 10๊ฐ์ ํ์ ๋ฐํํฉ๋๋ค.
์์ฝํ๋ฉด, ์ด ์ฝ๋๋ df_receipt DataFrame์ ๊ฐ ๊ณ ๊ฐ์ด ์ฌ์ฉํ ์ด ๊ธ์ก์ ๊ณ์ฐํ ํ, df_customer DataFrame์์ ๋จ์ฑ์ด๊ณ ์ ํจํ customer_id ๊ฐ์ ๊ฐ์ง ๊ณ ๊ฐ์ ํ์ ์งํฉ์ ์ ํํ๋ค. ๊ทธ๋ฐ ๋ค์ ์ด ์ฝ๋๋ ์ผ์ชฝ ๊ฒฐํฉ์ ์ฌ์ฉํ์ฌ customer_id ์ด๋ก ๋ DataFrame์ ๊ฒฐํฉํ๊ณ ๊ฒฐ๊ณผ DataFrame์ ๊ฐ ๊ณ ๊ฐ์ด ์ฌ์ฉํ ๊ธ์ก์ ํฉ๊ณ๋ฅผ ํฌํจํ๋ค. ๊ฒฐ๊ณผ DataFrame์๋ ์ ํ๋ ๋จ์ฑ ๊ณ ๊ฐ์ customer_id ์ด๊ณผ amount ์ด์ด ํฌํจ๋๋ค.
P-039: ์์์ฆ ๋ด์ญ ๋ฐ์ดํฐ(df_receipt)์์ ๋งค์ถ ์ผ์๊ฐ ๋ง์ ๊ณ ๊ฐ ์์ 20๊ฑด์ ์ถ์ถํ ๋ฐ์ดํฐ์ ๋งค์ถ ๊ธ์ก ํฉ๊ณ๊ฐ ๋ง์ ๊ณ ๊ฐ ์์ 20๊ฑด์ ์ถ์ถํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ฐ ์์ฑํ๊ณ , ์ด ๋ ๊ฐ์ง๋ฅผ ์์ ํ ์ธ๋ถ ๊ฒฐํฉํ๋ผ. ๋จ, ๋นํ์(๊ณ ๊ฐ ID๊ฐ โZโ๋ก ์์ํ๋ ๊ณ ๊ฐ)์ ์ ์ธํ๋ค.
df_data = df_receipt \
.query('not customer_id.str.startswith("Z")', engine='python')
df_cnt = df_data[~df_data.duplicated(subset=['customer_id', 'sales_ymd'])] \
.groupby('customer_id').sales_ymd.count().reset_index() \
.sort_values('sales_ymd', ascending=False).head(20)
df_sum = df_data.groupby('customer_id').amount.sum().reset_index() \
.sort_values('amount', ascending=False).head(20)
pd.merge(df_cnt, df_sum, how='outer', on='customer_id')
ย | customer_id | sales_ymd | amount |
---|---|---|---|
0 | CS040214000008 | 23.0 | NaN |
1 | CS015415000185 | 22.0 | 20153.0 |
2 | CS010214000010 | 22.0 | 18585.0 |
3 | CS010214000002 | 21.0 | NaN |
4 | CS028415000007 | 21.0 | 19127.0 |
5 | CS017415000097 | 20.0 | 23086.0 |
6 | CS016415000141 | 20.0 | 18372.0 |
7 | CS031414000051 | 19.0 | 19202.0 |
8 | CS014214000023 | 19.0 | NaN |
9 | CS022515000226 | 19.0 | NaN |
10 | CS021515000172 | 19.0 | NaN |
11 | CS039414000052 | 19.0 | NaN |
12 | CS021514000045 | 19.0 | NaN |
13 | CS022515000028 | 18.0 | NaN |
14 | CS030214000008 | 18.0 | NaN |
15 | CS021515000056 | 18.0 | NaN |
16 | CS014415000077 | 18.0 | NaN |
17 | CS021515000211 | 18.0 | NaN |
18 | CS032415000209 | 18.0 | NaN |
19 | CS031414000073 | 18.0 | NaN |
20 | CS001605000009 | NaN | 18925.0 |
21 | CS006515000023 | NaN | 18372.0 |
22 | CS011414000106 | NaN | 18338.0 |
23 | CS038415000104 | NaN | 17847.0 |
24 | CS035414000024 | NaN | 17615.0 |
25 | CS021515000089 | NaN | 17580.0 |
26 | CS032414000072 | NaN | 16563.0 |
27 | CS016415000101 | NaN | 16348.0 |
28 | CS011415000006 | NaN | 16094.0 |
29 | CS034415000047 | NaN | 16083.0 |
30 | CS007514000094 | NaN | 15735.0 |
31 | CS009414000059 | NaN | 15492.0 |
32 | CS030415000034 | NaN | 15468.0 |
33 | CS015515000034 | NaN | 15300.0 |
ํด์ค:
์ด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
.query() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ df_receipt ๋ฐ์ดํฐ ํ๋ ์์์ customer_id ์ด์ด "Z"๋ก ์์ํ์ง ์๋ ํ์ ํํฐ๋งํ์ฌ df_data์ ์ ์ฅํฉ๋๋ค.
df_data์์ customer_id ์ด๊ณผ sales_ymd ์ด์ ๊ธฐ์ค์ผ๋ก ์ค๋ณต๋ ํ์ ์ ๊ฑฐํ๊ณ customer_id๋ก ๊ทธ๋ฃนํํ์ฌ ํ๋งค์ผ ์๋ฅผ ๊ณ์ฐํ์ฌ df_cnt์ ์ ์ฅํฉ๋๋ค.
df_cnt๋ฅผ sales_ymd ์ด๋ก ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์์ 20๊ฐ ํ์ ๊ฐ์ ธ์จ๋ค.
df_data๋ฅผ customer_id๋ก ๊ทธ๋ฃนํํ๊ณ , amount ์ปฌ๋ผ์ ํฉ์ฐํ๊ณ , amount ์ปฌ๋ผ์์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ฌ ์์ 20๊ฐ ํ์ ๊ฐ์ ธ์ df_sum์ ์ ์ฅํ๋ค.
df_cnt์ df_sum ๋ฐ์ดํฐ ํ๋ ์์ how='outer' ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง pd.merge() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ customer_id ์ด๋ก ๋ณํฉํ์ฌ df_data์ ์ ์ฅํ๋ค(์ฆ, ๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ๋ณํฉ ํ์ ๋ฐ์ดํฐ ํ๋ ์์ ํฌํจ). ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์๋ ํ๋งค์ผ ์์ ๊ตฌ๋งค ๊ธ์ก์ ํฉ๊ณ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ 20๋ช ์ ๊ณ ๊ฐ์ด ํฌํจ๋๋ค.
ย
P-040: ๋ชจ๋ ๋งค์ฅ๊ณผ ๋ชจ๋ ์ํ์ ์กฐํฉํ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ ์ถ๋ค. ๋งค์ฅ ๋ฐ์ดํฐ(df_store)์ ์ํ ๋ฐ์ดํฐ(df_product)๋ฅผ ์ง์ ๋ถํ์ฌ ๊ฑด์๋ฅผ ๊ณ์ฐํ๋ผ.
df_store_tmp = df_store.copy()
df_product_tmp = df_product.copy()
df_store_tmp['key'] = 0
df_product_tmp['key'] = 0
len(pd.merge(df_store_tmp, df_product_tmp, how='outer', on='key'))
531590
ํด์ค:
์ด ์ฝ๋๋ ์ธ๋ถ ๊ฒฐํฉ์ ์ฌ์ฉํ์ฌ ๋ ๊ฐ์ ๋ฐ์ดํฐ ํ๋ ์ df_store์ df_product๋ฅผ ๊ฒฐํฉํ๋ค.
๋จผ์ ๋ ๊ฐ์ ์์ ๋ฐ์ดํฐ ํ๋ ์ df_store_tmp์ df_product_tmp๊ฐ ๊ฐ๊ฐ df_store์ df_product์ ๋ณต์ฌ๋ณธ์ผ๋ก ์์ฑ๋ฉ๋๋ค. ์ด๋ ์ธ๋ถ ๋ฐ์ธ๋ฉ์ด ๋ณํฉํ๊ธฐ ์ํด ๊ณตํต ์ปฌ๋ผ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ง์ง๋ง์ผ๋ก pd.merge() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋ณํฉํฉ๋๋ค. how='outer' ์ธ์๋ ์ธ๋ถ ๋ณํฉ์ ์ํ๋ค๋ ๊ฒ์ ๋ํ๋ด๊ณ on='key'๋ ๋ณํฉํ ๊ณตํต ์ปฌ๋ผ์ ์ง์ ํฉ๋๋ค. ๊ฒฐ๊ณผ ๋ฐ์ดํฐ ํ๋ ์์๋ ๋ ๋ฐ์ดํฐ ํ๋ ์์ ๋ชจ๋ ํ์ด ํฌํจ๋๋ฉฐ, ๋ค๋ฅธ ๋ฐ์ดํฐ ํ๋ ์์ ํด๋นํ๋ ๋ฐ์ดํฐ๊ฐ ์๋ ์ ์๋ ๋๋ฝ๋ ๊ฐ(NaN)์ด ํฌํจ๋๋ค.
๋ง์ง๋ง์ผ๋ก len()์ ์ฌ์ฉํ์ฌ ๋ณํฉ๋ ๋ฐ์ดํฐ ํ๋ ์์ ํ ์๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ ๋ฐ์ดํฐ ํ๋ ์์ ํ ์๋ ๋์ผํ๋ฏ๋ก ๋ด๋ถ ๋ณํฉ, ์ผ์ชฝ ๋ณํฉ, ์ค๋ฅธ์ชฝ ๋ณํฉ, ์ธ๋ถ ๋ณํฉ ์ค ์ด๋ ๊ฒ์ ์ฌ์ฉํ๋ ์ถ๋ ฅ์ ๋์ผํ๋ค. ์ด ๊ฒฝ์ฐ ๋ณํฉ๋ ๋ฐ์ดํฐ ํ๋ ์์ ์ด ํ ์๊ฐ ์ถ๋ ฅ๋๋ค.
ย
Comment