Intro

오늘 포스팅에서 다룰 주제는 Seaborn 라이브리러를 활용한 데이터 시각화 튜토리얼 (2)입니다.

해당 라이브러리에 대한 자료는 아리 링크에서 확인하실수 있습니다.

  • http://seaborn.pydata.org/index.html

참고자료

  • http://seaborn.pydata.org/tutorial.html (공식 홈페이지 튜토리얼)

  • https://datascienceschool.net/view-notebook/4c2d5ff1caab4b21a708cc662137bc65/


Plotting with categorical data

  • 데이터가 2차원이고 실수 값, categorical값이 섞여 있다면 기존의 플롯 이외에도 다음과 같은 분포 플롯들을 이용할 수 있다.


Boxplot

  • Boxplot은 사분위수 Quantile를 함께 표시해준다.
  • Quantile(사분위수)는 지나치게 범주에서 벗어나는 값들을 제외하고 핵심적인 범주의 데이터만 범위로 지정할 수 있는 방법중 하나

  • 사분위수에 대한 자세한 설명은 이곳으로


  • day는 categorical 범주형 data, total_bill은 numeric 실수형 data
  • 1Q - 3Q, 최대값 최소값 표시, 그 외 점들은 outlier 


Barplot

  • 가장 자주 쓰이는 형태중 하나

  • data 확인


  • x와 y축 뿐만 아니라 hue로 categorial 형의 hue에 따른 분포 확인 가능 


Plotting subsets of data with semantic mappings

  • x와 y가 numeric일 때 사용 

  • data 확인


  • line 형태로 time point 에 따른 signal 변화 확인 가능 


  • line 형태로 event별 time point 에 따른 signal 변화 확인 가능 


Visualizing the distribution of a dataset

  • univariate distribution 일변량(종속변수가 한 개인 데이터)의 분포 확인 가능

distplot

  • seaborn의 dist는 matplot의 hist를 (히스토그램)을 기반으로 하고있다.
  • x축은 변수 - 여기서는 랜덤으로 부여한 숫자 / y축은 커널 밀도 추정(Kernel Density Estimation)을 거친 정규화된 수치

  • Kernel Density Estimation이란 히스토그램을 구한 후 구해진 히스토그램을 정규화하여 확률밀도함수로 사용하는 것

  • KDE에 대한 자세한 자료는 해당 링크 참고: http://scikit-learn.org/stable/modules/density.html


  • kdf=False를 해주게 되면 y축에 해당 분포에 대한 절대치가 출력된다
  • rug = True로 해줄시 선분으로 해당 데이터의 위치가 표시된다


jointplot


  • 두 데이터가 모두 연속형의 실수값 numeric 이라면 두 변수간 관계를 jointplot을 통해 표시할 수 있다
  • 상단 부분과 오른쪽 부분에 해당 변수의 히스토그램도 함께 출력하게 된다 

Visualizing linear relationships

  • 선형 관계 확인 

lmplot

  • data 정보 확인 


  • 직선으로 x축과 y축에 선형 관계를 표시할 수 있다 


  • regplot과 lmplot은 단독으로 사용하였을때는 큰 차이가 없다

  • 하지만 lmplot을 주로 사용하는데 그 이유는 아래서 다시 설명하겠다



  • 이런식으로 깔끔하게 표시할 수 있다(outlier를 제외하고 표시해줌)


  • regplot과 달리 lmplot은 hue 파라미터로 categorial 변수를 지정하여 카테고리별로 각각 데이터의 분포와 선형 관계를 표시할 수 있다

  • 위 그래프는 smoker별로 total_bills에 따른 tip의 관계를 표시한 것 


Intro

오늘 포스팅에서 다룰 주제는 Seaborn 라이브리러를 활용한 데이터 시각화 튜토리얼입니다.

해당 라이브러리에 대한 자료는 아리 링크에서 확인하실수 있습니다.

  • http://seaborn.pydata.org/index.html

참고자료

  • http://seaborn.pydata.org/tutorial.html (공식 홈페이지 튜토리얼)

  • https://datascienceschool.net/view-notebook/4c2d5ff1caab4b21a708cc662137bc65/


Scatter plot 산포도

replot()는 아래와 같은 경우에 사용할 수 있습니다

  • 분석하고자 하는 데이터가 모두 numeric 실수 값인 경우데이터가 2차원이고 모두 연속적인 실수값


  • 라이브러리 import 및 데이터셋 확인


  • 기본적인 scatterplot 형태 - x축과 y축을 인자로 지정가능
  • total_bills에 따라 tip이 얼마나 분포되어 있는지 확인가능


  • 카테고리형 데이터가 섞여 있는 경우에는 hue 파라미터에 카테고리 변수 이름을 지정한다
  • 이를 통해 카테고리 값에 따라 색상을 다르게 할 수 있다
  • smoker 여부에 따라 total_bills에 따라 tip이 얼마나 분포되어 있는지 확인가능

  • style 파라미터를 통해 모양을 다르게 줄 수 있다


  • hue에는 numeric data 실수형 데이터도 줄 수 있다 
  • 이 때, 점의 색 혹은 크기로 hue 표시
  • size 크기에 따라 total_bills에 따라 tip이 얼마나 분포되어 있는지 확인가능


  • 점(scatter)의 크기로 hue를 설정할수 있다.


  • 분석하고자 하는 데이터가 categorical 이라면 아래와 같은 함수를 이용할 수 있다 

  • 라이브러리 import 및 데이터셋 확인

  • 기본적인 scatterplot 형태 - x축과 y축을 인자로 지정가능
  • 요일에 따라 total_bills가 어떻게 분포되어 있는지 확인 가능 


  • jitter 파라미터를 활용해 데이터 분포 출력 방법을 조절할 수 있음(위 그림과 비교)

  • scatterplot과 마찬가지로 hue로 categoril 변수를 줄 수 있으며 다른 색으로 구분 가능 


  • kind="swarm" 파라미터를 활용해 데이터 분포 출력 방법을 조절할 수 있음(위 그림과 비교)



  • smoker에 따라 tip을 얼마나 주는지 표시 - smoker은 yes/no 두 개 output으로만 구분되는 변수이다.


해당 대회는 캐글의 워싱턴 공공 자전거 데이터를 바탕으로 수요를 예측하는 모델을 만든 것입니다

대회 링크: https://www.kaggle.com/c/bike-sharing-demand


*코드 복붙이 필요하신 분들은 제 커널 페이지에 가시면 됩니다 


순서는 아래와 같습니다.


Step 1.

Data Explore


Step 2. 

Feature Engineering


Step 3. 

Modeling








''' 생략 '''


''' 생략 '''


해당 대회는 캐글의 Iowa 부동산 데이터를 바탕으로 집값을 예측하는 모델을 만든 것입니다

대회 링크: https://www.kaggle.com/c/house-prices-advanced-regression-techniques


*코드 복붙이 필요하신 분들은 제 커널 페이지에 가시면 됩니다


순서는 아래와 같습니다.


Step 1.

Data Explore


Step 2. 

Feature Engineering


Step 3. 

Modeling







해당 대회는 캐글의 Iowa 부동산 데이터를 바탕으로 집값을 예측하는 모델을 만든 것입니다

대회 링크: https://www.kaggle.com/c/house-prices-advanced-regression-techniques


*코드 복붙이 필요하신 분들은 제 커널 페이지에 가시면 됩니다


순서는 아래와 같습니다.


Step 1.

Data Explore


Step 2. 

Feature Engineering


Step 3. 

Modeling
















저번 포스팅에 이어서 전처리 작업을 해보겠다.

이번 포스팅해서 진행할 것은 첫번째로 20개를 그램으로 묶으며, 데이터를 정규화할 것이다.

우선 그램에 대해서 간단하게 설명하면 아래와 같다.


input data   /  target(예측)

   b    c          d

b    c    d          e

c    d    e          f


이런식으로 일부분은 중복되지만 완전히 중복되지 않는 인풋데이터를 확보하여 예측값을 구하는 것으로

이번의 경우에는 데이터가 충분하지 않기 때문에 사용하게 된 방법이다.

R실습에서 진행하였던 디시전 트리의 앙상블과 비슷한 개념이라고 할 수 있다.


그램에 대한 코드는 아래와 같다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import csv
import numpy as np
from sklearn.preprocessing import MinMaxScaler
import warnings
warnings.filterwarnings("ignore")
 
########20gram으로 분류############
= open("./타겟추가데이터2_새로운방식.csv"'r', newline='')
rdr = csv.reader(f)
 
list = []
for i in rdr:
    list.append(i)
list.pop(0#제목줄 지우기
print(len(list))
 
gram_20 = []
for i in range(len(list)+1-20):
    gram_20.append(list[i:i+20])  
gram_20 = np.array(gram_20)
#print(gram_20)
#print(gram_20.shape)
print(gram_20[0].shape)  ## 20개씩 묶어서 진행 - 4163 번 진행 20행 21열 (스샷참고) = 5일  
###########################

o.close()
f.close()
cs


20개씩 묶은 이유는 한 행에 5일치에 속하는 데이터들을 묶기 위함이며(하루에 4bars * 5 일 = 20bars)

해당 그램을 사용해야 뜨는 타임라인이 없이 6시간봉마다 예측을 진행할 수 있다. (우리는 마감시 기준 6, 12, 18, 24시간 뒤 가격을 예측할 것이다)



해당 코드부분만 실행해보면 20행 21열이며 4163번 진행하였음을 알 수 있다. 


이제 칼럼별로 정규화를 진행하겠다.

참고로 우리가 예측할 것은 순수한 가격이 아닌 ratio 즉 가격의 변화율을 예측할 것이며, 이를 close와 곱하여 가격을 유추해낼 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#######노말라이제이션############
= open("./20개씩묶고_컬럼별정규화.csv"'w', newline='')
wr = csv.writer(o)
title = ['time','low''high','open','close','volume','sma5','sma20','ema12','ema26','dn','mavg','up','pctB','rsi14','macd','signal']*20 #20일치
title.append("lastday_close")
title.append('after6ratio')
title.append('after12ratio')
title.append('after18ratio')
title.append('after24ratio')
wr.writerow(title)
 
scaler = MinMaxScaler(feature_range=(0,1)) #scaler 선언
for i in gram_20:
    close = np.array(i[-1][4], np.float64) # -1은 마지막 인덱스를 뜻함 여기서는 19 
    target = np.array(i[-1][-4:], np.float64) # 뒤에서부터 네 개 값 계산해서 타겟으로 넣음 
    ratio = target/close
    
    for j in range(1, i.shape[1]-4): #날짜다음부터 체크해서 타겟4개 제외. / 현재 종가부터 
        col = scaler.fit_transform(np.reshape(i[:,j], (-11)))
        col = np.transpose(col) # 이걸 다시 열로  바꿔서 그대로 붙임 
        i[:,j] = col # 붙임 
    
    #break
    data = i[:, :-4# 타임까지 포함해서 타겟 열 전까지 가지고와서 (ratio 다 떄고 그래서 20 행 17 열 )
    data = np.reshape(data, (-1)) #각 행을 짤라서 하나의 긴 행으로 바꿈 - 1차원 배열로 알아서 펴줌 즉 한게의 긴 행 상태로 바꿈    =  20 * 17 = 340 
    data = np.append(data,close)  # close 1열 추가 
    data = np.append(data,ratio) #  나중에 close 와 ratio 를 곱해가지고 실제 예측 가격 파악가능  - ratio 4개 추가  - 총 345 열 
    
    wr.writerow(data) 
cs


코드를 라이별로 간단하게 설명하면 close는 그램으로 묶은 20행중 마지막 행의 close를 담게 된다.

또한 target은 동일한 행의 마지막 4개 열(after 6 ratio ~ after 24 ratio)


그 후 각 데이터들에 대한 정규화를 진행하게 되며(타겟은 제외하고) 

한 개의 그램에 20행 21열로 구성이 되어 있는것을, 마지막 4개 열을 제외하고 하나의 행으로 길게 늘어뜨리게 된다.

해당 과정을 진행하면 20*17(20행*17열을 한개의 행에 길게 늘어뜨림) 340행이 나오게 되며, 해당 과정이 끝나면

close와 ratio(close -1열 + ratio - 4열 = 총 5열 추가) 한 행당 345개의 열을 가지게 된다.


두번째 포문에 대한 설명을 조금 더 하자면 

i = 

1 2 3 4 5 6 7 

2 3 4 5 6 7 8 

3 4 5 6 7 8 9 

일 때,


i [ : , : -4] 면  

1 2 3 

2 3 4 

3 4 5 


와 같이 선택하는 것이다.

즉 뒤에 4개를 빼고 묶는다고 생각하면 된다.


해당 csv 파일을 열어보면 한 행이 345개의 열로 구성되어 있는것을 확인할 수 있다.



이번 포스팅에선 저번 포스팅에서 수집한 비트코인 가격 데이터에 모델 학습을 위한 변수를 추가하기 위해

기술분석에 쓰이는 보조 지표들을 추가해볼 것이다.


본 포스팅에서 필요한 라이브러리들과 설치법은  다음과 같다 


  • Pandas:   cmd창에서 pip install pandas 커맨드 입력후 설치
  • Numpy:   pip install numpy
  • Ta-Lib:    하단에서 설명
  • sklearn:   pip install sklearn


Cmd창은 항상 관리자 권한으로 열어야 한다는 것을 잊지말자.

TA-Lib같은 경우 이상하게 설치가 되지 않으므로 따로 웹사이트를 방문하여 다운받아줘야 한다



여기서 파이썬 버전에 맞는 것을 설치해주면 된다.

잘 모르겠다면 아래와 같이 입력하여 확인해볼수 있다. 

나는 3.5.4이고 (실수로)32비트 아나콘다를 설치하였으므로 cp35~win32.whl를 받으면 된다.

혹시나 이 글 보고 아나콘다를 설치해야 한다면 64비트로 설치하면 된다.


해당 파일을 파이선 워킹디랙토리에 넣고 pip install 파일명을 해주면 잘 설치가 되며, 설치 완료후에는 아래와 같은 화면이 뜬다.



이제 준비를 끝냈으니 TA-Lib와 보조지표들에 대해서 간단히 설명해 보겠다.

비트코인 가격을 분석할때 많은 트레이더들은 다양한 보조 지표들을 사용하며, 

차트는 심리의 반영이기 때문에 이러한 보조 지표들이 (일정부분) 맞아 떨어지는 경우가 많다.


비트코인 3시간 봉 - RSI를 볼때 과매수 영역으로 진입하고 있음을 알 수 있으며 RSI와 MACD가 상승하고 있다는 것은 매수가 붙고 있다는 것을 뜻한다


(더 많은 차트분석은 제 트레이딩뷰 퍼블리시에서 보실 수 있습니다)

이러한 이유로 보조지표가 유의미한 변수가 될 수 있다고 생각하였으며, 선택한 보조지표 리스트는 아래와 같다.

  • SMA5

  • SMA20

  • SMA120

  • EMA12

  • EMA26

  • MACD

  • RSI

  • BBANDS

그 외 다른 보조지표들은 깃허브 참고


해당 지표들을 추가하기 위한 파이선 코드는 아래와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import csv
import numpy as np 
import talib
import pandas as pd
 
 
df = pd.read_csv("./duplication_eliminated_bitcoin_data.csv")
df.head(20)
 
close = np.array(df[['close']])
close
 
##################################지표추가#######################################
 
df['sma5'= talib.SMA(np.asarray(df['close']), 5)
 
df['sma20'= talib.SMA(np.asarray(df['close']), 20)
 
df['sma120'= talib.SMA(np.asarray(df['close']), 120)
 
df['ema12'= talib.SMA(np.asarray(df['close']), 12)
 
df['ema26'= talib.SMA(np.asarray(df['close']), 26)
 
upper, middle, lower = talib.BBANDS(np.asarray(df['close']), timeperiod=20, nbdevup=2, nbdevdn=2, matype=0)
df['dn'= lower
df['mavg'= middle
df['up'= upper
df['pctB'= (df.close - df.dn)/(df.up - df.dn)
 
rsi14 = talib.RSI(np.asarray(df['close']), 14)
df['rsi14'= rsi14
 
macd, macdsignal, macdhist = talib.MACD(np.asarray(df['close']), 12269)  
df['macd'= macd
df['signal'= macdsignal
 
 
df.to_csv('./중복제거최종데이터_전처리전.csv', sep=',',na_rep='NaN')
 
cs

한 파이선 코드는 아래와 같

모든 보조지표는 종가를 매개변수로 받고 있으므로 우리는 종가(close)를 활용하여 보조지표를 추가해 준다



추가를 한 후 csv를 열어보면 잘 들어온 것을 확인할 수 있다. 

NaN은 아직 지표를 계산하기에 충분하지 못한 일수(ex 12일 이동평균선인데 12일보다 적게 데이터가 모여있음)이기 때문에 발생한 것이므로 

추후 분석시엔 NaN이 없는 지점부터 사용하게 된다.


다음 포스팅에선 해당 데이터들을 최종적으로 정리하여 전처리를 마무리하게 된다.

오늘부터 진행해볼 실습은 딥러닝을 통한 비트코인 가격 예측이다.

이를 위해서는 아래와 같은 프로세스를 통해 진행해 보겠다. 



따라서 오늘 진행할 것은 API를 통하여 비트코인의 과거 가격 데이터를 수집해보도록 하겠다 


우리가 API를 통해 받아올 거래소는 미국의 "Coinbase" 거리소이다. 

해당 거래소를 선택한 이유는 아래와 같다.


Coinbase (Gdax)

  • USDT가 아닌 USD를 사용 
  • 미국 내 거래량 1위 


Bitfinex와 Binance같은 거래소를 선택하지 않은 이유는 테더로 거래를 진행하기 때문이다. 

테더가 사실 우리가 진행할 예측에 크게 영향을 주진 않지만 때마침 테더 관련 이슈가 터진 상황이기 때문에 

향후에도 예측모델을 사용하기 위해 혹시모를 사태에 대비해 USD를 이용하는 Coinbase(Gdax)를 선택하였다. 


코인베이스의 API 설명 사이트는 이곳이며 클릭시 이동하게 된다.

해당 페이지에서 과거 데이터 수집을 위한 방법을 찾아보자.



대략적인 파라미터는 start(시작시간) 과 end(종료시간), 그리고 granulariy(몇시 봉으로 할건지)를 넣어줄 수 있다.

여기서 보여준 예시는 아래와 같다 


즉 종목과 TImeslice를 정해주면 지정해준 시간부터 지정해준 시간까지에 대한 데이터를 수집할 수 있다는 것이다.


Gdax는 UnixTIme을 쓰는데, 이는 우리가 쓰고있는 2018-02-16 이런 시간대신, 뭔가 다른 계산 프로세스를 통해서 시간을 표시하는 것이다.

해당 프로세스의 장점은 현실에서 2월은 30일까지 있고 3월은 31일까지 있고 이런 귀찮은 프로세스를 처리하지 않아도 자연스럽게 타임라인을

표시할 수 있다는 것이지만, 직관성이 매우 떨어진다는 단점을 가진다. 


자세한 시간계산 프로세스는 모르겠고, 우선 우리가 쓰는 시간을 Unixtime으로 바꿔줄 수 있는 코드는 아래와 같다. 


1
2
3
4
5
6
from datetime import datetime
 
def unixtime(t): #우리가 쓰는 시간을 유닉스타임으로 바꿈 
    temp = t.split('-')
    return int(time.mktime(datetime(int(temp[0]), int(temp[1]), int(temp[2])).timetuple()))
 
cs

활용 예시는 아래에서 다시 확인하겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import gdax
from datetime import datetime
import csv
import time
 
#########데이터 수집################
public_client = gdax.PublicClient()
= open("./get_bitcoin_data.csv"'a', newline='')
wr = csv.writer(o)
 
granularity = 3600*6#3600*6 #6시간봉
interval = 3600*24*50
start_time = '2015-02-28'
last_time = '2018-01-17'
 
result = []
#for i in range(unixtime('2015-02-28'), unixtime('2018-01-17'), interval): #i는 15-02-28 ~ 18-01-17 이지만 (i, i+777600)(2015-02-28~2018-01-25까지) 뽑으니깐 오늘인 18-01-18까지 다 뽑아짐.
for i in range(unixtime(start_time), unixtime(last_time), interval): #i는 15-02-28 ~ 18-01-17 이지만 (i, i+777600)(2015-02-28~2018-01-25까지) 뽑으니깐 오늘인 18-01-18까지 다 뽑아짐.
    start = str(datetime.fromtimestamp(i)).split(' ')[0]
    if i + interval > unixtime(last_time): 
        end = str(datetime.fromtimestamp(unixtime(last_time) + 3600*24)).split(' ')[0# 이렇게 하면 새벽3시까지만 나오므로 18시간 뒤까지 뽑게 24시간의 초를 더해줌
    else:
        end = str(datetime.fromtimestamp(i+interval)).split(' ')[0]
    
    r = public_client.get_product_historic_rates('BTC-USD', start=start, end=end, granularity=granularity)
    for k in r:
        result.append([str(datetime.fromtimestamp(k[0])), k[1], k[2], k[3], k[4], k[5]])
 
    last_r_size = len(r) #마지막 넣을때 사이즈 - 예를들어 마지막에 12만 저장되면 
    print(last_r_size)
 
 
popped = result.pop(-1*last_r_size) #그냥 17일까지로 뽑으면 17일 새벽3시까지만 뽑힘. 그래서 하루 더 뽑은다음 제일 마지막 시간만 빼게 되면 17일 저녁 9시까지 뽑을수 있음 
print('del',popped)
for i in result:
    wr.writerow(i)
 
o.close()
##########################
cs

위 코드는 Gdax API를 활용하여 비트코인 과거 데이터를 뽑아온 것이다.

자세한 과정을 라인별로 설명하면 다음과 같다. 


우선 Gdax API를 사용하기 위하여 gdax를 import 해주고, 이를 csv 파일로 저장해주기 위한 코드 역시 삽입한다.


Granularity 는 3600 (한시간은 3600초) * 6을 하여 여섯시간 봉을 뽑아오게 된다.

Interval에 준 3600*24*50의 뜻은 한번에 뽑을때 50일치를 가지고 오는데 거기서 *4를 하니깐 200일치를 가지고 온다는 것이다.

즉 하루 4개(24시간 = 6시간 *4) * 50일치는 200개 봉.


그 아래 포문은 계속 뽑아오는 과정이고, 이 과정에서 한가지 짚고 넘어가야 할 것이 있다.

유닉스 타임을 사용해서인지 어떤건지 우리가 지정한 last_time이 전부 받아오는 것이 아닌, 해당 일의 새벽 3시까지 봉만 받아오는 문제점이 발생하였다.


따라서 last_time에서 하루를 더 받아온다음, 제일 마지막에 받아온 봉을 날리는 방법으로 우리가 원하는 last_time까지 데이터를 수집하기로 하였다.

해당 코드는 주석이 달린 부분에서 확인할 수 있다.


따라서 마지막까지 데이터를 다 받아온 후, 이에 대한 사이즈를 구해야 삭제하는 코드를 진행하였다. (result.pop~) 


해당 코드를 돌려보면 아래와 같이 뜬다. 



위에서 설명한 것처럼 200개씩 받아온 후, 마지막 행을 del을 프린트하며 삭제하도록 한다. 


받아온 csv파일을 열어보니 데이터 순서도 뒤죽박죽이고 무엇보다 중복된 데이터들이 있었다.

정확한 이유는 모르겠다. 아마 gdax api가 구려서 그런것 같은데.. 


여튼 이를 해결하기 위해 파이썬 딕셔너리를 사용하였다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
############ 중복제거##################   
= open("./get_bitcoin_data.csv"'r', newline='')
rdr = csv.reader(f)
dic = {}
for i in rdr: # 한줄씩 보겠다 
    key = str(i[0]) #0번인덱스 = 날짜 / 이걸 키로 설정함 
    value = str(i[1]) + ' ::: ' + str(i[2]) + ' ::: ' + str(i[3]) + ' ::: ' + str(i[4]) + ' ::: ' + str(i[5])
    #temp = str(i[0]) +' ::: ' + str(i[1]) + ' ::: ' + str(i[2]) + ' ::: ' + str(i[3]) + ' ::: ' + str(i[4]) + ' ::: ' + str(i[5])
    dic[key] = value
 
f.close()
 
= open("./duplication_eliminated_bitcoin_data.csv"'w', newline=''# 저장 
wr = csv.writer(o)
wr.writerow(['time','low','high','open','close','volume']) # 필터 자리 놔둠
 
for i in dic: # i 는 키 
    temp = dic[i].split(' ::: '# 딕셔너리는 랜덤하게 긁어옴 - 그래서 엑셀에서 정렬해줘야 
    temp.insert(0, i) #맨앞에 날짜 추가
    wr.writerow(temp)
    #wr.writerow(i.split(' ::: '))
 
 
o.close()
###########################
cs


파이선 자료형중 하나인 딕셔너리에 대해 간단하게 설명하면, 인덱스별로 짝을 맞게 삽입하여 인덱스를 입력하면 짝이 튀어나오도록 하는 것이다.

이 과정에서 중복되는 인덱스가 있으면(키) 둘 중 하나가 랜덤으로 삭제되게 된다.


csv파일을 보았는데 우리가 가진 데이터의 중복 튜플들은 소수점을 올림했냐 버림했냐 반올림했냐 등의 사소한 문제였기 때문에 뭐가 삭제되어도 

딱히 상관이 없으므로 그냥 딕셔너리에 삽입후 꺼내도록 한다. 


key는 0번 인덱스로 설정 - CSV파일을 TIme 칼럼을 뜻한다. 

그 뒤 해당 행의 가격 값들 (high, low, close, volum 등등등) 을 짝을 맞추어 딕셔너리에 삽입한다.(for i in rdr문) 

":::" 를 경계로 각 값을 붙였기 때문에 해당 값을 기준으로 다시 나눠주게 되고, 해당 행의 0번자리(제일 앞자리)에 i(날짜)를 추가하게 된다. (for i in dic문) 


이렇게 저장된 csv파일을 확인해보면 


이렇게 중복 데이터가 삭제된 것을 확인할 수 있다. 

물론 정렬은 안 된 상태여서 그냥 액셀에서 필터를 활용하여 오름차순 정렬을 하였다. 


이렇게 해서 API를 활용한 비트코인 가격 데이터 수집을 마치고, 

이제 모델 학습에 활용할 변수 획득을 위한 보조지표(기술분석을 위한 보조지표)를 추가하여 보겠다. 


+ Recent posts