[Python][TIL] ๋ฐ์ดํฐ ๋ถ์์ ํ์ฉ - numpy & pandas
๐ numpy ์ ๋ํด์ ์์๋ณด์
#๏ธโฃ numpy import
import numpy as np
#๏ธโฃ 1์ฐจ์ ๋ฐฐ์ด
d1 ์ด๋ผ๋ 1์ฐจ์ ๋ฐฐ์ด์ด ์๋ค๊ณ ํ ๋
d1 = np.array([1,2,3,4])
์ฐจ์ dimension ์ d1.ndim ์ผ๋ก, ํ๋ ฌ shape ์ d1.shape ๋ก ํ์ธํ ์ ์๋ค
print('dim = ' +str(d1.ndim), 'shape = '+str(d1.shape))
d1 ์ด๋ผ๋ ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ด๋ ํํํ ์ ์๋ค. โก arange(1,5)
d1_1 = np.array(np.arange(1,5))
#๏ธโฃ 2์ฐจ์ ๋ฐฐ์ด
2์ฐจ์ d2 ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์๋ค. ๋๊ดํธ ์์ ์๋ ๋ฐฐ์ด ์์๋ค์ด ํ๋์ ํ์ ๋ค์ด๊ฐ๋ค.
d2 = np.array([[1,2,3,4],
[5,6,7,8]])
dimension๊ณผ shape์ ๊ตฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. โก 2์ฐจ์, 2ํ 4์ด
print('dim = '+str(d2.ndim), 'shape = '+str(d2.shape))
d2 ๋ผ๋ ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ด๋ ํํํ ์ ์๋ค.
d2_1 = np.array([np.arange(1,5),
np.arange(5,9)])
#๏ธโฃ 3์ฐจ์ ๋ฐฐ์ด
๋ค์๊ณผ ๊ฐ์ด 2์ฐจ์ ๋ฐฐ์ด ๋ ๊ฐ๋ฅผ ํฉ์น ๊ฒ์ฒ๋ผ ํํํด์ 3์ฐจ์ ๋ฐฐ์ด์ ๋ง๋ค ์ ์๋ค.
d3 = np.array([[[1,2,3],[4,5,6],[7,8,9],[10,11,12]],
[[21,22,23],[24,25,26],[27,28,29],[30,31,32]]])
dimension ๊ณผ shape ์ ๊ตฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
print('dim = '+str(d3.ndim), 'shape = '+str(d3.shape))
d3 ๋ฐฐ์ด์ ๋ค์๊ณผ ๊ฐ์ด๋ ๊ตฌํ ์ ์๋ค.
d3_1 =np.array([[np.arange(1,4),np.arange(4,7),np.arange(7,10),np.arange(10,13)],
[np.arange(21,24),np.arange(24,27),np.arange(27,30),np.arange(30,33)]])
๐ pandas ์ ๋ํด์ ์์๋ณด์
#๏ธโฃ pandas import
import pandas as pd
#๏ธโฃ Series ๊ฐ์ฒด
- ์ผ์ฐจ์ ๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ๊ฐ๋ฟ ์๋๋ผ ๊ฐ ๊ฐ์ ์ฐ๊ฒฐ๋ ์ธ๋ฑ์ค ๊ฐ๋ ๋์์ ์ ์ฅ
1. List ๋ก Series ์์ฑ
๋ค์๊ณผ ๊ฐ์ list ๊ฐ ์๋ค.
data = ['2017', '2018', '2019', '2020']
Series ๋ก ์์ฑ์ ๊ฐ ๊ฐ์ ์ฐ๊ฒฐ๋ ์ธ๋ฑ์ค๊ฐ ํจ๊ป ๋ณ์์ ์ ์ฅ๋๋ค.
se = pd.Series(data)
์ผ๋ฐ list ์ Series ๋ ์ถ๋ ฅ๋๋ ๊ฐ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ค๋ฅด๋ค.
2. ์ธ๋ฑ์ค๋ช ๋ณ๊ฒฝ
๋ค์๊ณผ ๊ฐ์ด index ๋ช ์ ์์ ํ ์๋ ์๋ค.
se = pd.Series(data, index = ['a', 'b', 'c', 'd'])
2. Dictionary ๋ก Series ์์ฑ
Series๋ dictionary์ ์๊น์๊ฐ ๋ฒ์จ ์ ์ฌํ๋ค.
๋ค์๊ณผ ๊ฐ์ ๋์ ๋๋ฆฌ๊ฐ ์๋ค.
dic_data = {'kim':35000, 'e':60000, 'nok':40000}
Dictionary๋ก Series ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ค.
con_dictose = pd.Series(dic_data)
์๋ ๋์ ๋๋ฆฌ ๋ณ์์ Series๋ก ์์ฑ๋ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅ๊ฐ์ด ๋ค๋ฅด๋ค.
2. ์ธ๋ฑ์ค๋ช ๋ณ๊ฒฝ
์ด๊ฒ๋ index ๋ช ์ ๋ง์๋๋ก ์์ ํ ์ ์๋ค.
con_dictose.index = ['A', 'B', 'C']
#๏ธโฃ Dataframe ๊ฐ์ฒด
- pandas์ ๊ธฐ๋ณธ ์๋ฃ๊ตฌ์กฐ๋ก, row์ column์ ์ธ๋ฑ์ค๋ช ์ด ์๋ค.
- Series๋ฅผ ๋ถ์ฌ ๋ง๋ data table
- MS Office์ ์์ ํ๋ก๊ทธ๋จ๊ณผ ์ฐ๋์ด ์ฝ๋ค
1. Dataframe ์์ฑ
๋ค์๊ณผ ๊ฐ์ ๋์ ๋๋ฆฌ ๋ณ์๊ฐ ์๋ค.
data = {'name':['Lee', 'Hwang', 'Kim', 'Choi'],
'score':[100, 95, 80, 85],
'grade':['A', 'A', 'B', 'B']
}
dataframe ์ ์์ฑ
df = pd.DataFrame(data)
2. ์ปฌ๋ผ ์์ ๋ณ๊ฒฝ
๋ค์๊ณผ ๊ฐ์ด name, grade, score ์์๋ก ์ปฌ๋ผ์ ์์๋ ์์ ํ ์ ์๋ค.
df = pd.DataFrame(data, columns=['name', 'grade', 'score'])
3. ์ธ๋ฑ์ค๋ช ๋ณ๊ฒฝ
์ธ๋ฑ์ค๋ช ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฐ์ง ๋ช ๋ น์ด๋ก ์์ ํ ์ ์๋ค.
๋ฐฉ๋ฒ 1)
df = pd.DataFrame(data, index = ['Lee', 'Hwang', 'Kim', 'Choi'])
๋ฐฉ๋ฒ 2)
df.index = ['์ด', 'ํฉ', '๊น', '์ต']
4. ์ธ๋ฑ์ค ๊ธฐ์ค ์ ๋ ฌ
์ค๋ฆ์ฐจ์ ์ ๋ ฌ
df.sort_index(axis=0)
5. ์ปฌ๋ผ ๊ธฐ์ค ์ ๋ ฌ
์ค๋ฆ์ฐจ์ ์ ๋ ฌ
df.sort_values(by=['score'])
๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
df.sort_values(by=['score'], ascending=False)
์ปฌ๋ผ ๋ ๊ฐ ๊ธฐ์ค ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
df.sort_values(by=['grade','score'])
grade ์ปฌ๋ผ ๊ธฐ์ค์ผ๋ก๋ ์ค๋ฆ์ฐจ์, score ์ปฌ๋ผ ๊ธฐ์ค์ผ๋ก๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌ
df.sort_values(by=['grade','score'], ascending=[True, False])
6. ๊ทธ๋ฃนํ (SQL์ group by ๊ฐ๋ )
๋ค์๊ณผ ๊ฐ์ list๊ฐ ์๋ค.
student_list = [{'name': 'John', 'major': "Computer Science", 'sex':"male"},
{'name': 'Nate', 'major': "Computer Science", 'sex':"male"},
{'name': 'Abraham', 'major': "Physics", 'sex':"male"},
{'name': 'Brian', 'major': "Psychology", 'sex':"male"},
{'name': 'Janny', 'major': "Economics", 'sex':"female"},
{'name': 'Yuna', 'major': "Economics", 'sex':"female"},
{'name': 'Jeniffer', 'major': "Computer Science",'sex': "female"},
{'name': 'Edward', 'major': "Computer Science",'sex': "male"},
{'name': 'Zara', 'major': "Psychology", 'sex':"female"},
{'name': 'Wendy', 'major': "Economics", 'sex':"female"},
{'name': 'Sera', 'major': "Psychology", 'sex':"female"}]
์์ list๋ก dataframe ์์ฑ
df = pd.DataFrame(student_list, columns = ['name', 'major', 'sex'])
major ๋ผ๋ ์ปฌ๋ผ์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
groupby_major = df.groupby('major')
data type์ ๋ค์๊ณผ ๊ฐ๋ค. โก pandas.core.groupby.groupby.DataFrameGroupBy
type(groupby_major)
๋ช ๋ฒ์งธ ํ๋ค์ด ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์๋์ง ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ก ํ์ธํ ์ ์๋ค.
groupby_major.groups
์ด๊ฑธ for ๋ฌธ์ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ ํ์์ผ๋ก ์ถ๋ ฅํด๋ณด๋ฉด
for name, group in groupby_major:
print(name + ": " + str(len(group)))
print(group)
print()
๊ฐ ๊ทธ๋ฃน์ ์์๋ค์ ์๋ฅผ ๊ณ์ฐํ๋ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
df_major_cnt = pd.DataFrame({'count' : groupby_major.size()}).reset_index()
#๏ธโฃ ์์ ํ์ผ ์ฝ์ด์ค๊ธฐ
Y2018 = pd.read_excel('์ ์ฅ๊ฒฝ๋ก/์์
ํ์ผ๋ช
.xlsx', 'Y2018')
Y2019 = pd.read_excel('์ ์ฅ๊ฒฝ๋ก/์์
ํ์ผ๋ช
.xlsx', 'Y2019')
Y2020 = pd.read_excel('์ ์ฅ๊ฒฝ๋ก/์์
ํ์ผ๋ช
.xlsx', 'Y2020')
1. ์๋ก ๋ค๋ฅธ ์์ ํ์ผ ํฉ์น๊ธฐ (๋ง์น SQL์ union all๊ณผ ๊ฐ๋ค)
๋ฐฉ๋ฒ1)
Y_total = pd.concat([Y2018,Y2019,Y2020], axis=0,ignore_index = True)
๋ฐฉ๋ฒ2)
2018๋ ๋์ 2019๋ ๋๋ฅผ ํฉ์น๊ณ , 2020๋ ๋๋ฅผ ์์๋๋ก ํฉ์น๋ค.
Y_total2 = Y2018.append(Y2019,ignore_index = True)
Y_total2 = Y_total2.append(Y2020,ignore_index = True)
2. ์์ ํ์ผ๋ก ์ ์ฅํ๊ธฐ (csv ํ์ผ์ ์ ๊ณตํด์ผ ํ ๋)
Y_total.to_csv('์ ์ฅ๊ฒฝ๋ก/์์
ํ์ผ๋ช
.csv')
๋ง์ฝ header ๋ฅผ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด
Y_total.to_csv('์ ์ฅ๊ฒฝ๋ก/์์
ํ์ผ๋ช
.csv', header = False, index =False)
3. ์ด์ด์ง ํน์ ํ ์ถ์ถ (ํ์ด์ฌ์ ์ฌ๋ผ์ด์ฑ์ฒ๋ผ)
# ์ฒซ ํ๋ถํฐ 22ํ๊น์ง๋ง ์ถ์ถ
a1 = Y_total[:23]
# 23ํ๋ถํฐ 46ํ๊น์ง ์ถ์ถ
a2 = Y_total[23:47]
4. ์ด์ด์ง์ง ์์ ํน์ ํ ์ถ์ถ
# ๋งจ ์์ค ๋ฝ์
b1 = Y_total.loc[0]
# 0๋ฒ 4๋ฒ์ค ๋ฝ์
b2 = Y_total.loc[[0,4]]
5. ํํฐ๋ง (SQL์ where์ ์ ์กฐ๊ฑด ์ฐ๋ ๊ฒ์ฒ๋ผ)
d1 = Y_total[Y_total.๊ธฐ์จ >= 35]
d2 = Y_total[Y_total.๊ธฐ์จ <= -15]
d3 = Y_total[(Y_total.๊ธฐ์จ >=35)&(Y_total.์ง๋ฉด์จ๋ >=40)]
d4 = Y_total[Y_total.์ผ์ == '2018-01-01 01:00:00']
๋ง์ฝ ์ปฌ๋ผ์ด ๋ ์ง๊ด๋ จ์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฐ๋, ์, ์ผ, ์๊ฐ์ ์ก์๋์ ์ ์๋ค.
Y_total['Year'] = Y_total['์ผ์'].dt.year
Y_total['Month'] =Y_total['์ผ์'].dt.month
Y_total['Day'] =Y_total['์ผ์'].dt.day
Y_total['time'] =Y_total['์ผ์'].dt.time
Y_total['hour'] =Y_total['์ผ์'].dt.hour
๊ณ ๋ ๊ฒ ์ก์๋๊ณ 11์ 3์ผ์์ ๋ฐ์ดํฐ๋ค๋ง ์ถ๋ ฅํ ์ ์๋ค.
d5 = Y_total[(Y_total.Month == 11)&(Y_total.Day == 3)]
6. merge (SQL์ join์ฒ๋ผ)
์๋ ๋ ์์ ํ์ผ์ state ์ปฌ๋ผ์ด ๋์์ ์กด์ฌํ๋ค. state ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ก ๊ฐ์ ธ์ dataframe์ผ๋ก ์ ์ฅํ๋ค.
alco = pd.read_csv("์ ์ฅ๊ฒฝ๋ก/์์
ํ์ผ๋ช
.csv", index_col="State")
popu = pd.read_csv("์ ์ฅ๊ฒฝ๋ก/์์
ํ์ผ๋ช
.csv", index_col="State")
state ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ ์์ ํ์ผ์ merge ํ๋ค.
us_mer1 = pd.merge(alco.reset_index(), popu.reset_index()).set_index("State")
7. ์ธํฐ๋ท ์ฃผ์๋ก ์์ ํ์ผ ๊ฐ์ ธ์ค๊ธฐ
#๏ธโฃ ๊ทธ๋ํ ํ์ํ
matplotlib.pyplot import
# ๊ทธ๋ํ ๊ทธ๋ ค์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
import matplotlib.pyplot as plt
# figure๋ฅผ ์๋์ผ๋ก ์๋์ฐ ์ฐฝ์ผ๋ก ๋์ฐ๋ ๋ช
๋ น์ด
%matplotlib auto
๋ค์๊ณผ ๊ฐ์ด x ์ y ๋ณ์์, ์์ ๋ก ๊ฐ์ ธ์จ sheet ์ ํน์ ์ปฌ๋ผ๋ค๋ง ์ถ์ถํด์ ์ ์ฅํ๋ค.
x = Y_total['์ผ์']
y1 = Y_total['๊ธฐ์จ']
y2 = Y_total['์ง๋ฉด์จ๋']
y3 = Y_total['ํ์']
1. ๊ทธ๋ํ ํ์ํ
plt.figure()
์์ ํจ์๋ฅผ ์คํํ๋ฉด Figure์ ์๋์ฐ ์ฐฝ์ด ์๋กญ๊ฒ ์์ฑ๋๋ค.
plt.plot(x,y1*0.5)
plt.plot(x,y2)
๋ ์ปฌ๋ผ ๊ฐ์ ๊ฐ๊ฐ x์ถ, y์ถ์ผ๋ก ์ก๊ณ ๊ทธ๋ํ๋ฅผ ๊ทธ๋ฆฌ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ทธ๋ ค์ง ์ ์๋ค.
2. ๊ฒฉ์๋ฌด๋ฌ
plt.grid()
3. ์ถ์ด๋ฆ ์ถ๊ฐ
plt.xlabel('time')
plt.ylabel('temp')