indexing, scaling, statmodels

조예빈·2024년 7월 1일
0

금융 공학

목록 보기
2/5

colab을 이용하여 데이터 분석을 진행해 보았다.

실습 1

1. adv.csv를 읽어 adv라는 데이터 프레임 만들기

import pandas as pd
adv = pd.read_csv("adv.csv", index_col=0, encoding="cp949")

첫 번째 column의 index를 0번부터 시작하도록 하여 프레임의 첫 번째 열이 행 인덱스로 사용되도록 함

인코딩이 깨지는 경우를 방지하기 위해 cp949로 인코딩 타입을 설정

2. adv의 values라는 값을 adv_array라고 할당

adv_array = adv.values

행과 열이 있는 표 형식으로 답이 나옴

3. adv_array에서 3열만 선택한 후 10~30행, 2~3열 선택

adv_array[:, 2]
adv_array[9:30, 1:3]

:을 기준으로 값이 들어있지 않으면 '모든 열'을 의미함.
3열만 선택 -> 모든 행이 해당됨

우선, 3열만 선택하면 다음과 같음

adv_array[:, 2]

이후 2~3열을 선택하면 다음과 같음

adv_array[9:30, 1:3]

4. adv라는 데이터프레임에서 radio, news라는 column만 인덱싱
특정 column만 인덱싱

칼럼이 하나인 경우 단일 칼럼을 데이터 프레임으로 변환하기 위하여 괄호를 두 개를 작성해줌

adv[["radio"] ]

칼럼이 두 개인 경우

adv[["radio", "newspaper"] ]

5. adv에서 10~30행, 2~3열 선택

adv.iloc[9:30, 1:3]

6. pykrx를 설치하여 005930 종목의 지난달 주가를 가져와 10~15행, 3~5열 선택

!pip install pykrx
from pykrx import stock
df = stock.get_market_ohlcv_by_date("20240601", "20240630", "005930")
df.iloc[9:16, 2:5]

Data Scaling

  • 원래 있던 값을 변화시키는 것
  • 데이터의 값의 범위를 조정하는 것

MinMaxScaler

  • 데이터의 최소값을 0, 최대값을 1로 변환하여 모든 값을 0과 1 사이에 위치시킴
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler() #minmaxscaler라는 객체를 생성하는 메소드
#scaler.fit(df[["거래량"]])
#scaler.transfrom(df[["거래량"]])
scaler.fit_transform(df[["거래량"]]) #즉석에서 최대 최소를 찾아서 변환해줌
  1. 종가에 대하여 MinMaxScaling 진행
scaler.fit_transform(df[["종가"]])

transform 단계에서 학습된 최대값과 최소값을 사용하여 '종가' 열의 값을 0과 1 사이로 변환함

StandardScaler

  • 데이터의 평균을 0, 표준 편차를 1로 변환하는 방법을 사용하여 데이터를 표준화(정규화)함
  1. 종가에 대하여 StandardScaling 진행
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit_transfrom(df[["종가"]])

log

  • 특정 숫자가 주어진 base로 몇 번 곱해져야 해당 숫자가 되는지를 나타냄
  • 크게 펼쳐진 값을 작게 줄여주는 역할을 함
  1. 종가에 대하여 log 변환
import numpy as np
np.log(df[["종가"]])
  1. x가 0일 경우를 방지하여 로그 변환을 안전하게 수행
    1을 더해주면 됨(아래의 두 코드가 같은 기능 수행)
np.log(0+1)
np.log1p(df[["종가"]]) #값에다가 1을 더한 후 log를 취하는 메소드

실습 2

1. creditset2.csv를 credit로 읽기

credit = pd.read_csv('creditset2.csv')

2. train, test로 파티셔닝(7:3 으로)

from sklearn.model_selection import train_test_split
train, test = train_test_split(credit, test_size=0.3)

3. loan, income 컬럼을 Standard Scaling 적용

scaler = StandardScaler()
scaled = scaler.fit_transform(train[["loan","income"]])
scaler.fit_transform(test[["loan","income"]])
pd.DataFrame(scaled, columns=["loan", "income"])

데이터 프레임 형태로 할당 -> 보기 좋게 하기 위함

Statmodels

  • 다양한 통계 모델과 분석 도구를 제공하여 데이터 분석, 추정 및 테스트를 쉽게 수행할 수 있게 해줌
# unconv_MV_v5.csv를 df라는 이름으로 읽기
# X변수는 Por, Brittle, Perm TOC, y변수는 PRod
import pandas as pd
df = pd.read_csv('unconv_MV_v5.csv')

features = ['Por', 'Brittle', 'Perm', 'TOC']
target = 'Prod'

X = df[features] #.values.reshape(-1, len(features))
y = df[target].values

선형 회귀 분석(OLS) 수행

  • OLS : 가장 일반적인 선형 회귀 분석 방법
  • summary() : 회귀 분석 결과에 대한 자세한 요약 정보를 텍스트 형식으로 반환
import statsmodels.api as sm
model = sm.OLS(y,X) #OLS: Ordianry Least Square
result = model.fit()
pritn(result.summary())

데이터프레임 값 변경

replace

  • 바꿔놓고 데이터 프레임을 출력하면 할당되는 것은 아님
  • 원본이 바뀌는 것은 아님
  • 특정 값을 다른 값으로 replace(치환) 하는 데 사용됨
  • 데이터 정리와 전처리에 유용하게 사용됨
  1. 문자열을 0~4로 교체
import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.array([['OK', 'Perfect', 'Acceptable'], ['Awful','Awful', 'Perfect'], ['Acceptable', 'OK', 'Poor']]), columns=['Student1', 'Student2', 'Student3'])
df.replace(['Awful', 'Poor', 'OK', 'Acceptable', 'Perfect'], [0, 1, 2, 3, 4])요
  1. 정규표현식으로 문자열 제거
df = pd.DataFrame(data=np.array([['1\n', 2, '3\n'], [4, 5, '6\n'], [7, '8\n', 9]]))
df.replace({'\n': '<br>'}, regex=True)

데이터 프레임 탐색, Missing Value 확인, 비어있는 DF 생성

import numpy as np

# NaN 값으로 채워진 데이터프레임 생성
df = pd.DataFrame(np.nan, index=[0,1,2,3], columns=['A'])
print(df)

# 결측치 여부를 확인
df.isnull()
# 결측치 비율을 계산
df.isnull().mean()

#eda
import pandas as pd
import matplotlib.pyplot as plt

# 데이터프레임 생성
data = pd.DataFrame( [1,0,0,1,2,1,1,1,0,0,0,2,2,1,3,3,2,2,1,0], columns=['v1'])

# 각 칼럼의 데이터 타입 확인
data.dtypes

# 칼럼의 고유 값 확인
data['v1'].unique()

#Histogram 생성
data['v1'].hist(bins=5)

1. weatherAUS.csv를 weather로 읽기

weather = pd.read_csv("weatherAUS.csv")

2. MinTemp 컬럼의 결측치를 해당 컬럼의 평균으로 채우기. 데이터프레임.컬럼.mean()

weather.MinTemp.fillna(weather.MinTemp.mean(), inplace=True)

inplace=True를 넣어주면 원본에 반영됨
3. weather에 대하여 dropna()를 적용한 weather2를 만들기

weather2 = weather.dropna() #하나라도 결측이 있는 경우에만
weather.dropna(how="all").shape #모든 칼럼에 대해서만
weather.dropna(subset=["MinTemp", "MaxTemp"]) #특정 칼럼에 대해서만

데이터프레임 형태 변경

피벗

  • 데이터프레임의 행, 열, 값의 구조를 재구성하여 다양한 방식으로 데이터를 요약하는 방법
  • 피벗 테이블은 피벗을 통해 데이터를 집계함
  • 데이터를 재구성하고 요약하여 특정 기준에 따라 데이터를 집계할 수 있도록 함
  • 피벗을 사용하면 missing value가 무조건 생김 -> 처리를 따로 해 주어야 함(지우기 || 채우기)
#피벗
#values: 피벗테이블 정리를 원하는 값
#columns: 피벗의 열
#index: 피벗의 행
import pandas as pd
products = pd.DataFrame({'category': ['Cleaning', 'Cleaning', 'Entertainment', 'Entertainment', 'Tech', 'Tech'],'store': ['Walmart', 'Dia', 'Walmart', 'Fnac', 'Dia','Walmart'],'price':[11.42, 23.50, 19.99, 15.95, 55.75, 111.55],'testscore': [4, 3, 5, 7, 5, 8]})
pivot_products = products.pivot(index='category', columns='store', values='price')
print(pivot_products)

pivot_products2 = products.pivot_table(index='category', columns='store', values='price', aggfunc='mean')
print(pivot_products2)

데이터프레임 연산

  • 두 데이터프레임을 더할 때, 인덱스와 칼럼이 위치하는 값에서만 값이 더해짐
  • 인덱스나 칼럼이 위치하지 않는 위치는 NaN으로 채워짐
# df2 데이터프레임 생성
df2 = pd.DataFrame( np.array( [[1,2], [3,4], [5,6]] ))

# df1 데이터프레임 생성
df1 = pd.DataFrame( [[1,2], [3,4], [5,6]],
                   index=['a', 'b', 'c'],
                   columns= ['c1','c2']  )
# 인덱스를 날짜로 변경
df1.index = ['2022-04-28','2022-04-29', '2022-04-30']
df2.index = ['2022-04-26','2022-04-27', '2022-04-28']

# 칼럼명 변경
df1.columns = ['c1', 'c2']
df2.columns = ['c2', 'c3']

# 데이터프레임 덧셈 연산
print(df1+df2)
profile
컴퓨터가 이해하는 코드는 바보도 작성할 수 있다. 사람이 이해하도록 작성하는 프로그래머가 진정한 실력자다. -마틴 파울러

0개의 댓글

관련 채용 정보