TIL/[겨울방학 부트캠프]TIL
TIL 6일차 (22.01.10)
맹찬
2022. 1. 10. 00:56
<안내>
필자도 배우는 입장이라 틀린점, 잘못된 점이 있을 수 있습니다.
그러니 지적, 피드백 환영합니다.
Mission: 가즈아!!¶
다음 데이터가 주어졌을 때 2016.6 ~ 2017.6 기간의 5-MA(Moving Average) 비트코인 가격 그래프를 그려주세요.
- 선의 색깔은 노란색(#f2a900) 으로 해야합니다.
- x-axis label과 y-axis label은 적절한 텍스트로 추가되어야 합니다.
- 이동평균의 기준은
Open
Column으로 계산합니다. - 이외에도 그래프를 알아보기 쉽게 하기 위한 정보(Text, Facet 등)을 추가하는 것도 좋습니다.
- 💡 이동평균(Moving Average)법은 시계열 데이터를 표현하는 데에 많이 사용하는 방법 중 하나입니다.
접근¶
- 일단 데이터를 열어서
- 시간을 x 축으로 , 가격을 y축으로 잡고
- 데이터 유형에 알맞는 plot을 골라서 표현하면 되겠네
In [1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
In [292]:
bitcoin = pd.read_csv('./BitCoin.csv')
bitcoin
Out[292]:
Unnamed: 0 | Date | Open | High | Low | Close | Volume | Market Cap | |
---|---|---|---|---|---|---|---|---|
0 | 0 | 2017-09-22 | 3628.02 | 3758.27 | 3553.53 | 3630.70 | 1.194830e+09 | 60152300000 |
1 | 1 | 2017-09-21 | 3901.47 | 3916.42 | 3613.63 | 3631.04 | 1.411480e+09 | 64677600000 |
2 | 2 | 2017-09-20 | 3916.36 | 4031.39 | 3857.73 | 3905.95 | 1.213830e+09 | 64918500000 |
3 | 3 | 2017-09-19 | 4073.79 | 4094.07 | 3868.87 | 3924.97 | 1.563980e+09 | 67520300000 |
4 | 4 | 2017-09-18 | 3591.09 | 4079.23 | 3591.09 | 4065.20 | 1.943210e+09 | 59514100000 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1604 | 1604 | 2013-02-05 | 116.38 | 125.60 | 92.28 | 105.21 | 6.722784e+06 | 1292190000 |
1605 | 1605 | 2013-01-05 | 139.00 | 139.89 | 107.72 | 116.99 | 8.026719e+06 | 1542820000 |
1606 | 1606 | 2013-04-30 | 144.00 | 146.93 | 134.05 | 139.00 | 8.312655e+06 | 1597780000 |
1607 | 1607 | 2013-04-29 | 134.44 | 147.49 | 134.00 | 144.54 | 7.757951e+06 | 1491160000 |
1608 | 1608 | 2013-04-28 | 135.30 | 135.98 | 132.10 | 134.21 | 7.806648e+06 | 1500520000 |
1609 rows × 8 columns
In [293]:
date_start = bitcoin.get(bitcoin['Date'] == '2016-05-30')
date_start # 2016 05월 30일의 인덱스, 날짜
Out[293]:
Unnamed: 0 | Date | Open | High | Low | Close | Volume | Market Cap | |
---|---|---|---|---|---|---|---|---|
480 | 480 | 2016-05-30 | 528.47 | 544.35 | 522.96 | 533.86 | 87958700.0 | 8243960000 |
In [294]:
date_end = bitcoin.get(bitcoin['Date'] == '2017-02-07')
date_end # 2017년 7월 2일의 인덱스, 날짜
Out[294]:
Unnamed: 0 | Date | Open | High | Low | Close | Volume | Market Cap | |
---|---|---|---|---|---|---|---|---|
82 | 82 | 2017-02-07 | 2436.4 | 2514.28 | 2394.84 | 2506.47 | 803747000.0 | 40010500000 |
In [295]:
bit_date = bitcoin.iloc[84:479,1:2]
bit_date #날짜순, 시작가정렬
Out[295]:
Date | |
---|---|
84 | 2017-06-30 |
85 | 2017-06-29 |
86 | 2017-06-28 |
87 | 2017-06-27 |
88 | 2017-06-26 |
... | ... |
474 | 2016-05-06 |
475 | 2016-04-06 |
476 | 2016-03-06 |
477 | 2016-02-06 |
478 | 2016-01-06 |
395 rows × 1 columns
In [296]:
bit_open_5ma = bitcoin['Open'].rolling(window= 5).mean()
bit_open_5ma = pd.DataFrame(bit_open_5ma)
bit_open_5ma=bit_open_5ma.iloc[84:479]
bit_open_5ma
Out[296]:
Open | |
---|---|
84 | 2505.560 |
85 | 2506.872 |
86 | 2517.766 |
87 | 2526.176 |
88 | 2545.770 |
... | ... |
474 | 578.546 |
475 | 576.048 |
476 | 568.150 |
477 | 558.362 |
478 | 549.664 |
395 rows × 1 columns
In [297]:
bit_final=pd.concat([bit_date,bit_open_5ma],axis=1)
bit_final=bit_final.sort_index(ascending = False)
bit_final
Out[297]:
Date | Open | |
---|---|---|
478 | 2016-01-06 | 549.664 |
477 | 2016-02-06 | 558.362 |
476 | 2016-03-06 | 568.150 |
475 | 2016-04-06 | 576.048 |
474 | 2016-05-06 | 578.546 |
... | ... | ... |
88 | 2017-06-26 | 2545.770 |
87 | 2017-06-27 | 2526.176 |
86 | 2017-06-28 | 2517.766 |
85 | 2017-06-29 | 2506.872 |
84 | 2017-06-30 | 2505.560 |
395 rows × 2 columns
In [298]:
x = bit_final['Date']
y = bit_final['Open']
plt.plot(x,y,label = 'BitCoin',color = '#f2a900')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.xticks([i for i in range(1,401,90)])
plt.show()
In [299]:
eth = pd.read_csv('./ETH_day.csv')
eth
Out[299]:
Date | Symbol | Open | High | Low | Close | Volume ETH | Volume USD | |
---|---|---|---|---|---|---|---|---|
0 | 2020-04-15 | ETHUSD | 158.61 | 158.61 | 158.61 | 158.61 | 0.00 | 0.00 |
1 | 2020-04-14 | ETHUSD | 156.97 | 162.15 | 155.74 | 158.61 | 18061.58 | 2872210.44 |
2 | 2020-04-13 | ETHUSD | 158.56 | 159.51 | 150.12 | 156.97 | 15698.32 | 2416728.28 |
3 | 2020-04-12 | ETHUSD | 158.66 | 165.37 | 155.21 | 158.56 | 12877.33 | 2082804.05 |
4 | 2020-04-11 | ETHUSD | 158.26 | 161.49 | 154.25 | 158.66 | 13761.72 | 2172914.57 |
... | ... | ... | ... | ... | ... | ... | ... | ... |
1433 | 2016-05-13 | ETHUSD | 10.20 | 11.59 | 10.20 | 10.69 | 1769.71 | 18923.55 |
1434 | 2016-05-12 | ETHUSD | 10.43 | 12.00 | 9.92 | 10.20 | 2072.56 | 22183.39 |
1435 | 2016-05-11 | ETHUSD | 9.68 | 10.47 | 9.68 | 10.43 | 3052.51 | 30978.11 |
1436 | 2016-05-10 | ETHUSD | 9.98 | 9.98 | 9.36 | 9.68 | 672.06 | 6578.20 |
1437 | 2016-05-09 | ETHUSD | 12.00 | 12.00 | 9.36 | 9.98 | 1317.90 | 12885.06 |
1438 rows × 8 columns
In [300]:
date_start = eth.get(eth['Date']=='2016-05-30')
date_start
Out[300]:
Date | Symbol | Open | High | Low | Close | Volume ETH | Volume USD | |
---|---|---|---|---|---|---|---|---|
1416 | 2016-05-30 | ETHUSD | 12.53 | 12.79 | 12.41 | 12.66 | 7805.15 | 98059.56 |
In [301]:
date_end = eth.get(eth['Date']=='2017-07-02')
date_end
Out[301]:
Date | Symbol | Open | High | Low | Close | Volume ETH | Volume USD | |
---|---|---|---|---|---|---|---|---|
1018 | 2017-07-02 | ETHUSD | 261.99 | 293.65 | 255.38 | 283.99 | 112725.96 | 30279694.18 |
In [302]:
eth_date = eth.iloc[1020:1415,0:1]
eth_date
Out[302]:
Date | |
---|---|
1020 | 2017-06-30 |
1021 | 2017-06-29 |
1022 | 2017-06-28 |
1023 | 2017-06-27 |
1024 | 2017-06-26 |
... | ... |
1410 | 2016-06-05 |
1411 | 2016-06-04 |
1412 | 2016-06-03 |
1413 | 2016-06-02 |
1414 | 2016-06-01 |
395 rows × 1 columns
In [303]:
eth_open_5ma = eth['Open'].rolling(window = 5).mean()
eth_open_5ma = pd.DataFrame(eth_open_5ma)
eth_open_5ma = eth_open_5ma.iloc[1020:1415]
eth_open_5ma
Out[303]:
Open | |
---|---|
1020 | 279.516 |
1021 | 287.634 |
1022 | 288.078 |
1023 | 286.280 |
1024 | 285.866 |
... | ... |
1410 | 14.188 |
1411 | 14.090 |
1412 | 13.970 |
1413 | 13.928 |
1414 | 13.982 |
395 rows × 1 columns
In [304]:
eth_final = pd.concat([eth_date,eth_open_5ma],axis = 1)
eth_final = eth_final.sort_index(ascending = False)
eth_final
Out[304]:
Date | Open | |
---|---|---|
1414 | 2016-06-01 | 13.982 |
1413 | 2016-06-02 | 13.928 |
1412 | 2016-06-03 | 13.970 |
1411 | 2016-06-04 | 14.090 |
1410 | 2016-06-05 | 14.188 |
... | ... | ... |
1024 | 2017-06-26 | 285.866 |
1023 | 2017-06-27 | 286.280 |
1022 | 2017-06-28 | 288.078 |
1021 | 2017-06-29 | 287.634 |
1020 | 2017-06-30 | 279.516 |
395 rows × 2 columns
In [305]:
x = bit_final['Date']
y1 = bit_final['Open']
y2 = eth_final['Open']
plt.plot(x,y1,label = 'BitCoin',color = '#f2a900')
plt.plot(x,y2,label = 'Etherium', color = '#3c3c3d')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.xticks([i for i in range(1,401,90)])
plt.show()
새로 알게 된 .rolling()함수¶
- `.rolling(window = n).mean()'
- rolling : 순차적으로 이동하면서
- window : n 개씩
- .mean() : 평균을 내어라
더 알고 싶은 것
- 비트코인 그래프에서 q1 q2 q3을 임의로 어떤 값에 할당할 수 있을까? 할당할 수 있다면, 최저가를 min값 최고가를 max값, 오픈가격을 q1 종료가격 q3으로 하고싶은데
- 지금 자료의 년 - 월 - 일 이 다음 달로 넘어갈 때, 년 - 일 - 월 로 바뀌는 것을 한번에 정리해 줄 수 있을까?
- 지금 내가 한 코드는 날짜 따로 자르고, Open값 따로 자르고, 자른 값에서 5-MA를 추출해서 붙이는 과정을 거쳤는데, 더 간편하게 할 수 있는 방법이 있을까?
- 그래프를 만들 때, 이더리움과 비트코인을 한 표에 두니까 이더리움의 움직임이 잘 안보이는데, 그래프 아래쪽으로 갈 수록 y틱이 커지도록해서 이더리움의 크기변화를 좀 더 잘 관찰할 수 없을까?