데이터 라이브러리
외우면 분명히 도움이 될 내용
numpy
: 파이썬에서 수학적 연산을 효과적으로 수행할 수 있도록 하는 라이브러리. 다차원 배열 및 행렬 연산에 유용하게 사용됩니다.pandas
: 데이터를 조작하고 분석하기 위한 라이브러리. 테이블 형태의 데이터를 쉽게 다룰 수 있습니다.matplotlib
: 파이썬에서 그래프 및 차트를 그리기 위한 라이브러리. 기본적인 그래프부터 복잡한 데이터 시각화까지 다양한 형태의 그래프를 그릴 수 있습니다.seaborn
: matplotlib을 기반으로 하는 통계용 그래프 라이브러리. matplotlib보다 좀 더 간편하고 좀 더 다양한 그래프를 그릴 수 있습니다.plotly
: 인터랙티브한 그래프를 그리기 위한 라이브러리. 웹사이트나 대쉬보드에서 사용하기 적합합니다.tensorflow
: 구글에서 만든 오픈소스 머신러닝 라이브러리. 딥러닝 모델을 구현하고 학습시키는 데 사용됩니다.pytorch
: 페이스북에서 만든 오픈소스 머신러닝 라이브러리. 딥러닝 모델을 구현하고 학습시키는 데 사용됩니다.scikit-learn (sklearn)
: 머신러닝을 위한 라이브러리로, 분류, 회귀, 클러스터링 등 다양한 머신러닝 알고리즘을 제공합니다.요약
데이터 분석
머신러닝
딥러닝
배경지식
2020년
- keras
- tensorflow 1.x
2022년
- tensorflow(keras 먹음) 2.x
- pythorch
2023년
- 초급: tensorflow 80% 이상
- 중급 이상: tensorflow: pytorch = 50 : 50
axis
axis=0
: 행(row) 방향으로 동작axis=1
: 열(column) 방향으로 동작import pandas as pd
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
})
print(df.sum(axis=0)) # 열 합계
A 6
B 15
C 24
dtype: int64
print(df.sum(axis=1)) # 행 합계
0 12
1 15
2 18
dtype: int64
pandas는 칼럼 기준으로 한다는 걸 인지하기.
시리즈
시리즈는 1차원 데이터 배열, 모든 데이터 유형을 포함할 수 있다.
시리즈는 데이터프레임의 열이나 행으로 구성되며, 데이터프레임에서 하나의 열을 추출하면 시리즈가 반환된다.
시리즈 생성
import pandas as pd
prices = [1000, 1010, 1020]
Series1= pd.Series(prices)
Series1
---
0 1000
1 1010
2 1020
dtype: int64
#date_range함수: 날짜 인덱스를 생성. 1월1일 부터 3개 생성해달라
dates= pd.date_range('20230101', periods = 3)
#dates로 된 인덱스를 추가
Series2 = pd.Series(prices, index = dates)
Series2
**date_range**
날짜 인덱스를 생성. 표기한 정수를 기준으로 3개 생성#날짜 frequency를 조정해주는 함수 - month (default 월말)
pd.date_range('2022-01-01', '2023-01-01', freq ='M')
#날짜 frequency를 조정해주는 함수 - month start
pd.date_range('2022-01-01', '2023-01-01', freq ='MS')
---
(['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')
(freq = ‘M’ or ‘MS)
: 데이터 범위의 빈도 수를 알려주는 함수#새로운 row를 삽입하고 싶을 때에도 가능
Series2['2023-01-04'] = 1030
Series2
2023-01-01 1000
2023-01-02 1010
2023-01-03 1020
2023-01-04 1030
---
#슬라이싱을 통해 원하는 값을 출력할 수 있음
Series2[1:3]
2023-01-02 1010
2023-01-03 1020
---
#숫자 하나만 기입할 시 값만 출력된다
Series2[2]
1020
---
#인덱스를 입력해 값을 추출할 수도 있음
Series2['2023-01-03']
1020
---
#데이터의 특정 값을 수정할 수도 있음
Series2[2]= 1080
Series2
데이터프레임
데이터프레임은 행과 열이 있는 테이블 형태의 데이터 구조
데이터프레임은 Pandas 라이브러리에서 제공. 다양한 소스로부터 수집한 데이터를 다루기 위해 사용.
데이터프레임은 스프레드시트와 유사한 형태를 가지며, 데이터를 쉽게 조작하고 분석 가능
#딕셔너리 key - value(리스트)로 테이블 형태로 추출
prices = {
'SK텔레콤': [44000, 44500, 4500],
'삼성전자': [70100, 70200, 70300],
'LG전자': [85000,85500, 86000]
}
df1 = pd.DataFrame(prices)
df1
**SK텔레콤 삼성전자 LG전자**
0 44000 70100 85000
1 44500 70200 85500
2 4500 70300 86000
#딕셔너리 key - value(리스트)로 테이블 형태로 추출
prices = {
'SK텔레콤': [44000, 44500, 4500],
'삼성전자': [70100, 70200, 70300],
'LG전자': [85000,85500, 86000]
}
df1 = pd.DataFrame(prices)
df1
**SK텔레콤 삼성전자 LG전자**
0 44000 70100 85000
1 44500 70200 85500
2 4500 70300 86000
#날짜 데이터를 인덱스로 삽입하기
df2 = pd.DataFrame(prices, index = dates)
df2
---
SK텔레콤 삼성전자 LG전자
2023-01-01 44000 70100 85000
2023-01-02 44500 70200 85500
2023-01-03 4500 70300 86000
#row가 선택되는 데이터
df2.iloc[0]
#0번째 데이터 전부를 가져오고 싶다면?
#row는 전체 다 , column은 0번째
df2.iloc[:,0]
#SK의 44000원을 갖고 오고 싶다면?
df2.iloc[0,0]
#index, column데이터를 가져오는 loc
df2.loc['2023-01-02']
#index 전체 다, column은 SK텔레콤만 원할 때
df2.loc[:,'SK텔레콤']
#칼럼 확인하는 두 가지 방법
df2['SK텔레콤']
df2.SK텔레콤
#key - value를 새로 삽입
#column 갯수를 동일하게 삽입해야 함
df2['POSCO'] = [450000, 455000, 460000]
df2
실습
Q1. 2023년 1월 2일 ~ 2023 1월 3일 까지의 '삼성전자', 'LG전자' 데이터를 가져와주세요.
df2.iloc[1:3, 1:3]
df2.loc['2023-01-02':'2023-01-04','삼성전자']
df2.loc['2023-01-02':'2023-01-04','LG전자']
df2.loc['2023-01-02':, '삼성전자':'LG전자']
Q2. 데이터 70200원 가져오기 (iloc, loc 각각 활용)
df2.loc['2023-01-02','삼성전자']
df2.iloc[1,1]
concat : 그냥 가져다 붙이는 거
merge : 공통된 칼럼이나 인덱스가 있는 경우 붙이는 거
#시리즈로 테이블에 추가
s1 = pd.Series([500000, 500500, 501000], index = dates, name= 'LG화학')
#concat으로 열추가
concat_df2 = pd.concat([df2,s1] , axis = 1)
concat_df2
#for문을 거치지 않고도 시리즈 형태로 column추가
concat_df2['LG화학_add_500'] = concat_df2['LG화학'] + 500
concat_df2
concat_df2.loc['2023-01-06',:] = [
44000, 70100, 85000, 455000, 505000, 505500]
concat_df2
concat_df2.loc['2023-01-05',:] = concat_df2.loc['2023-01-06',:] - 100
concat_df2
데이터 정렬
concat_df2.sort_index()
#기준을 삼고 정렬 / 내림차순
concat_df2.sort_values(by = '삼성전자', ascending = False)
#기준을 삼고 정렬 / 오름차순
concat_df2.sort_values(by = '삼성전자')
데이터 삭제
#특정 row 데이터를 삭제
concat_df2.drop('2023-01-03')
#inplace를 통한 삭제
concat_df2.drop('2023-01-03', inplace = True)
concat_df2
#하지만 두 번 쓸 때가 되면 오류가 뜸
#특정 column을 삭제하고 싶을 때
concat_df2.drop('LG화학', axis = 1)
#다수의 열을 삭제하고 싶을 때
concat_df2.drop(['LG화학','LG화학_add_500'], axis = 1)concat_df2
#모든 항목의 주가 총 합
concat_df2['sum'] = concat_df2.sum(axis = 1)
concat_df2
#종목 별 최저가를 구하는 법 / axis = 0이 디폴트
concat_df2.min(axis = 0)
#문자열은 제외, 숫자열로 된 것에 대해 통계적 정리를 해주는 함수
concat_df2.describe()
#**inplace = True : 변수 설정을 굳이 안해줘도 된다**
#인덱스 분류
concat_df2.sort_index(inplace = True)
#빈값만들기
import numpy as np
concat_df2.loc['2023-01-05', "LG전자":'LG화학']= np.NaN
concat_df2
#제거 / 대체 어떤 것을 써야할까? -> 상황 마다 다르기 때문에 데이터의 흐름에 따라 변경해야 함
#빈값만들기
import numpy as np
concat_df2.loc['2023-01-05', "LG전자":'LG화학']= np.NaN
concat_df2
#제거 / 대체 어떤 것을 써야할까? -> 상황 마다 다르기 때문에 데이터의 흐름에 따라 변경해야 함
#dropna: NaN 값을 다 날리기 - row
concat_df2.dropna()
#대체 - fillna: 앞 값으로 빈 값을 채워주는 방법
concat_df2.fillna(method='ffill')
#대체 - fillna: 뒷 값으로 빈 값을 채워주는 방법
concat_df2.fillna(method='bfill')
#대체 - interpolate: 중간 값으로 시계열을 삽입
concat_df2.interpolate()
#고의적 중첩 발생
concat_df3 = concat_df2.copy()
concat_df4 = pd.concat([concat_df2, concat_df3])
concat_df4
#drop_duplicates: 중복 제거
concat_df4.drop_duplicates()
concat_df2.loc['2023-01-03',:] = concat_df2.loc['2023-01-06',:].copy()
concat_df2.sort_index(inplace = True)
concat_df2
#응용 연습 - 삼성전자의 중복만 제거하여 데이터프레임 형태로 출력
idx = concat_df2['삼성전자'].drop_duplicates().index
concat_df2.loc[idx,:]
#dropna: NaN 값을 다 날리기 - column
concat_df2.dropna(axis = 1)