Post

[Python] ํŒ๋‹ค์Šค(Pandas) - Series

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Pandas์˜ Series๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

Pandas๋ž€? ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•œ ๊ณ ์ˆ˜์ค€์˜ ์ž๋ฃŒ๊ตฌ์กฐ์™€ ๋ถ„์„ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์—ฌ๊ธฐ์„œ โ€˜๊ณ ์ˆ˜์ค€โ€™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ œ์–ดยท์‹œ๊ฐํ™”ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋œปํ•œ๋‹ค. ๋ฐ์ดํ„ฐ ๋ถ„์„์˜ ํ•„์ˆ˜ ๋ชจ๋“ˆ์ด๋‹ค.

Series: ์ธ๋ฑ์Šค๊ฐ€ ๋ถ™์€ 1์ฐจ์› ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ.


1. Series ์ƒ์„ฑ

1
2
3
4
5
data = np.array(["๊ฐ€", "๋‚˜", "๋‹ค"])
s = Series(data)
# 0    ๊ฐ€
# 1    ๋‚˜
# 2    ๋‹ค   (๊ธฐ๋ณธ ์ธ๋ฑ์Šค 0,1,2)

์ธ๋ฑ์Šค๋ฅผ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

1
2
3
4
5
6
data = [1000, 2000, 3000]
index = ['๋ฉ”๋กœ๋‚˜', '๊ตฌ๊ตฌ์ฝ˜', 'ํ•˜๊ฒ๋‹ค์ฆˆ']
s = Series(data=data, index=index)
# ๋ฉ”๋กœ๋‚˜     1000
# ๊ตฌ๊ตฌ์ฝ˜     2000
# ํ•˜๊ฒ๋‹ค์ฆˆ    3000

Series์˜ ์†์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์†์„ฑ๋ฐ˜ํ™˜
s.index์ธ๋ฑ์Šค
s.values๊ฐ’
s.dtype์ž๋ฃŒํ˜•

2. ์ธ๋ฑ์‹ฑ โ€” loc vs iloc

๋ฐฉ์‹๊ธฐ์ค€์Šฌ๋ผ์ด์‹ฑ
s.loc['๋ฉ”๋กœ๋‚˜']๋‚ด๊ฐ€ ๋งŒ๋“  ์ธ๋ฑ์Šค๋งˆ์ง€๋ง‰ ํฌํ•จ
s.iloc[0]๊ธฐ๋ณธ(์ •์ˆ˜) ์ธ๋ฑ์Šค๋งˆ์ง€๋ง‰ ์ œ์™ธ
1
2
s.loc['๋ฉ”๋กœ๋‚˜']   # 1000 (๋ผ๋ฒจ๋กœ)
s.iloc[0]        # 1000 (์ •์ˆ˜ ์œ„์น˜๋กœ)

โš ๏ธ loc๋กœ ์Šฌ๋ผ์ด์‹ฑํ•˜๋ฉด iloc์™€ ๋‹ฌ๋ฆฌ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋„ ํฌํ•จํ•œ๋‹ค.


3. ์ธ๋ฑ์Šค๊ฐ€ ๋‹ค๋ฅธ Series ์—ฐ์‚ฐ

1
2
3
4
s1 = Series([10, 20, 30], index=["๊ฐ€", "๋‚˜", "๋‹ค"])
s2 = Series([20, 30, 40])   # ์ธ๋ฑ์Šค 0,1,2

s1 + s2   # ์ „๋ถ€ NaN!

๐Ÿ’ก Series ์—ฐ์‚ฐ์€ ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•ด์„œ ๊ณ„์‚ฐํ•œ๋‹ค. ์ธ๋ฑ์Šค๊ฐ€ ๋งž์ง€ ์•Š์œผ๋ฉด ์ง์ด ์—†์–ด NaN(float ํƒ€์ž…)์ด ๋œ๋‹ค.


4. ์กฐ๊ฑด(๋ถˆ๋ฆฌ์–ธ) ์ธ๋ฑ์‹ฑ

1
2
3
4
5
lge = Series([93000, 82400, 99100, 81000, 72300],
             index=["05/27", "05/28", "05/29", "05/30", "05/31"])

lge.index[lge.values < 85000]
# >>> Index(['05/28', '05/30', '05/31'])   โ†’ ์ข…๊ฐ€ 85000 ๋ฏธ๋งŒ ๋‚ ์งœ

๐Ÿ’ก values < 85000์€ ๊ฐ ๋ฐ์ดํ„ฐ์— ์กฐ๊ฑด์„ ๋Œ€์ž…ํ•ด True/False Series๋ฅผ ๋งŒ๋“ ๋‹ค. ์ด๋ฅผ ์ธ๋ฑ์‹ฑ์— ๋„ฃ์œผ๋ฉด True์ธ ๊ฒƒ๋งŒ ์ถ”์ถœ๋œ๋‹ค. (LG์ „์ž ์ข…๊ฐ€์—์„œ 85000 ๋ฏธ๋งŒ์ธ ๋‚ ์งœ)


๋ฒˆ์™ธ โ€” ๋น„ํŠธ์ฝ”์ธยท๋ฆฌํ”Œ ์ƒ๊ด€๊ด€๊ณ„ ํšŒ๊ท€

๋‘ ์ฝ”์ธ ๊ฐ€๊ฒฉ์˜ ๊ด€๊ณ„๋ฅผ ์—ญํ–‰๋ ฌ(์ตœ์†Œ์ œ๊ณฑ)๋กœ ์ผ์ฐจํ•จ์ˆ˜๋กœ ๋„์ถœํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
btc_re = btc['close'].values[-1000:].reshape(-1, 1)
xrp_re = xrp['close'].values[-1000:].reshape(-1, 1)

o = np.ones((1000, 1), dtype=np.uint32)
btc_o = np.hstack((btc_re, o))
btc_o_t = np.linalg.pinv(btc_o)   # ์œ ์‚ฌ ์—ญํ–‰๋ ฌ

result = btc_o_t @ xrp_re
a, b = result[0, 0], result[1, 0]   # ๊ธฐ์šธ๊ธฐ, ์ ˆํŽธ

x = btc['close'].values[-1000:]
y = a * x + b                        # ํšŒ๊ท€์„ 
plt.plot(x, y, color="r")

Desktop View

x์ถ•์„ ๋น„ํŠธ์ฝ”์ธ, y์ถ•์„ ๋ฆฌํ”Œ๋กœ ๋‘๊ณ  ๋Œ€์‘๊ฐ’์„ ์ผ์ฐจํ•จ์ˆ˜๋กœ ํ‘œํ˜„ํ•ด ํšŒ๊ท€์„ ์„ ๊ทธ๋ ธ๋‹ค.


๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
6
Pandas Series
โ”œโ”€ ์ƒ์„ฑ    Series(data, index=...)
โ”œโ”€ ์†์„ฑ    index / values / dtype
โ”œโ”€ ์ธ๋ฑ์‹ฑ  loc(๋ผ๋ฒจ, ๋ ํฌํ•จ) vs iloc(์ •์ˆ˜)
โ”œโ”€ ์—ฐ์‚ฐ    ์ธ๋ฑ์Šค ๊ธฐ์ค€ ์ •๋ ฌ, ์•ˆ ๋งž์œผ๋ฉด NaN
โ””โ”€ ์กฐ๊ฑด    values<n โ†’ True/False โ†’ ํ•„ํ„ฐ๋ง
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
Series์ธ๋ฑ์Šค๊ฐ€ ๋ถ™์€ 1์ฐจ์› ๋ฐ์ดํ„ฐ
loc / iloc๋ผ๋ฒจ ์ธ๋ฑ์‹ฑ / ์ •์ˆ˜ ์ธ๋ฑ์‹ฑ
๋ถˆ๋ฆฌ์–ธ ์ธ๋ฑ์‹ฑ์กฐ๊ฑด์œผ๋กœ ๋ฐ์ดํ„ฐ ํ•„ํ„ฐ
NaN์ธ๋ฑ์Šค ๋ถˆ์ผ์น˜ ์‹œ ๊ฒฐ์ธก๊ฐ’

Series์˜ ํ•ต์‹ฌ์€ โ€œ์ธ๋ฑ์Šค๊ฐ€ ๋ถ™์€ ๋ฐ์ดํ„ฐโ€๋ผ๋Š” ์ ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์—ฐ์‚ฐ์ด ์ธ๋ฑ์Šค ๊ธฐ์ค€์œผ๋กœ ์ด๋ค„์ง€๊ณ , ์กฐ๊ฑด ์ธ๋ฑ์‹ฑ์œผ๋กœ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์†์‰ฝ๊ฒŒ ๊ฑธ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์—” 2์ฐจ์›์ธ DataFrame์„ ๋‹ค๋ฃฌ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.