피벗테이블(Pivot table)
기준되는 항목을 축(행 또는 열)으로 지정하여 표로 작성하는 것을 피벗테이블(pivot table)이라하며 함수 pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', …)를 적용합니다.
패키지 FinanceDataReader의 함수에 의해 호출한 주가 자료는 열이름은 Open, High, Low, Close, Volume, Change를 포함합니다. 각각 시가, 고가, 저가, 종가, 거래량을 의미하며 Change는 전날 종가에 비해 현재 시가의 비율입니다. 호출한 자료에서 Change를 목록화한후 그 목록에 따른 다른 값들의 평균을 나타내 봅니다. 이 표를 위해서 Change가 행 또는 열에 지정되어야 하고 나머지 중 타겟이 되는 부분을 values로 지정하여야 합니다.
import numpy as np import pandas as pd import FinanceDataReader as fdr
st=pd.Timestamp(2023,8, 26) et=pd.Timestamp(2024, 8,8) nme=['Open', 'High','Low','Close', 'Change', 'Volume'] da=fdr.DataReader('KS11', st, et)[nme] da.head(2).round(3)
Open | High | Low | Close | Change | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2023-08-28 | 2534.42 | 2543.41 | 2525.64 | 2543.41 | 0.010 | 483587568 |
2023-08-29 | 2550.76 | 2556.98 | 2545.27 | 2552.16 | 0.003 | 441365852 |
위 자료에서 그룹화하기 위한 "Change"를 목록변수로 변환합니다. pd.qcut()함수를 적용합니다.
chg, border=pd.qcut(da["Change"],[0, 0.25, 0.5, 0.75, 1], labels=[1,2,3,4], retbins=True) chg.head(3)
Date 2023-08-28 4 2023-08-29 3 2023-08-30 3 Name: Change, dtype: category Categories (4, int64): [1 < 2 < 3 < 4]
print(border)#각 그룹의 경계값
[-0.0877 -0.0073 0.0004 0.0077 0.0566]
위 객체들로 부터 다음 객체를 생성
da1=da.drop(labels=["Change"], axis=1) da1=da1.pct_change() da1['chg']=chg[0] da1=da1.dropna() da1.head(3).round(3)
Open | High | Low | Close | Volume | chg | |
---|---|---|---|---|---|---|
Date | ||||||
2023-08-29 | 0.006 | 0.005 | 0.008 | 0.003 | -0.087 | 3 |
2023-08-30 | 0.010 | 0.008 | 0.006 | 0.004 | -0.175 | 3 |
2023-08-31 | -0.004 | -0.004 | -0.005 | -0.002 | 0.300 | 2 |
da1에서 chg를 기준 축으로 나머지 변수를 분류하고 각 그룹의 평균을 계산합니다.
allChg=pd.pivot_table(da1, columns="chg", aggfunc="mean") allChg.round(3)
chg | 1 | 2 | 3 | 4 |
---|---|---|---|---|
Close | -0.014 | -0.003 | 0.003 | 0.014 |
High | -0.008 | -0.002 | 0.001 | 0.010 |
Low | -0.010 | -0.002 | 0.003 | 0.010 |
Open | -0.004 | -0.001 | 0.000 | 0.005 |
Volume | 0.027 | 0.020 | -0.006 | 0.070 |
위와 유사하지만 대상 values를 특정합니다.
closeChg=pd.pivot_table(da1, columns="chg", values=["Close", "Volume"], aggfunc="mean") closeChg.round(3)
chg | 1 | 2 | 3 | 4 |
---|---|---|---|---|
Close | -0.014 | -0.003 | 0.003 | 0.014 |
Volume | 0.027 | 0.020 | -0.006 | 0.070 |
위 데이터 da1은 그룹화할 수 있는 변수가 1개입니다. 목록변수가 두개일 경우 각 변수에 따른 분류를 작성합니다. 즉 교차표를 작성합니다. 위 자료 중 Open을 목록화 합니다.
op, opBorder=pd.qcut(da1["Open"], 4, labels=range(1, 5), retbins=True) op.head(3)
Date 2023-08-29 4 2023-08-30 4 2023-08-31 2 Name: Open, dtype: category Categories (4, int64): [1 < 2 < 3 < 4]
print(opBorder.round(3))
[-0.04 -0.005 0. 0.006 0.032]
da2=da1 da2["Open"]=op da2.head(3).round(3)
Open | High | Low | Close | Volume | chg | |
---|---|---|---|---|---|---|
Date | ||||||
2023-08-29 | 4 | 0.005 | 0.008 | 0.003 | -0.087 | 3 |
2023-08-30 | 4 | 0.008 | 0.006 | 0.004 | -0.175 | 3 |
2023-08-31 | 2 | -0.004 | -0.005 | -0.002 | 0.300 | 2 |
자료 da2에서 Open과 chg의 그룹에 대응하는 Close, Volume의 평균값에 대한 표를 작성합니다.
pd.pivot_table(da2, index="Open", values=["Close", "Volume"], columns="chg" )
Close | Volume | |||||||
---|---|---|---|---|---|---|---|---|
chg | 1 | 2 | 3 | 4 | 1 | 2 | 3 | 4 |
Open | ||||||||
1 | -0.017533 | -0.003300 | 0.002405 | 0.016712 | 0.045754 | -0.005855 | -0.083844 | -0.131276 |
2 | -0.010962 | -0.002017 | 0.003407 | 0.014261 | 0.016789 | 0.004625 | 0.073962 | 0.043727 |
3 | -0.011745 | -0.002706 | 0.003402 | 0.012165 | 0.030558 | 0.114356 | -0.052739 | 0.103737 |
4 | -0.011536 | -0.002113 | 0.003700 | 0.015344 | -0.022143 | -0.012375 | 0.005476 | 0.096930 |
자료 da2에서 Open과 chg의 각 그룹에 대응하는 Close의 빈도수에 대한 표를 작성합니다.
pd.pivot_table(da2, index="Open", values="Close", columns="chg" , aggfunc="count", margins=True)
chg | 1 | 2 | 3 | 4 | All |
---|---|---|---|---|---|
Open | |||||
1 | 26 | 17 | 9 | 6 | 58 |
2 | 16 | 19 | 18 | 5 | 58 |
3 | 10 | 12 | 18 | 18 | 58 |
4 | 7 | 12 | 11 | 28 | 58 |
All | 59 | 60 | 56 | 57 | 232 |
댓글
댓글 쓰기