- 데이터 과학 라이브러리
- numpy: 파이썬에서 수학적 연산을 효과적으로 수행할 수 있도록 하는 라이브러리. 다차원 배열 및 행렬 연산에 유용하게 사용됩니다.
- pandas: 데이터를 조작하고 분석하기 위한 라이브러리. 테이블 형태의 데이터를 쉽게 다룰 수 있습니다.
- matplotlib: 파이썬에서 그래프 및 차트를 그리기 위한 라이브러리. 기본적인 그래프부터 복잡한 데이터 시각화까지 다양한 형태의 그래프를 그릴 수 있습니다.
- seaborn: matplotlib을 기반으로 하는 통계용 그래프 라이브러리. matplotlib보다 좀 더 간편하고 좀 더 다양한 그래프를 그릴 수 있습니다.
- plotly: 인터랙티브한 그래프를 그리기 위한 라이브러리. 웹사이트나 대쉬보드에서 사용하기 적합합니다.
- tensorflow: 구글에서 만든 오픈소스 머신러닝 라이브러리. 딥러닝 모델을 구현하고 학습시키는 데 사용됩니다.
- pytorch: 페이스북에서 만든 오픈소스 머신러닝 라이브러리. 딥러닝 모델을 구현하고 학습시키는 데 사용됩니다.
- scikit-learn (sklearn): 머신러닝을 위한 라이브러리로, 분류, 회귀, 클러스터링 등 다양한 머신러닝 알고리즘을 제공합니다.
데이터 분석
- pandas : 데이터 핸들링
- matplotlib, seaborn, plotly : 데이터 시각화
머신러닝
- pandas, numpy : 데이터 핸들링
- matplotlib, seaborn, plotly : 데이터 시각화
- scikit-learn : 모델링
딥러닝
- numpy : 데이터 핸들링
- matplotlib, seaborn, plotly : 데이터 시각화
- tensorflow, pytorch
Pandas¶
시리즈¶
In [ ]:
import pandas as pd
prices = [1000, 1010, 1020]
seris1 = pd.Series(prices)
seris1
Out[ ]:
0 1000
1 1010
2 1020
dtype: int64
In [ ]:
# 인덱스 부여
dates = pd.date_range('20230101', periods=3)
seris2 = pd.Series(prices, index=dates)
seris2
Out[ ]:
2023-01-01 1000
2023-01-02 1010
2023-01-03 1020
Freq: D, dtype: int64
date_range 활용¶
In [ ]:
pd.date_range('2022-01-01', '2023-01-01', freq='M')
pd.date_range('2022-01-01', '2023-01-01', freq='MS')
# freq='M'
# # M 말일을 출력한다
# MS 초일을 출력한다
Out[ ]:
DatetimeIndex(['2022-01-01', '2022-02-01', '2022-03-01', '2022-04-01',
'2022-05-01', '2022-06-01', '2022-07-01', '2022-08-01',
'2022-09-01', '2022-10-01', '2022-11-01', '2022-12-01',
'2023-01-01'],
dtype='datetime64[ns]', freq='MS')
In [ ]:
seris2[2] = 100
seris2
Out[ ]:
2023-01-01 1000
2023-01-02 1010
2023-01-03 100
Freq: D, dtype: int64
데이터프레임¶
In [ ]:
prices = {
'SK' : [44000, 44500, 45000],
'Samsung' : [70100, 70200, 70300],
'LG' : [85000, 85500, 86000]
}
df1 = pd.DataFrame(prices)
df1
Out[ ]:
SK | Samsung | LG | |
---|---|---|---|
0 | 44000 | 70100 | 85000 |
1 | 44500 | 70200 | 85500 |
2 | 45000 | 70300 | 86000 |
In [ ]:
df2 = pd.DataFrame(prices, index=dates)
df2
Out[ ]:
SK | Samsung | LG | |
---|---|---|---|
2023-01-01 | 44000 | 70100 | 85000 |
2023-01-02 | 44500 | 70200 | 85500 |
2023-01-03 | 45000 | 70300 | 86000 |
데이터 선택¶
- loc : index, column 으로 데이터를 가져온다.
- 데이터프레임의 행이나 컬럼에 label이나 boolean array로 접근.
- location의 약어로, 인간이 읽을 수 있는 label 값으로 데이터에 접근하는 것이다.
- iloc : 데이터 순서로 데이터를 가져온다.
- 데이터프레임의 행이나 컬럼에 인덱스 값으로 접근.
- integer location의 약어로, 컴퓨터가 읽을 수 있는 indexing 값으로 데이터에 접근하는 것이다.
In [ ]:
df2.iloc[:,:] # df2.iloc[:] # 동일하게 전체 출력
Out[ ]:
SK | Samsung | LG | |
---|---|---|---|
2023-01-01 | 44000 | 70100 | 85000 |
2023-01-02 | 44500 | 70200 | 85500 |
2023-01-03 | 45000 | 70300 | 86000 |
In [ ]:
df2.iloc[0] # 첫 행
Out[ ]:
SK 44000
Samsung 70100
LG 85000
Name: 2023-01-01 00:00:00, dtype: int64
In [ ]:
df2.iloc[:,0] # 첫 행 전체 + 인덱스까지 출력
# 행 전체
# 열 0번째만
Out[ ]:
2023-01-01 44000
2023-01-02 44500
2023-01-03 45000
Freq: D, Name: SK, dtype: int64
In [ ]:
df2.iloc[0,0]
Out[ ]:
44000
In [ ]:
df2.loc['2023-01-02']
Out[ ]:
SK 44500
Samsung 70200
LG 85500
Name: 2023-01-02 00:00:00, dtype: int64
In [ ]:
df2.loc[:,'SK']
Out[ ]:
2023-01-01 44000
2023-01-02 44500
2023-01-03 45000
Freq: D, Name: SK, dtype: int64
In [ ]:
df2.SK # df2.column
Out[ ]:
2023-01-01 44000
2023-01-02 44500
2023-01-03 45000
Freq: D, Name: SK, dtype: int64
In [ ]:
df2['POSCO'] = [450000,455000,460000]
df2
Out[ ]:
SK | Samsung | LG | POSCO | |
---|---|---|---|---|
2023-01-01 | 44000 | 70100 | 85000 | 450000 |
2023-01-02 | 44500 | 70200 | 85500 | 455000 |
2023-01-03 | 45000 | 70300 | 86000 | 460000 |
In [ ]:
# 실습
# Q1. 2023년 1월 2일 ~ 2023 1월 3일 까지의 '삼성전자', 'LG전자' 데이터를 가져와주세요.
df2.iloc[1:3,[1,2]]
Out[ ]:
Samsung | LG | |
---|---|---|
2023-01-02 | 70200 | 85500 |
2023-01-03 | 70300 | 86000 |
In [ ]:
df2.loc['2023-01-02':'2023-01-03','Samsung':'LG']
Out[ ]:
Samsung | LG | |
---|---|---|
2023-01-02 | 70200 | 85500 |
2023-01-03 | 70300 | 86000 |
In [ ]:
# Q2. 데이터 70200원 가져오기 (iloc, loc 각각 활용)
df2.Samsung[1]
Out[ ]:
70200
In [ ]:
df2.iloc[1,1]
Out[ ]:
70200
In [ ]:
df2.loc['2023-01-02','Samsung']
Out[ ]:
70200
In [ ]:
print(df2.head())
SK Samsung LG POSCO
2023-01-01 44000 70100 85000 450000
2023-01-02 44500 70200 85500 455000
2023-01-03 45000 70300 86000 460000
데이터프레임 확장¶
- concat : 그냥 가져다 붙이는 거
- merge : 공통고니 칼럼이나 인덱스가 있는가 있는 경우
In [ ]:
s1 = pd.Series([500000, 500500, 501000], index=dates, name='LG화학')
In [ ]:
concat_df2 = pd.concat([df2, s1], axis=1)
concat_df2.head()
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | |
---|---|---|---|---|---|
2023-01-01 | 44000 | 70100 | 85000 | 450000 | 500000 |
2023-01-02 | 44500 | 70200 | 85500 | 455000 | 500500 |
2023-01-03 | 45000 | 70300 | 86000 | 460000 | 501000 |
In [ ]:
s2 = pd.Series([600000, 600500, 601000], index=dates, name='이더리움')
concat_df2 = pd.concat([concat_df2, s2], axis=1)
concat_df2.head()
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | |
---|---|---|---|---|---|---|
2023-01-01 | 44000 | 70100 | 85000 | 450000 | 500000 | 600000 |
2023-01-02 | 44500 | 70200 | 85500 | 455000 | 500500 | 600500 |
2023-01-03 | 45000 | 70300 | 86000 | 460000 | 501000 | 601000 |
In [ ]:
concat_df2.loc['2023-01-06',:] = [44000, 70100, 85000, 455000, 505000, 505500]
concat_df2.head()
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | |
---|---|---|---|---|---|---|
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 |
2023-01-03 | 45000.0 | 70300.0 | 86000.0 | 460000.0 | 501000.0 | 601000.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 |
In [ ]:
concat_df2.loc['2023-01-05',:] = concat_df2.loc['2023-01-06',:] - 100
concat_df2.head()
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | |
---|---|---|---|---|---|---|
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 |
2023-01-03 | 45000.0 | 70300.0 | 86000.0 | 460000.0 | 501000.0 | 601000.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 |
In [ ]:
concat_df2.sort_index() # 인덱스 정렬 후 출력
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | |
---|---|---|---|---|---|---|
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 |
2023-01-03 | 45000.0 | 70300.0 | 86000.0 | 460000.0 | 501000.0 | 601000.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 |
In [ ]:
concat_df2.sort_values(by='Samsung') # 오름차순
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | |
---|---|---|---|---|---|---|
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 |
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 |
2023-01-03 | 45000.0 | 70300.0 | 86000.0 | 460000.0 | 501000.0 | 601000.0 |
In [ ]:
concat_df2.sort_values(by='Samsung', ascending=False) # 내림차순
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | |
---|---|---|---|---|---|---|
2023-01-03 | 45000.0 | 70300.0 | 86000.0 | 460000.0 | 501000.0 | 601000.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 |
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 |
In [ ]:
concat_df2.drop('2023-01-03') # 변수에 저장되지 않고 출력만 된다.
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | |
---|---|---|---|---|---|---|
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 |
In [ ]:
concat_df2.drop('2023-01-03',inplace=True) # inplace 옵션으로 저장된다.
concat_df2.head()
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | |
---|---|---|---|---|---|---|
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 |
In [ ]:
concat_df2.drop('이더리움', axis=1) # column drop 예시
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | |
---|---|---|---|---|---|
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 |
In [ ]:
concat_df2.drop(['이더리움','SK'], axis=1) # column 을 리스트로 받아 drop
Out[ ]:
Samsung | LG | POSCO | LG화학 | |
---|---|---|---|---|
2023-01-01 | 70100.0 | 85000.0 | 450000.0 | 500000.0 |
2023-01-02 | 70200.0 | 85500.0 | 455000.0 | 500500.0 |
2023-01-06 | 70100.0 | 85000.0 | 455000.0 | 505000.0 |
2023-01-05 | 70000.0 | 84900.0 | 454900.0 | 504900.0 |
In [ ]:
concat_df2['sum'] = concat_df2.sum(axis=1)
concat_df2
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | sum | |
---|---|---|---|---|---|---|---|
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 | 1749100.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 | 1756200.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 | 1664600.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 | 1664000.0 |
In [ ]:
concat_df2.min(axis=0) # print min
Out[ ]:
SK 43900.0
Samsung 70000.0
LG 84900.0
POSCO 450000.0
LG화학 500000.0
이더리움 505400.0
sum 1664000.0
dtype: float64
In [ ]:
concat_df2.describe() # 문자 제외하고 컬럼별 정리
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | sum | |
---|---|---|---|---|---|---|---|
count | 4.00000 | 4.000000 | 4.00000 | 4.00000 | 4.000000 | 4.00000 | 4.000000e+00 |
mean | 44100.00000 | 70100.000000 | 85100.00000 | 453725.00000 | 502600.000000 | 552850.00000 | 1.708475e+06 |
std | 270.80128 | 81.649658 | 270.80128 | 2483.78072 | 2721.519184 | 54733.20138 | 5.109177e+04 |
min | 43900.00000 | 70000.000000 | 84900.00000 | 450000.00000 | 500000.000000 | 505400.00000 | 1.664000e+06 |
25% | 43975.00000 | 70075.000000 | 84975.00000 | 453675.00000 | 500375.000000 | 505475.00000 | 1.664450e+06 |
50% | 44000.00000 | 70100.000000 | 85000.00000 | 454950.00000 | 502700.000000 | 552750.00000 | 1.706850e+06 |
75% | 44125.00000 | 70125.000000 | 85125.00000 | 455000.00000 | 504925.000000 | 600125.00000 | 1.750875e+06 |
max | 44500.00000 | 70200.000000 | 85500.00000 | 455000.00000 | 505000.000000 | 600500.00000 | 1.756200e+06 |
결측치¶
- 제거 : dropna
- 대체 : fillna, interpolate
In [ ]:
import pandas as pd
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
})
In [ ]:
print(df.sum(axis=0)) # 열 합계
A 6
B 15
C 24
dtype: int64
In [ ]:
# Q1. 2022-01-01 ~ 2022-12-01 월초 인덱스를 생성
dates3 = pd.date_range('2022-01-01', '2022-12-01', freq='MS')
In [ ]:
# Q2. Q1에서 생성한 인덱스를 가지고 데이터프레임 생성(값은 자율, 이때 칼럼이름은 value)
import random
randomlist = [random.randint(0,100) for i in range(len(dates3))]
df = pd.DataFrame({
'value' : randomlist}
,index=dates3)
df
Out[ ]:
value | |
---|---|
2022-01-01 | 9 |
2022-02-01 | 55 |
2022-03-01 | 49 |
2022-04-01 | 62 |
2022-05-01 | 7 |
2022-06-01 | 15 |
2022-07-01 | 64 |
2022-08-01 | 44 |
2022-09-01 | 14 |
2022-10-01 | 54 |
2022-11-01 | 46 |
2022-12-01 | 100 |
In [ ]:
# Q3. value 칼럼에서 100을 더한 value_add_100 칼럼을 생성해주세요.
df.loc[:,'value_add_100'] = df.loc[:,'value'] + 100
df
Out[ ]:
value | value_add_100 | |
---|---|---|
2022-01-01 | 9 | 109 |
2022-02-01 | 55 | 155 |
2022-03-01 | 49 | 149 |
2022-04-01 | 62 | 162 |
2022-05-01 | 7 | 107 |
2022-06-01 | 15 | 115 |
2022-07-01 | 64 | 164 |
2022-08-01 | 44 | 144 |
2022-09-01 | 14 | 114 |
2022-10-01 | 54 | 154 |
2022-11-01 | 46 | 146 |
2022-12-01 | 100 | 200 |
In [ ]:
# Q4. value 칼럼과 value_add_100 칼럼을 평균한 mean 칼럼을 생성해주세요.
df.loc[:,'value_mean'] = df.mean(axis=1)
df
Out[ ]:
value | value_add_100 | value_mean | |
---|---|---|---|
2022-01-01 | 9 | 109 | 59.0 |
2022-02-01 | 55 | 155 | 105.0 |
2022-03-01 | 49 | 149 | 99.0 |
2022-04-01 | 62 | 162 | 112.0 |
2022-05-01 | 7 | 107 | 57.0 |
2022-06-01 | 15 | 115 | 65.0 |
2022-07-01 | 64 | 164 | 114.0 |
2022-08-01 | 44 | 144 | 94.0 |
2022-09-01 | 14 | 114 | 64.0 |
2022-10-01 | 54 | 154 | 104.0 |
2022-11-01 | 46 | 146 | 96.0 |
2022-12-01 | 100 | 200 | 150.0 |
fillna, interpolate
In [ ]:
# 임의로 중복 데이터 생성
concat_df3 = concat_df2.copy()
concat_df4 = pd.concat([concat_df2, concat_df3])
concat_df4
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | sum | |
---|---|---|---|---|---|---|---|
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 | 1749100.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 | 1756200.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 | 1664600.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 | 1664000.0 |
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 | 1749100.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 | 1756200.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 | 1664600.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 | 1664000.0 |
In [ ]:
concat_df4.drop_duplicates() # 중복 제거
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | sum | |
---|---|---|---|---|---|---|---|
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 | 1749100.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 | 1756200.0 |
2023-01-06 | 44000.0 | 70100.0 | 85000.0 | 455000.0 | 505000.0 | 505500.0 | 1664600.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 | 1664000.0 |
In [ ]:
concat_df2.loc['2023-01-03',:] = concat_df2.loc['2023-01-06',:].copy()
concat_df2.sort_index(inplace = True)
In [ ]:
# 삼성전자의 중복만 제거하여 데이터프레임 형태로 출력
idx = concat_df2['Samsung'].drop_duplicates().index
concat_df2.loc[idx,:]
# 인덱스 기준으로 데이터를 가져오는 활용
Out[ ]:
SK | Samsung | LG | POSCO | LG화학 | 이더리움 | sum | |
---|---|---|---|---|---|---|---|
2023-01-01 | 44000.0 | 70100.0 | 85000.0 | 450000.0 | 500000.0 | 600000.0 | 1749100.0 |
2023-01-02 | 44500.0 | 70200.0 | 85500.0 | 455000.0 | 500500.0 | 600500.0 | 1756200.0 |
2023-01-05 | 43900.0 | 70000.0 | 84900.0 | 454900.0 | 504900.0 | 505400.0 | 1664000.0 |
'새싹 > TIL' 카테고리의 다른 글
[핀테커스] 230913 pandas merge & metplot 시각화 (0) | 2023.09.13 |
---|---|
[핀테커스] 230912 pandas & 시계열데이터다루기 (0) | 2023.09.12 |
[핀테커스] 230908 postgresql 실습 (0) | 2023.09.08 |
[핀테커스] 230907 sqlite sql 실습 (0) | 2023.09.06 |
[핀테커스] 230906 python 모듈 함수 클래스 (0) | 2023.09.06 |