Pip install duckdb
Import duckdb
infor2020 = duckdb.query(‘select * from DF_name where 조건‘).df()
• 공공데이터 활용
• 변수별 데이터 타입 확인하기
DfName.dtypes
• 연속형변수
DfName.describe().round(2).transpose()
• 범주형변수
DfName.describe(include=‘object’).round(2).transpose()
def getdesc(x):
out={}
out['min']=x.min()
out['qr1']=x.quantile(0.25)
out['med']=x.median()
out['qr3']=x.quantile(0.75)
out['max']=x.max()
out['count']=x.count()
return pd.Series(out)
DfName.groupby([‘groupIndex_col'])[‘desc_col'].apply(getdesc).unstack()
1.seaborn 라이브러리 호출
Import seaborn as sns
2.sns 라이브러리에 속한 메소드로 그래프 그리기
sns.boxplot(x=‘group_col', y=‘desc_col', data=df_Name)
sns.violinplot(‘group_col’ ',’desc_col’,data= df_Name.loc[df_Name.desc_col<100])
sns.kdeplot(df_Name.col)
fig,ax=plt.subplots()
sns.boxplot(x=‘Group_col', y=‘Col', data=DF_Name)
plt.title(‘~~Title Name~~')
fig,ax=plt.subplots()
sns.kdeplot(data=DF_Name, x=col, hue=‘Group_col)
plt.title(‘~~Title Name~~')
fig,ax=plt.subplots(1,2)
sns.kdeplot(data=DF_Name, x=col ,ax=ax4[0])
sns.kdeplot(data=DF_Name, x=col, hue=‘Group_col ,ax=ax4[1])
• 사이킷런 라이브러리 호출
from sklearn.linear_model import LinearRegression
• 독립변수, 반응변수: numpy 배열로 생성
y=np.array(df_Name.Response_col)
x=np.array(df_Name.Indep_col).reshape((-1, 1))
• 모형 적합
model = LinearRegression().fit(x,y)
• 결정계수 산출
r_sq = simple_model.score(x, y)
데이터 분석 프로세스
• Time-based ordering: 시간의 흐름에 따라 수집된 데이터
• 자기상관성: 이전 데이터가 현재의 값에 영향을 미침
• 비정상성: 평균과 분산이 시간이 지남에 따라 변화
• 가격을 수익률로 변환함으로써, 정상성을 띄게할 수 있다.
• 단순 수익률
• 로그 수익률
• API를이용하여네이버금융페이지에있는데이터를가져올수있다.
!pip install xmltodict
import requests
import xmltodict
import json
from pandas import json_normalize
• KODEX200: KOSPI200 지수의 변동에 따라 수익률이 결정되는 펀드, 주식처럼 거래가 가능하고, 적은 투자금으로 분산투자 가능
#종목 코드
stockCode = ["069500"]
df_stock = pd.DataFrame()
• KOSPI200지수 : 유가증권시장에 상장된 전체 종목 중에서 시장대표성,업종대표성, 유동성 등을 감안하여 선정된 200개 종목을 시가총액 가중방식으로 산출한 지수
for code in stockCode:
count = '181’
url = f'https://fchart.stock.naver.com/sise.nhn?symbol={code}&timeframe=day&count={count}&requestType=0’
print(url)
rs = requests.get(url)
dt = xmltodict.parse(rs.text)
js = json.dumps(dt,indent = 4)
js = json.loads(js)
data = pd.json_normalize(js['protocol']['chartdata']['item’])
df = data['@data'].str.split('|',expand = True)
df.columns = ['date','OpeningPrice','High','Low','ClosingPrice','Volumn’]
df["code"] = code
df_stock = df_stock.append(df)
df_stock["date"] = pd.to_datetime(df["date"])
Df_Name.col1=pd.to_numeric(Df_Name.col1)
df_Name["simple_rtn"]=df_Name.Price.pct_change()
df_Name["log_rtn"]=np.log(df_ Name. Price /df_ Name.Price.shift(1))
fig, ax = plt.subplots(3, 1,figsize=(12,7))
fig.suptitle(‘~~plot name~~')
sns.lineplot(df_Name.date,df_Name.Price, color='purple', ax=ax[0])
sns.lineplot(df_Name.date,df_Name.simple_rtn, color='blue', ax=ax[1])
sns.lineplot(df_Name.date,df_Name.log_rtn, color='green', ax=ax[2])
• 롤링평균(21일을기준으로앞으로밀어가며구하는평균)과표준편차를계산
• 특이값을탐지하는함수를정의
• 특이값을탐지하는함수를적용하고,해당값을저장
• Lineplot으로시각화
!pip install prophet
import prophet
df_Name_pro=df_Nane.rename(columns={'date':'ds','log_rtn':'y'})
train_indices= df_Name_pro.ds.apply(lambda x:x.year)<2023
df_train= df_Name_pro.loc[train_indices].dropna()
df_test= df_Name_pro.loc[~train_indices].reset_index(drop=True)
model_prophet=prophet.Prophet(seasonality_mode='additive')
model_prophet.fit(df_train)
df_future=model_prophet.make_future_dataframe(periods=60)
df_pred=model_prophet.predict(df_future)
model_prophet.plot(df_pred)
df_pred=df_pred.loc[:,selected_columns].reset_index(drop=True)
df_test=df_test.merge(df_pred,on=['ds'],how='left')
df_test.ds=pd.to_datetime(df_test.ds)
df_test.set_index('ds',inplace=True)
fig,ax=plt.subplots(figsize=(12,5))
ax=sns.lineplot(data=df_test[['y','yhat_lower','yhat_upper','yhat']])
ax.fill_between(df_test.index, df_test.yhat_lower, df_test.yhat_upper, alpha=0.3)
ax.set(title='ETF - Actual rtn vs Predicted', xlabel='Date', ylabel='Price')