한국 금융자료와 외국 자료의 합병
시계열 자료는 날짜등의 시간에 따라 생산되는 자료입니다. 대표적으로 일일 주가자료는 거래일 기준으로 자료가 생산됩니다. 별도의 자료를 합치는 경우 시간이 이질적이라면 합쳐진 자료에 결측치가 포함됩니다. 이 경우 결측치를 조절하는 방법을 알아봅니다.
한국의 코스피와 환율, 외국의 지수 자료를 합쳐봅니다.
import numpy as np import pandas as pd import FinanceDataReader as fdr
지수명 | 코스피 | 환율 | 다우 | 나스탁 | 필라델피아반도체 | 변동성(미국) |
---|---|---|---|---|---|---|
코드명 | KS11 | USD/KRW | DJI | IXIC | SOXX | VIX |
코스피 지수의 모든 변수(Open, High, Low, Close, Volume, Change)와 다른 지수들의 종가(Close)를 호출하였습니다. 이 호출은 FinanceDataReader 패키지의 DataReader()
함수를 적용하였습니다.
st=pd.Timestamp(2010,3, 1) et=pd.Timestamp(2022, 6, 4) nme={'exchg':'USD/KRW','dj':"DJI",'nasd':'IXIC','soxx':"SOXX", 'vix':'VIX'} kos=fdr.DataReader('KS11', st, et) stock={} for i, j in zip(nme.keys(), nme.values()): stock[i]=fdr.DataReader(j, st, et)['Close'] stock=pd.DataFrame(stock.values(), index=stock.keys()).T kos.tail(3)
Close | Open | High | Low | Volume | Change | |
---|---|---|---|---|---|---|
Date | ||||||
2022-05-31 | 2685.90 | 2666.88 | 2685.90 | 2654.32 | 671680000.0 | 0.0061 |
2022-06-02 | 2658.99 | 2670.74 | 2674.00 | 2653.59 | 525260000.0 | -0.0100 |
2022-06-03 | 2670.65 | 2679.57 | 2681.51 | 2663.00 | 562470000.0 | 0.0044 |
stock.tail(3)
exchg | dj | nasd | soxx | vix | |
---|---|---|---|---|---|
Date | |||||
2022-06-01 | 1246.89 | 32813.10 | 11994.46 | 419.38 | 25.69 |
2022-06-02 | 1240.32 | 33248.02 | 12316.90 | 433.99 | 24.72 |
2022-06-03 | 1250.58 | 32898.91 | 12012.73 | 421.01 | 24.79 |
DataReader()에 의해 호출된 자료는 결측치가 0으로 작성됩니다. numpy.where()
함수에 의해 감지할 수 있습니다.
np.where(kos==0), np.where(stock==0)
((array([ 110, 574, 597, 665, 695, 767, 813, 955, 1028, 1184, 1242, 1397, 2129, 2205, 2249, 2274, 2500]), array([5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5])), (array([], dtype=int64), array([], dtype=int64)))
결측치는 DataFrame.mask()와 DataFrame.ffill()함수를 사용하여 처리할 수 있습니다.
kos1=kos.mask(kos==0, np.nan).ffill() stock1=stock.mask(stock==0, np.nan).ffill()
np.where(kos1==0), np.where(stock1==0)
((array([], dtype=int64), array([], dtype=int64)), (array([], dtype=int64), array([], dtype=int64)))
kos1.shape, stock1.shape
((3027, 6), (3201, 5))
pandas.concat()함수를 사용하여 위의 두 객체를 결합합니다. 이 함수 중 매개변수 join은 결합방식을 지정하는 것으로 'outer' 두 객체의 모든 부분을 통합하고 'inner'은 공통부분만을 결합합니다.
Stock=pd.concat([kos1, stock1], join='outer', axis=1).ffill().dropna() Stock.head(3)
Close | Open | High | Low | Volume | Change | exchg | dj | nasd | soxx | vix | |
---|---|---|---|---|---|---|---|---|---|---|---|
Date | |||||||||||
2010-03-02 | 1615.12 | 1612.43 | 1620.15 | 1608.97 | 415100000.0 | 0.0129 | 1145.00 | 10405.98 | 2280.79 | 47.51 | 19.06 |
2010-03-03 | 1622.44 | 1615.25 | 1622.63 | 1611.35 | 403470000.0 | 0.0045 | 1142.25 | 10396.76 | 2280.68 | 47.28 | 18.83 |
2010-03-04 | 1618.20 | 1625.35 | 1631.10 | 1612.47 | 383040000.0 | -0.0026 | 1144.00 | 10444.14 | 2292.31 | 47.24 | 18.72 |
np.where(Stock==0), np.where(Stock==np.nan)
((array([], dtype=int64), array([], dtype=int64)), (array([], dtype=int64), array([], dtype=int64)))
댓글
댓글 쓰기