In [ ]:
# SNIPPET & Example
import pandas as pd
import numpy as np
pd.options.plotting.backend = "plotly"
# 시작하는 타임스탬프, 데이터 포인트 개수, 빈도를 기준
# 타임인덱스 만들기 (D: 매일)
daily_index = pd.date_range("2020-02-28", periods=4, freq="D")
daily_index
In [ ]:
# SNIPPET & Example
# 시작/끝 타임스탬프를 기준으로 타임인덱스 만들기
# '매주 일요일' - W-SUN
weekly_index = pd.date_range("2020-01-01", "2020-01-31", freq="W-SUN")
weekly_index
In [ ]:
# SNIPPET & Example
# 주 단위 인덱스로 동작하는 데이터프레임만들기
pd.DataFrame(data=[21, 15, 33, 34],
columns=["Visitors"], index=weekly_index)
In [ ]:
msft = pd.read_csv("../csv/MSFT.csv")
msft.info()
In [ ]:
# SNIPPET: 첫번째 방법
# timestamp를 object로 인식하고 있으므로
msft.loc[:, "Date"] = pd.to_datetime(msft["Date"])
msft.dtypes
In [ ]:
# SNIPPET: 두번째 방법
# read_csv에 parse_dates 인자 전달하기
msft = pd.read_csv("../csv/MSFT.csv",
index_col="Date", parse_dates=["Date"])
msft.info()
In [ ]:
# 분석을 시작하기 전에 인덱스를 정렬부터
msft = msft.sort_index()
In [ ]:
# 년-월-일-시-분-초에서 날짜까지만 쓰고 싶다.
msft.index.date
6.1.2 DatetimeIndex 필터¶
인덱스를 이용하여 필터를 할 수 있다. 여기서 필터는 문자열로 전달해야 함
In [ ]:
msft.loc["2019", "Adj Close"]
In [ ]:
msft.loc["2019-06":"2020-05", "Adj Close"].plot()
6.1.3 시간대¶
나스닥은 뉴욕에 있으며 거래는 오후 4시에 마감된다.
DateOffset
을 통해 마감 시간을 추가
tz_localize
를 통해 정확한 시간대를 타임스탬프에 추가
tz_conver
를 통해 타임스탬프를 UTC 시간대로 변환
In [ ]:
# 날짜에 시간 정보를 추가
msft_close = msft.loc[:, ["Adj Close"]].copy()
msft_close.index = msft_close.index + pd.DateOffset(hours=16)
msft_close.head(2)
In [ ]:
# 타임스탬프가 시간대를 인식하게 만들자
msft_close = msft_close.tz_localize("America/New_York")
msft_close.head(2)
In [ ]:
msft_close = msft_close.tz_convert("UTC")
msft_close.loc["2020-01-02", "Adj Close"]
In [ ]:
msft_close.loc["2020-05-01", "Adj Close"]
In [ ]:
returns = np.log(msft_close / msft_close.shift(1))
returns = returns.rename(columns={'Adj Close': 'Returns'})
returns.head()
In [ ]:
returns.plot.hist()
In [ ]:
# 단순 수익률 - 이전 값에서 현재 값의 percent 차이 보기
simple_rets = msft_close.pct_change()
simple_rets = simple_rets.rename(columns={"Adj Close": "Simple rets"})
simple_rets.head()
6.2.2 리베이스와 상관관계¶
하나 이상의 시계열을 대상으로 작업해 보자.
In [ ]:
parts = []
for ticker in ["AAPL", "AMZN", "GOOGL", "MSFT"]:
adj_close = pd.read_csv(f"../csv/{ticker}.csv",
index_col="Date", parse_dates=["Date"],
usecols=["Date", "Adj Close"])
adj_close = adj_close.rename(columns={"Adj Close": ticker})
parts.append(adj_close)
# 불러온 네 개의 데이터프레임을 하나로 조합
adj_close = pd.concat(parts, axis=1)
adj_close
In [ ]:
# NaN 즉, NA drop
adj_close = adj_close.dropna()
adj_close.info()
In [ ]:
# 모든 값을 시작값으로 나눈 다음 새 기준점을 곱하자
# 벡터화와 브로드캐스팅으로 아주 쉽게 된다.
adj_close_sample = adj_close.loc["2019-06":"2020-05", :]
rebased_prices = adj_close_sample / adj_close_sample.iloc[0, :] * 100
rebased_prices.head(2)
In [ ]:
rebased_prices.plot()
In [ ]:
# 주식의 value가 얼마나 독립적인지 보자 - corr 메서드
# 일별 로그 수익률의 상관관계
returns = np.log(adj_close / adj_close.shift(1))
returns.corr()
In [ ]:
# 직접 제어하려면 plotly.express를 불러 와야 한다.
import plotly.express as px
fig = px.imshow(returns.corr(),
x=adj_close.columns,
y=adj_close.columns,
color_continuous_scale=list(
reversed(px.colors.sequential.RdBu)),
zmin=-1, zmax=1)
fig.show()
6.2.3 리샘플링¶
일별 시계열을 월별 시계열로 변환할 때 resample
메서드에 빈도 문자열을 인자로 전달
Refer 판다스 문서에서 빈도 문자열 전체 보기 https://oreil.ly/zStpt
ohlc
- Open, High, Low, Close를 반환
월말 시계열을 주별 시계열로 변환한다면, 업샘플링을 적용해서 대부분의 값을 NaN으로 만들고 (asfreq
)
알고 있는 마지막 값을 사용해 앞으로 채울 수 있다 (ffill
).
In [ ]:
# 다운샘플링
end_of_month = adj_close.resample("M").last()
end_of_month
In [ ]:
# 업샘플링
end_of_month.resample("D").asfreq().head()
In [ ]:
end_of_month.resample("W-FRI").ffill().head()
6.2.4 롤링 윈도우¶
이동 평균을 구해서 추세를 보자 - rolling
메서드
In [ ]:
msft19 = msft.loc["2019", ["Adj Close"]].copy()
msft19.loc[:, "25day average"] = msft19["Adj Close"].rolling(25).mean()
msft19.plot()
'Prev Contents > Automation tools' 카테고리의 다른 글
[엑셀이 편해지는 파이썬] 8장. 판다스를 사용한 엑셀 파일 조작 (211~242p) (0) | 2022.08.20 |
---|---|
[엑셀이 편해지는 파이썬] 7장. 판다스를 사용한 엑셀 파일 조작 (197~210p) (0) | 2022.08.19 |
[엑셀이 편해지는 파이썬] 5장. 판다스와 데이터 분석 (123~173p) (0) | 2022.08.16 |
[엑셀이 편해지는 파이썬] 4장. 넘파이 기초 (113~122p) (0) | 2022.08.15 |
[엑셀이 편해지는 파이썬] 3장. 파이썬 시작하기 (71~110p) (0) | 2022.08.15 |