Chapter 12. Pandas II#

ํ•™์Šต๋ชฉํ‘œ์™€ ๊ธฐ๋Œ€ํšจ๊ณผ

  • ํ•™์Šต๋ชฉํ‘œ

    • ํŒŒ์ผ ์ž…์ถœ๋ ฅ ๋ฐฉ๋ฒ•์„ ์ตํ˜€๋ณด์ž.

    • ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ๊ด€๋ จ๋œ ํ•จ์ˆ˜๋ฅผ ์ตํ˜€๋ณด์ž.

    • ChatGPT๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

  • ๊ธฐ๋Œ€ํšจ๊ณผ

    • ChatGPT์™€ pandas๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์—ฐ์‚ฐ ๋ฐ ๋ถ„์„์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ์ผ ์ž…์ถœ๋ ฅ#

ํŒŒ์ผ ํ˜•์‹

์ฝ๊ธฐ

์“ฐ๊ธฐ

MS Excel

read_excel

to_excel

CSV

read_csv

to_csv

JSON

read_json

to_json

HTML

read_html

to_html

Local clipboard

read_clipboard

to_clipboard

HDF5 format

read_hdf

to_hdf

SQL

read_sql

to_sql

  • csv ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ

    • pd.read_csv(โ€˜ํŒŒ์ผ๋ช…โ€™, index_col=์นผ๋Ÿผ๋ฒˆํ˜ธ, encoding=โ€™์ธ์ฝ”๋”ฉ๋ฐฉ๋ฒ•โ€™)

      • index_col:์นผ๋Ÿผ๋ฒˆํ˜ธ๋ฅผ ์„ค์ •์ธ๋ฑ์Šค๋กœ ์ง€์ •ํ•œ๋‹ค.

      • usecols: ์‚ฌ์šฉํ•  ์นผ๋Ÿผ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

      • header: ํ—ค๋”(์นผ๋Ÿผ)์œผ๋กœ ์„ ํƒํ•  ํ—ค๋”๋ฅผ ์ง€์ •ํ•œ๋‹ค.

      • encoding: ํ•œ๊ธ€์ด ๊นจ์งˆ๋•Œ์—๋Š” encoding ์˜ต์…˜์— โ€˜euc-krโ€™์„ ๋„ฃ์–ด์ค€๋‹ค.

      • ์ด ์™ธ์—๋„ ๋งŽ์€ ์˜ต์…˜์ด ์žˆ๋‹ค.

  • excelํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ

    • pd.read_excel(โ€˜ํŒŒ์ผ๋ช…โ€™, encoding=โ€™์ธ์ฝ”๋”ฉ๋ฐฉ๋ฒ•โ€™)

์ธ์ฝ”๋”ฉ & ๋””์ฝ”๋”ฉ

  • ์ธ์ฝ”๋”ฉ(encoding)๋Š” ์ฝ”๋“œํ™” ๋˜๋Š” ์•”ํ˜ธํ™”๋กœ ๋ถˆ๋ฆฌ์šฐ๋ฉฐ, ๋ฌธ์ž์—ด์„ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ํŒŒ์ด์ฌ์—์„œ๋Š” ๋ฌธ์ž์—ด์„ ์œ ๋‹ˆ์ฝ”๋“œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ utf-8, euc-kr, ascii ํ˜•์‹์˜ ์ธ์ฝ”๋”ฉ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

x='ํ•œ๊ธ€'
encoded = x.encode('utf-8')
print(f'Output: {encoded}')

Output: bโ€™\xed\x95\x9c\xea\xb8\x80โ€™

  • ์—ฌ๊ธฐ์„œ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ bโ€™\xed\x95\x9c\xea\xb8\x80โ€™๊ฐ€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ์ด๋‹ค.

  • ๋””์ฝ”๋”ฉ(decoding)์€ ์—ญ์ฝ”๋“œํ™” ๋˜๋Š” ๋ณตํ˜ธํ™”๋กœ ๋ถˆ๋ฆฌ์šฐ๋ฉฐ, ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์ด๋•Œ ๋””์ฝ”๋”ฉ์—์„œ๋„ ์ธ์ฝ”๋”ฉ ์‹œ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹(utf-8, euc-kr, ascii ๋“ฑ)์ด ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค.

decoded = encoded.decode('utf-8')
print(f'Output: {decoded}')

Output: ํ•œ๊ธ€

  • ์ธ์ฝ”๋”ฉ์„ ํ•˜๋Š” ์ด์œ ๋Š” ์–ธ์–ด๋งˆ๋‹ค ํ‘œ์ค€ํ™”๋œ ๊ทœ๊ฒฉ์œผ๋กœ ๋ฌธ์ž์ง‘ํ•ฉ์„ ๋งŒ๋“ค๊ณ , ์ด๋Ÿฌํ•œ ๋ฌธ์ž์ง‘ํ•ฉ์„ ๊ฐ€์ง€๊ณ  ์ •๋ณด์˜ ํ˜•ํƒœ ํ‘œ์ค€ํ™”, ๋ณด์•ˆ, ์ €์žฅ ๊ณต๊ฐ„ ์ ˆ์•ฝ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ๋ชฉ์ ์œผ๋กœ ๋ถ€ํ˜ธํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

  • ํŒŒ์ผ ์ฝ๊ณ  ์ €์žฅํ•˜๊ธฐ

import pandas as pd
scores = [[84,87,78], [21,15,84], [87,84,76], [100,87,99],[59,99,59],[46,77,56]]
names=['์ฒ ์ˆ˜','์˜์ด','๊ธธ๋™','๋ฏธ์˜','์ˆœ์ด','์ฒ ์ด']
lectures=['๊ตญ์–ด','์ˆ˜ํ•™','์˜์–ด']
d1 = pd.DataFrame(scores, index=names, columns=lectures)
d1
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
์ฒ ์ˆ˜ 84 87 78
์˜์ด 21 15 84
๊ธธ๋™ 87 84 76
๋ฏธ์˜ 100 87 99
์ˆœ์ด 59 99 59
์ฒ ์ด 46 77 56
# ์—‘์…€๋กœ ์ €์žฅํ•˜๊ธฐ
d1.to_excel('sample.xlsx')
# ์—‘์…€ ์ฝ์–ด์˜ค๊ธฐ
d2 = pd.read_excel("sample.xlsx")
d2
Unnamed: 0 ๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
0 ์ฒ ์ˆ˜ 84 87 78
1 ์˜์ด 21 15 84
2 ๊ธธ๋™ 87 84 76
3 ๋ฏธ์˜ 100 87 99
4 ์ˆœ์ด 59 99 59
5 ์ฒ ์ด 46 77 56
  • index_col ์˜ต์…˜์€ ์ธ๋ฑ์Šค ์นผ๋Ÿผ์„ ์ง€์ •ํ•˜์—ฌ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

d2 = pd.read_excel("sample.xlsx", index_col=0)
d2
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
์ฒ ์ˆ˜ 84 87 78
์˜์ด 21 15 84
๊ธธ๋™ 87 84 76
๋ฏธ์˜ 100 87 99
์ˆœ์ด 59 99 59
์ฒ ์ด 46 77 56
# csv๋กœ ์ €์žฅํ•˜๊ธฐ
d2.to_csv('sample.csv', encoding='euc-kr')
d2 = pd.read_csv('sample.csv', encoding='euc-kr', index_col=0)
d2
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
์ฒ ์ˆ˜ 84 87 78
์˜์ด 21 15 84
๊ธธ๋™ 87 84 76
๋ฏธ์˜ 100 87 99
์ˆœ์ด 59 99 59
์ฒ ์ด 46 77 56

์ž๋ฃŒํ˜• ๋‹ค๋ฃจ๊ธฐ#

  • .astype(์ž๋ฃŒํ˜•)

d2 = d1.astype('str')
d2
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
์ฒ ์ˆ˜ 84 87 78
์˜์ด 21 15 84
๊ธธ๋™ 87 84 76
๋ฏธ์˜ 100 87 99
์ˆœ์ด 59 99 59
์ฒ ์ด 46 77 56
d2.sum()
๊ตญ์–ด    8.421871e+12
์ˆ˜ํ•™    8.715849e+11
์˜์–ด    7.884770e+11
dtype: float64

๋ˆ„๋ฝ๊ฐ’ ์ฒ˜๋ฆฌํ•˜๊ธฐ#

  • ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ ํ™•์ธ

    • isnull(): ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ์ด๋ฉด True, ์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ด๋ฉด False๋ฅผ ๋ฐ˜ํ™˜

    • notnull():์œ ํšจํ•œ ๋ฐ์ดํ„ฐ์ด๋ฉด True, ๋ˆ„๋ฝ๋ฐ์ดํ„ฐ์ด๋ฉด False๋ฅผ ๋ฐ˜ํ™˜

scores = [[84,87,78], [21,15,84], [87,84,76], [100,87,99],[59,99,59],[46,77,56]]
names=['์ฒ ์ˆ˜','์˜์ด','๊ธธ๋™','์Šฌ๊ธฐ','์ˆœ์ด','์ฒ ์ด']
lectures=['๊ตญ์–ด','์ˆ˜ํ•™','์˜์–ด']
d2 = pd.DataFrame(scores, index=names, columns=lectures)
d2
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
์ฒ ์ˆ˜ 84 87 78
์˜์ด 21 15 84
๊ธธ๋™ 87 84 76
์Šฌ๊ธฐ 100 87 99
์ˆœ์ด 59 99 59
์ฒ ์ด 46 77 56
d3=d1+d2
d3
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
๊ธธ๋™ 174.0 168.0 152.0
๋ฏธ์˜ NaN NaN NaN
์ˆœ์ด 118.0 198.0 118.0
์Šฌ๊ธฐ NaN NaN NaN
์˜์ด 42.0 30.0 168.0
์ฒ ์ˆ˜ 168.0 174.0 156.0
์ฒ ์ด 92.0 154.0 112.0
d3.isnull()
#d3.notnull()
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
๊ธธ๋™ False False False
๋ฏธ์˜ True True True
์ˆœ์ด False False False
์Šฌ๊ธฐ True True True
์˜์ด False False False
์ฒ ์ˆ˜ False False False
์ฒ ์ด False False False
  • ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ

    • ํ–‰์ œ๊ฑฐ: .dropna(subset=์นผ๋Ÿผ๋ช…, how=โ€™anyโ€™/โ€™allโ€™, axis=0, thresh=๊ฐœ์ˆ˜)

    • ์—ด์ œ๊ฑฐ: .dropna(axis=1, thresh=๊ฐœ์ˆ˜)

    • how

      • any: ํ•˜๋‚˜๋ผ๋„ ๋น„์–ด ์žˆ์œผ๋ฉด ์‚ญ์ œ

      • all: ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ๋น„์–ด ์žˆ์œผ๋ฉด ์‚ญ์ œ

    • thresh: ์œ ํšจํ•œ ๊ฐ’์˜ ๊ฐœ์ˆ˜๊ฐ€ thresh๋ณด๋‹ค ์ž‘์€ ํ–‰์ด๋‚˜ ์—ด์„ ์‚ญ์ œ

d4=d3.dropna(axis=0)
d4
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
๊ธธ๋™ 174.0 168.0 152.0
์ˆœ์ด 118.0 198.0 118.0
์˜์ด 42.0 30.0 168.0
์ฒ ์ˆ˜ 168.0 174.0 156.0
์ฒ ์ด 92.0 154.0 112.0
  • ๋ˆ„๋ฝ ๋ฐ์ดํ„ฐ ์น˜ํ™˜

    • .fillna(๊ฐ’)

min_kor = d3['๊ตญ์–ด'].min()
d3['๊ตญ์–ด'].fillna(min_kor, inplace=True)
d3
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
๊ธธ๋™ 174.0 168.0 152.0
๋ฏธ์˜ 42.0 NaN NaN
์ˆœ์ด 118.0 198.0 118.0
์Šฌ๊ธฐ 42.0 NaN NaN
์˜์ด 42.0 30.0 168.0
์ฒ ์ˆ˜ 168.0 174.0 156.0
์ฒ ์ด 92.0 154.0 112.0

์ค‘๋ณต๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ#

  • .duplicated(): ์ค‘๋ณต๋œ ํ–‰์ด๋ฉด True, ์•„๋‹ˆ๋ฉด False์ด๋‹ค.

d3
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
๊ธธ๋™ 174.0 168.0 152.0
๋ฏธ์˜ 42.0 NaN NaN
์ˆœ์ด 118.0 198.0 118.0
์Šฌ๊ธฐ 42.0 NaN NaN
์˜์ด 42.0 30.0 168.0
์ฒ ์ˆ˜ 168.0 174.0 156.0
์ฒ ์ด 92.0 154.0 112.0
d3.duplicated()
๊ธธ๋™    False
๋ฏธ์˜    False
์ˆœ์ด    False
์Šฌ๊ธฐ     True
์˜์ด    False
์ฒ ์ˆ˜    False
์ฒ ์ด    False
dtype: bool
d3['๊ตญ์–ด'].duplicated()
๊ธธ๋™    False
๋ฏธ์˜    False
์ˆœ์ด    False
์Šฌ๊ธฐ     True
์˜์ด     True
์ฒ ์ˆ˜    False
์ฒ ์ด    False
Name: ๊ตญ์–ด, dtype: bool
  • ์ค‘๋ณตํ–‰ ์ œ๊ฑฐ: .drop_duplicates(subset=์ปฌ๋Ÿผ๋ช…๋ฆฌ์ŠคํŠธ)

d3
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
๊ธธ๋™ 174.0 168.0 152.0
๋ฏธ์˜ 42.0 NaN NaN
์ˆœ์ด 118.0 198.0 118.0
์Šฌ๊ธฐ 42.0 NaN NaN
์˜์ด 42.0 30.0 168.0
์ฒ ์ˆ˜ 168.0 174.0 156.0
์ฒ ์ด 92.0 154.0 112.0
d3.drop_duplicates(subset=['๊ตญ์–ด', '์˜์–ด'])
๊ตญ์–ด ์ˆ˜ํ•™ ์˜์–ด
๊ธธ๋™ 174.0 168.0 152.0
๋ฏธ์˜ 42.0 NaN NaN
์ˆœ์ด 118.0 198.0 118.0
์˜์ด 42.0 30.0 168.0
์ฒ ์ˆ˜ 168.0 174.0 156.0
์ฒ ์ด 92.0 154.0 112.0

์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ#

  • ๋‹ค๋ฅธ ์ž๋ฃŒํ˜•์„ ์‹œ๊ณ„์—ด ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜

  • to_datetime(): ๋ฌธ์ž์—ด์„ timestamp๋กœ ๋ณ€ํ™˜

data = [['1990-03-02', 90], ['1991-08-08', 95], ['1990-11-22',90], ['1991-01-05', 88]]
names=['์ฒ ์ˆ˜','์˜์ด','๊ธธ๋™','๋ฏธ์˜']
column=['์ƒ๋…„์›”์ผ','์ ์ˆ˜']
d1 = pd.DataFrame(data, index=names, columns=column)
d1
์ƒ๋…„์›”์ผ ์ ์ˆ˜
์ฒ ์ˆ˜ 1990-03-02 90
์˜์ด 1991-08-08 95
๊ธธ๋™ 1990-11-22 90
๋ฏธ์˜ 1991-01-05 88
  • ์ƒ๋…„์›”์ผ์„ ํ™•์ธํ•ด๋ณด๋ฉด object ํƒ€์ž…์ด๋‹ค.

d1.info()
<class 'pandas.core.frame.DataFrame'>
Index: 4 entries, ์ฒ ์ˆ˜ to ๋ฏธ์˜
Data columns (total 2 columns):
์ƒ๋…„์›”์ผ    4 non-null object
์ ์ˆ˜      4 non-null int64
dtypes: int64(1), object(1)
memory usage: 96.0+ bytes
  • object ํƒ€์ž…์˜ ์ƒ๋…„์›”์ผ์„ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐํƒ€์ž…์ธ datetimeํ˜•์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์ž.

d1['์ƒ๋…„์›”์ผ'] = pd.to_datetime(d1['์ƒ๋…„์›”์ผ'])
d1
์ƒ๋…„์›”์ผ ์ ์ˆ˜
์ฒ ์ˆ˜ 1990-03-02 90
์˜์ด 1991-08-08 95
๊ธธ๋™ 1990-11-22 90
๋ฏธ์˜ 1991-01-05 88
  • datetime์œผ๋กœ ๋ณ€ํ™˜ํ›„ ํ™•์ธํ•ด๋ณด๋ฉด ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

d1.info()
<class 'pandas.core.frame.DataFrame'>
Index: 4 entries, ์ฒ ์ˆ˜ to ๋ฏธ์˜
Data columns (total 2 columns):
์ƒ๋…„์›”์ผ    4 non-null datetime64[ns]
์ ์ˆ˜      4 non-null int64
dtypes: datetime64[ns](1), int64(1)
memory usage: 96.0+ bytes
  • ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ํ™œ์šฉ

    • ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

    • ์—ฐ-์›”-์ผ ์ •๋ณด์—์„œ ์—ฐ,์›”,์ผ ์ถ”์ถœ: dt.year, dt.month, dt.day๋ฅผ ์‚ฌ์šฉ

d1['๋…„'] = d1['์ƒ๋…„์›”์ผ'].dt.year
d1['์›”'] = d1['์ƒ๋…„์›”์ผ'].dt.month
d1['์ผ'] = d1['์ƒ๋…„์›”์ผ'].dt.day
d1
์ƒ๋…„์›”์ผ ์ ์ˆ˜ ๋…„ ์›” ์ผ
์ฒ ์ˆ˜ 1990-03-02 90 1990 3 2
์˜์ด 1991-08-08 95 1991 8 8
๊ธธ๋™ 1990-11-22 90 1990 11 22
๋ฏธ์˜ 1991-01-05 88 1991 1 5
  • ์—ฐ-์›”-์ผ ์ •๋ณด์—์„œ ์—ฐ-์›” ์ถ”์ถœ: dt.to_period()๋ฅผ ์‚ฌ์šฉ

  • df.to_period(freq=None, axis=0, copy=True)

  • freq : ์›ํ•˜๋Š” ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ ๋ณ€ํ™˜(โ€˜Yโ€™,โ€™Mโ€™,โ€™Dโ€™, โ€˜Wโ€™)

  • axis : ๋ณ€ํ™˜ํ•  ๊ธฐ์ค€ ์ถ•

  • copy : ์‚ฌ๋ณธ์„ ํ˜•์„ฑํ• ์ง€ ์—ฌ๋ถ€

d1
์ƒ๋…„์›”์ผ ์ ์ˆ˜ ๋…„ ์›” ์ผ
์ฒ ์ˆ˜ 1990-03-02 90 1990 3 2
์˜์ด 1991-08-08 95 1991 8 8
๊ธธ๋™ 1990-11-22 90 1990 11 22
๋ฏธ์˜ 1991-01-05 88 1991 1 5
d1['๋…„์›”'] = d1['์ƒ๋…„์›”์ผ'].dt.to_period(freq='M')
d1
์ƒ๋…„์›”์ผ ์ ์ˆ˜ ๋…„ ์›” ์ผ ๋…„์›”
์ฒ ์ˆ˜ 1990-03-02 90 1990 3 2 1990-03
์˜์ด 1991-08-08 95 1991 8 8 1991-08
๊ธธ๋™ 1990-11-22 90 1990 11 22 1990-11
๋ฏธ์˜ 1991-01-05 88 1991 1 5 1991-01
  • ๋‚ ์งœ ์ธ๋ฑ์Šค ํ™œ์šฉ

d2 = d1.set_index(['์ƒ๋…„์›”์ผ'])
d2
์ ์ˆ˜ ๋…„ ์›” ์ผ ๋…„์›”
์ƒ๋…„์›”์ผ
1990-03-02 90 1990 3 2 1990-03
1991-08-08 95 1991 8 8 1991-08
1990-11-22 90 1990 11 22 1990-11
1991-01-05 88 1991 1 5 1991-01
d2.index
DatetimeIndex(['1990-03-02', '1991-08-08', '1990-11-22', '1991-01-05'], dtype='datetime64[ns]', name='์ƒ๋…„์›”์ผ', freq=None)
d2.loc['1990-03']
์ ์ˆ˜ ๋…„ ์›” ์ผ ๋…„์›”
์ƒ๋…„์›”์ผ
1990-03-02 90 1990 3 2 1990-03
d2.loc['1990']
์ ์ˆ˜ ๋…„ ์›” ์ผ ๋…„์›”
์ƒ๋…„์›”์ผ
1990-03-02 90 1990 3 2 1990-03
1990-11-22 90 1990 11 22 1990-11
  • ์ •ํ™•ํ•œ ์ธ๋ฑ์Šค๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

d2.loc['1990-03-02':'1990-12-31']
์ ์ˆ˜ ๋…„ ์›” ์ผ ๋…„์›”
์ƒ๋…„์›”์ผ
1990-03-02 90 1990 3 2 1990-03
1990-11-22 90 1990 11 22 1990-11
today = pd.to_datetime('2024-05-14')
today
Timestamp('2024-05-14 00:00:00')
d2['๋‚ ์งœ_์ฐจ์ด'] = today-d2.index
d2
์ ์ˆ˜ ๋…„ ์›” ์ผ ๋…„์›” ๋‚ ์งœ_์ฐจ์ด
์ƒ๋…„์›”์ผ
1990-03-02 90 1990 3 2 1990-03 12492 days
1991-08-08 95 1991 8 8 1991-08 11968 days
1990-11-22 90 1990 11 22 1990-11 12227 days
1991-01-05 88 1991 1 5 1991-01 12183 days

melt()๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ์ •๋ฆฌ#

  • ๋„“์€ ๋ฐ์ดํ„ฐ: ๋ฐ์ดํ„ฐ์˜ ์—ด ์ด๋ฆ„์ด ์–ด๋–ค ๊ฐ’์„ ์˜๋ฏธํ•˜๋ฉด ์—ด์˜ ํญ์ด ๋„“์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ

  • melt()๋ฉ”์„œ๋“œ๋Š” ์ง€์ •ํ•œ ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ํ–‰์œผ๋กœ ์ •๋ฆฌํ•ด์ค€๋‹ค.

    • id_vars: ์œ„์น˜๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์—ด์˜ ์ด๋ฆ„์„ ์ง€์ •

    • value_vars: ํ–‰์œผ๋กœ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•  ์—ด์˜ ์ด๋ฆ„์„ ์ง€์ •. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด id_vars์—์„œ ๋ช…์‹œํ•œ ์—ด์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์—ด์ด ํ–‰์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค.

    • var_name: value_vars๋กœ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•œ ์—ด์˜ ์ด๋ฆ„์„ ์ง€์ •

    • value_name: var_name์œผ๋กœ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•œ ์—ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ ์—ด์˜ ์ด๋ฆ„์„ ์ง€์ •

# ์ข…๊ต์™€ ์†Œ๋“ ์ˆ˜์ค€ ๊ฐ„์˜ ๊ด€๊ณ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ
# Pew Research Center Religion & Public Life ์›น์‚ฌ์ดํŠธ
a = ['religion', '<$10k', '$10-20k', '$20-30k', '$30-40k', '$40-50k', '$50-75k', \
'$75-100k','$100-150k', '>150k', "Don't know/refused"]

data =[['Agnostic', 27, 34, 60, 81, 76, 137, 122, 109, 84, 96],\
       ['Atheist', 12, 27, 37, 52, 35, 70, 73, 59, 74, 76], \
       ['Buddhist', 27, 21, 30, 34, 33, 58, 62, 39, 53, 54], \
       ['Catholic', 418, 617, 732, 670, 638, 1116, 949, 792, 633, 1489], \
       ["Don't know/refused", 15, 14, 15, 11, 10, 35, 21, 17, 18, 116]]
df=pd.DataFrame(data, columns=a)
df
religion <$10k $10-20k $20-30k $30-40k $40-50k $50-75k $75-100k $100-150k >150k Don't know/refused
0 Agnostic 27 34 60 81 76 137 122 109 84 96
1 Atheist 12 27 37 52 35 70 73 59 74 76
2 Buddhist 27 21 30 34 33 58 62 39 53 54
3 Catholic 418 617 732 670 638 1116 949 792 633 1489
4 Don't know/refused 15 14 15 11 10 35 21 17 18 116
  • 1๊ฐœ์˜ ์—ด๋งŒ ๊ณ ์ •ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์—ด์„ ํ–‰์œผ๋กœ ๋ฐ”๊พธ๊ธฐ

pew_long = pd.melt(df, id_vars='religion', var_name='income', value_name='count')
pew_long
religion income count
0 Agnostic <$10k 27
1 Atheist <$10k 12
2 Buddhist <$10k 27
3 Catholic <$10k 418
4 Don't know/refused <$10k 15
5 Agnostic $10-20k 34
6 Atheist $10-20k 27
7 Buddhist $10-20k 21
8 Catholic $10-20k 617
9 Don't know/refused $10-20k 14
10 Agnostic $20-30k 60
11 Atheist $20-30k 37
12 Buddhist $20-30k 30
13 Catholic $20-30k 732
14 Don't know/refused $20-30k 15
15 Agnostic $30-40k 81
16 Atheist $30-40k 52
17 Buddhist $30-40k 34
18 Catholic $30-40k 670
19 Don't know/refused $30-40k 11
20 Agnostic $40-50k 76
21 Atheist $40-50k 35
22 Buddhist $40-50k 33
23 Catholic $40-50k 638
24 Don't know/refused $40-50k 10
25 Agnostic $50-75k 137
26 Atheist $50-75k 70
27 Buddhist $50-75k 58
28 Catholic $50-75k 1116
29 Don't know/refused $50-75k 35
30 Agnostic $75-100k 122
31 Atheist $75-100k 73
32 Buddhist $75-100k 62
33 Catholic $75-100k 949
34 Don't know/refused $75-100k 21
35 Agnostic $100-150k 109
36 Atheist $100-150k 59
37 Buddhist $100-150k 39
38 Catholic $100-150k 792
39 Don't know/refused $100-150k 17
40 Agnostic >150k 84
41 Atheist >150k 74
42 Buddhist >150k 53
43 Catholic >150k 633
44 Don't know/refused >150k 18
45 Agnostic Don't know/refused 96
46 Atheist Don't know/refused 76
47 Buddhist Don't know/refused 54
48 Catholic Don't know/refused 1489
49 Don't know/refused Don't know/refused 116

ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”์„ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ์ •๋ฆฌ#

  • ํ”ผ๋ฒ— ํ…Œ์ด๋ธ”: ๋ฐ์ดํ„ฐ๋ฅผ ์š”์•ฝํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ด๋ธ”

  • ์›์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์žฌ๊ตฌ์„ฑํ•˜๊ณ , ํ•„์š”์— ๋”ฐ๋ผ ํŠน์ • ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๊ฑฐ๋‚˜ ์ง‘๊ณ„ํ•  ์ˆ˜ ์žˆ์Œ

  • .pivot_table(df, index=์ธ๋ฑ์Šค๋ฆฌ์ŠคํŠธ, values=๊ฐ’๋ฆฌ์ŠคํŠธ)

  • salesfunnel.xlsx: ํŒ๋งค ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ

    • Account: ๊ฑฐ๋ž˜๋ฅผ ์ง„ํ–‰ํ•œ ๊ณ ๊ฐ์˜ ๊ณ„์ • ๋ฒˆํ˜ธ

    • Name: ๊ณ ๊ฐ์˜ ์ด๋ฆ„

    • Rep: ๊ฑฐ๋ž˜๋ฅผ ์ง„ํ–‰ํ•œ ํŒ๋งค ๋Œ€ํ‘œ

    • Manager: ํŒ๋งค ๋Œ€ํ‘œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋งค๋‹ˆ์ €

    • Product: ๊ฑฐ๋ž˜๋œ ์ œํ’ˆ

    • Quantity: ๊ฑฐ๋ž˜๋œ ์ œํ’ˆ์˜ ์ˆ˜๋Ÿ‰

    • Price: ์ œํ’ˆ ๋‹จ๊ฐ€

    • Status: ๊ฑฐ๋ž˜์˜ ์ƒํƒœ (presented, pending, declined ๋“ฑ)

df = pd.read_excel('https://raw.githubusercontent.com/HaesunByun/common/main/data/salesfunnel.xlsx')
df.head()
Account Name Rep Manager Product Quantity Price Status
0 714466 Trantow-Barrows Craig Booker Debra Henley CPU 1 30000 presented
1 714466 Trantow-Barrows Craig Booker Debra Henley Software 1 10000 presented
2 714466 Trantow-Barrows Craig Booker Debra Henley Maintenance 2 5000 pending
3 737550 Fritsch, Russel and Anderson Craig Booker Debra Henley CPU 1 35000 declined
4 146832 Kiehn-Spinka Daniel Hilton Debra Henley CPU 2 65000 won
  • index๋Š” ๊ทธ๋ฃนํ•‘ํ•  ์—ด์˜ ์ด๋ฆ„์ด๋‹ค.

  • ์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” Manager์™€ Rep๋ฅผ index๋กœ ํ•˜์—ฌ ๊ทธ๋ฃนํ•‘ํ•˜๋ฉฐ, ๊ทธ๋ฃนํ•‘ํ•  values๋Š” โ€˜priceโ€™์ด๋‹ค.

  • value๋ฅผ pivot_table๋กœ ํ•ฉ์นœ ๊ฒฝ์šฐ ๋””ํดํŠธ๋กœ ํ‰๊ท ์น˜๋กœ ๊ณ„์‚ฐ๋œ๋‹ค.

pd.pivot_table(df, index=['Manager', 'Rep'], values=['Price'])
Price
Manager Rep
Debra Henley Craig Booker 20000.000000
Daniel Hilton 38333.333333
John Smith 20000.000000
Fred Anderson Cedric Moss 27500.000000
Wendy Yule 44250.000000
  • value์˜ ๊ฐ’์„ ํ•ฉ์‚ฐ์œผ๋กœ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ aggfunc์˜ต์…˜์— sumํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์“ด๋‹ค.

pd.pivot_table(df, index=['Manager', 'Rep'], values=['Price'], aggfunc=sum)
Price
Manager Rep
Debra Henley Craig Booker 80000
Daniel Hilton 115000
John Smith 40000
Fred Anderson Cedric Moss 110000
Wendy Yule 177000

ChatGPT ํ™œ์šฉํ•˜๊ธฐ#

  • ChatGPT(Generative Pre-trained Transformer)๋Š” ๋ฏธ๊ตญ์˜ AI ์—ฐ๊ตฌ์žฌ๋‹จ OpenAI๊ฐ€ 2022๋…„ 11์›” ๊ณต๊ฐœํ•œ ์ดˆ๊ฑฐ๋Œ€ ์–ธ์–ด๋ชจ๋ธ GPT-3.5 ๊ธฐ๋ฐ˜ ๋Œ€ํ™”ํ˜• ์ธ๊ณต์ง€๋Šฅ ์ฑ—๋ด‡์ด๋‹ค.

  • Generative(์ƒ์„ฑํ˜•), Pre-trained(๋ฏธ๋ฆฌ ํ•™์Šต๋œ) Transformer(๋ณ€ํ™˜๊ธฐ)

  • ํ˜„์žฌ Chat GPT ํ™ˆํŽ˜์ด์ง€(https://chat.openai.com/chat) ์—์„œ ๋ˆ„๊ตฌ๋‚˜ ๊ฐ€์ž… ํ›„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ฑ„ํŒ… ํ•˜๋“ฏ ์งˆ๋ฌธ์„ ์ž…๋ ฅํ•˜๋ฉด ChatGPT๋Š” ํ•™์Šตํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ โ€˜์‚ฌ๋žŒ์ฒ˜๋Ÿผโ€™ ๋ฌธ์žฅ์„ ๋งŒ๋“ค์–ด ๋‹ต์„ ํ•ด์ค€๋‹ค.

  • ๋งˆ์น˜ ์ง„์งœ ์‚ฌ๋žŒ๊ณผ ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€์„ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹จ์ˆœ ์ •๋ณด ์งœ๊น๊ธฐ๋ฟ ์•„๋‹ˆ๋ผ ์—์„ธ์ดใƒป์†Œ์„คใƒป์‹œ ๋“ฑ ๋‹ค์–‘ํ•œ ์ฐฝ์ž‘๋ฌผ, ์‹ฌ์ง€์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ๊นŒ์ง€ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ ์—์„œ ํ™”์ œ๊ฐ€ ๋˜๊ณ  ์žˆ๋‹ค.

์ถœ์‹œ์ผ

2022. 11. 30 ์ถœ์‹œ
2023. 3. 14 GPT-4 ์ถœ์‹œ
2023. 3. 23 chatGPT plugins ๊ณต๊ฐœ
์ง€์†์  ์—…๋ฐ์ดํŠธ

ChatGPT ๊ฐ€์ž…ํ•˜๊ธฐ#

ChatGPT

https://chat.openai.com

ChatGPT์—๊ฒŒ ์งˆ๋ฌธํ•˜๊ธฐ#

Q. ChatGPT์—๊ฒŒ ์งˆ๋ฌธํ•ด๋ณด์„ธ์š”.

  • ChatGPT๋ž€ ๋ญ์•ผ?

  • ์ธ๊ณต์ง€๋Šฅ์— ๋Œ€ํ•œ ์‹œ๋ฅผ ์ž‘์„ฑํ•ด์ค˜

  • ChatGPT ํ™œ์šฉ ๋ถ„์•ผ๋ฅผ ์•Œ๋ ค์ค˜

  • Chat GPT๋Š” ์ ‘์†์ด ์›ํ™œํ•œ ์‹œ๊ฐ„์ด ์–ธ์ œ์•ผ?

  • Chat GPT ์œ ๋ฃŒ์™€ ๋ฌด๋ฃŒ์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•ด์ค˜

  • ์„ธ์ƒ์—์„œ ๊ฐ€์žฅ ์•„๋ฆ„๋‹ค์šด ๊ณณ์€?

  • ์„ธ์ต์Šคํ”ผ์–ด ์ž‘ํ’ˆ์— ๋Œ€ํ•ด ๊ฐ€๋ฅด์ณ ์ค˜

์ฝ”๋žฉ์˜ AI์ฝ”๋”ฉ#

  • ์ฝ”๋žฉ์—์„œ๋„ AI๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋‹ค๋งŒ workspace๊ณ„์ •(์ผ๋ฐ˜์ ์œผ๋กœ ํŒ€์ด๋‚˜ ์กฐ์ง ๋‚ด์—์„œ ํ˜‘์—…ํ•˜๊ณ  ์—…๋ฌด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ณ„์ •)์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์ฆ‰ ํ•™๊ต๋ฉ”์ผ๋กœ ๋กœ๊ทธ์ธํ•œ ๊ตฌ๊ธ€๊ณ„์ •์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

Practice-1: Chat-GPT๋กœ ์„œ์šธ์ธ๊ตฌ๋ฐ์ดํ„ฐ ํ™œ์šฉํ•ด๋ณด๊ธฐ#

  • ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ ์‚ฌ์ดํŠธ : https://data.seoul.go.kr/

  • ๊ฒ€์ƒ‰์–ด: ์„œ์šธ์‹œ ์ž์น˜๊ตฌ๋ณ„ ์ธ๊ตฌ์ˆ˜

  • ๋ชฉํ‘œ:

    • ๊ฐ ๊ตฌ๋ณ„ ํ•œ๊ตญ์ธ์˜ ๋น„์œจ ๊ตฌํ•˜๊ธฐ

    • ๊ฐ ๊ตฌ๋ณ„ ์™ธ๊ตญ์ธ์˜ ๋น„์œจ ๊ตฌํ•˜๊ธฐ

    • ๊ฐ ๊ตฌ๋ณ„ ๊ณ ๋ น์ž์˜ ๋น„์œจ ๊ตฌํ•˜๊ธฐ

    • ์ธ๊ตฌ์ˆ˜๊ฐ€ ์ ์€ ์ˆœ์„œ๋Œ€๋กœ 5๊ฐœ ๊ตฌ ์ถœ๋ ฅํ•˜๊ธฐ

    • ์™ธ๊ตญ์ธ ์ˆ˜ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ธฐ

    • ๊ณ ๋ น์ž ๋น„์œจ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ธฐ

    • ์ธ๊ตฌ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ž์น˜๊ตฌ์™€ ์ธ๊ตฌ์ˆ˜ ์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๊ธฐ

    • ์ธ๊ตฌ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ์€ ์ž์น˜๊ตฌ์™€ ์ธ๊ตฌ์ˆ˜ ์ตœ์†Œ๊ฐ’ ๊ตฌํ•˜๊ธฐ

    • ์ธ๊ตฌ์ˆ˜์™€ ๊ณ ๋ น์ž์ˆ˜ ๊ฐ„์˜ ์ƒ๊ด€ ๊ด€๊ณ„ ๊ตฌํ•˜๊ธฐ

๐Ÿ˜„ ํ•„์š”ํ•œ ์นผ๋Ÿผ๋งŒ ๋ถˆ๋Ÿฌ์™€์„œ ๋ฐ์ดํƒ€ํ”„๋ ˆ์ž„ ์ƒ์„ฑํ•˜๊ธฐ

  • ๋‹ค์šด๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์—ด์–ด์„œ ์•„๋ž˜์˜ ์˜ต์…˜์— ์‚ฌ์šฉํ•  ์นผ๋Ÿผ์„ ์‚ดํŽด๋ณธ๋‹ค.

  • header: ์นผ๋Ÿผ ์ด๋ฆ„ ์ง€์ •

  • index_col: index๋กœ ์ง€์ •ํ•  ์นผ๋Ÿผ ์ง€์ •

  • use_cols: ์‚ฌ์šฉํ•  ์นผ๋Ÿผ ์ง€์ •

๐Ÿ˜„ ๋ฐ์ดํƒ€ํ”„๋ ˆ์ž„ ์นผ๋Ÿผ๋ช… ๋ณ€๊ฒฝํ•˜๊ธฐ

๐Ÿ˜„ ๋ฐ์ดํƒ€ํ”„๋ ˆ์ž„ ์ธ๋ฑ์Šค ์„ค์ •ํ•˜๊ธฐ

๐Ÿ˜„ ๋ถˆํ•„์š”ํ•œ ํ–‰ ์‚ญ์ œํ•˜๊ธฐ

๐Ÿ˜„ ๊ฐ’ ๊ตฌํ•˜๊ธฐ

๊ฐ ๊ตฌ๋ณ„ ํ•œ๊ตญ์ธ์˜ ๋น„์œจ ๊ตฌํ•˜๊ธฐ
๊ฐ ๊ตฌ๋ณ„ ์™ธ๊ตญ์ธ์˜ ๋น„์œจ ๊ตฌํ•˜๊ธฐ
๊ฐ ๊ตฌ๋ณ„ ๊ณ ๋ น์ž์˜ ๋น„์œจ ๊ตฌํ•˜๊ธฐ

๐Ÿ˜„ ๊ฐ’์— ๋”ฐ๋ผ ์ •๋ ฌํ•˜๊ธฐ

- ์ธ๊ตฌ์ˆ˜๊ฐ€ ์ ์€ ์ˆœ์„œ๋Œ€๋กœ 5๊ฐœ ๊ตฌ ์ถœ๋ ฅํ•˜๊ธฐ
- ์™ธ๊ตญ์ธ ์ˆ˜ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ธฐ
- ๊ณ ๋ น์ž ๋น„์œจ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ธฐ

๐Ÿ˜„ ๋ฐ์ดํƒ€ํ”„๋ ˆ์ž„ ํ•„์š”ํ•œ ํ†ต๊ณ„๋‚ด๊ธฐ

- ์ธ๊ตฌ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ž์น˜๊ตฌ์™€ ์ธ๊ตฌ์ˆ˜ ์ตœ๋Œ€๊ฐ’ ๊ตฌํ•˜๊ธฐ
- ์ธ๊ตฌ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ์ ์€ ์ž์น˜๊ตฌ์™€ ์ธ๊ตฌ์ˆ˜ ์ตœ์†Œ๊ฐ’ ๊ตฌํ•˜๊ธฐ
- ์ธ๊ตฌ์ˆ˜์™€ ๊ณ ๋ น์ž์ˆ˜ ๊ฐ„์˜ ์ƒ๊ด€ ๊ด€๊ณ„ ๊ตฌํ•˜๊ธฐ