[pandas] 데이터 전처리 & 데이터 핸들링

Pygmalion Dali·2023년 9월 11일
0

pandas

목록 보기
1/3

데이터 라이브러리

외우면 분명히 도움이 될 내용

  • 데이터 분석 라이브러리
    • numpy: 파이썬에서 수학적 연산을 효과적으로 수행할 수 있도록 하는 라이브러리. 다차원 배열 및 행렬 연산에 유용하게 사용됩니다.
    • pandas: 데이터를 조작하고 분석하기 위한 라이브러리. 테이블 형태의 데이터를 쉽게 다룰 수 있습니다.
      • 2차원, 로우 / 칼럼 데이터를 분석할 때 활용됨
      • 많아야 2차원 데이터를 다룸
  • 시각화 라이브러리
    • matplotlib: 파이썬에서 그래프 및 차트를 그리기 위한 라이브러리. 기본적인 그래프부터 복잡한 데이터 시각화까지 다양한 형태의 그래프를 그릴 수 있습니다.
      • 가장 먼저 생긴 시각화 라이브러리
      • 수업 중에 배울 내용
    • seaborn: matplotlib을 기반으로 하는 통계용 그래프 라이브러리. matplotlib보다 좀 더 간편하고 좀 더 다양한 그래프를 그릴 수 있습니다.
      • matplotlib를 개선
    • plotly: 인터랙티브한 그래프를 그리기 위한 라이브러리. 웹사이트나 대쉬보드에서 사용하기 적합합니다.
      • seaborn을 개선
  • 딥러닝 라이브러리
    • tensorflow: 구글에서 만든 오픈소스 머신러닝 라이브러리. 딥러닝 모델을 구현하고 학습시키는 데 사용됩니다.
    • pytorch: 페이스북에서 만든 오픈소스 머신러닝 라이브러리. 딥러닝 모델을 구현하고 학습시키는 데 사용됩니다.
  • 머신러닝 라이브러리
    • scikit-learn (sklearn): 머신러닝을 위한 라이브러리로, 분류, 회귀, 클러스터링 등 다양한 머신러닝 알고리즘을 제공합니다.

요약

데이터 분석

  • pandas : 데이터 핸들링
  • matplotlib, seaborn, plotly : 데이터 시각화

머신러닝

  • pandas, numpy : 데이터 핸들링
  • matplotlib, seaborn, plotly : 데이터 시각화
  • scikit-learn : 모델링

딥러닝

  • numpy : 데이터 핸들링
  • matplotlib, seaborn, plotly : 데이터 시각화
  • tensorflow, pytorch: 데이터 모델링

배경지식

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. 시리즈

시리즈

시리즈는 1차원 데이터 배열, 모든 데이터 유형을 포함할 수 있다.

시리즈는 데이터프레임의 열이나 행으로 구성되며, 데이터프레임에서 하나의 열을 추출하면 시리즈가 반환된다.

  • 시리즈는 인덱스 - 값의 구성
  • 인덱스는 각 항목의 고유한 이름, 값은 해당 항목의 데이터.
  • 1차원 데이터 배열
  • 데이터프레임 안에서 하나의 열과 행으로 구성

시리즈 생성

import pandas as pd
prices = [1000, 1010, 1020]
Series1= pd.Series(prices)
Series1

---

0    1000
1    1010
2    1020
dtype: int64
  • 시리즈: index - value 관계의 테이블
#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

2. DataFrame

데이터프레임

데이터프레임은 행과 열이 있는 테이블 형태의 데이터 구조

데이터프레임은 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

3. 데이터 선택

  • loc(label location): index, column으로 데이터를 가져온다
  • iloc(integer location): 데이터 순서로 데이터를 가져온다
#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]

4. 데이터프레임 확장

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

5. 데이터 정렬 & 데이터 삭제

데이터 정렬

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

6. 데이터프레임 다루기

#모든 항목의 주가 총 합
concat_df2['sum'] = concat_df2.sum(axis = 1)
concat_df2

#종목 별 최저가를 구하는 법 / axis = 0이 디폴트
concat_df2.min(axis = 0)

#문자열은 제외, 숫자열로 된 것에 대해 통계적 정리를 해주는 함수
concat_df2.describe()

7. 결측치 처리

  • 제거: dropna
  • 대체: fillna, interpolate
#**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()

8. 중복제거

#고의적 중첩 발생
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)

0개의 댓글