import pandas as pd
from pyodide.http import open_url
from common import *
import numpy as np
from datetime import datetime
# 경고 문구 제거
import warnings
warnings.filterwarnings( 'ignore' )
import gc
# 판다스에서 csv 를 데이터 프레임으로 읽어옴
매출데이터 = pd.read_csv(open_url(
"http://dreamplan7.cafe24.com/pyscript/csv/avocado.csv"
))
# 3개 필드만 추려서 데이터 프레임을 다시 만듬
매출데이터 = 매출데이터[[
'Date',
'Total Volume',
'AveragePrice'
]]
# 영문 제목을 한글로 변경
매출데이터.columns = [
'날짜',
'매출량',
'평균가격'
]
주간매출_매출량=매출데이터.fillna(0) \
.groupby('날짜', as_index=False)[['매출량']].sum() \
.sort_values(by='날짜', ascending=True)
주간매출_평균가=매출데이터.fillna(0) \
.groupby('날짜', as_index=False)[['평균가격']].mean() \
.sort_values(by='날짜', ascending=True)
주간매출데이터=pd.merge(주간매출_매출량, 주간매출_평균가, on='날짜')
# 날짜(시간값) 추가
주간매출데이터.insert(1, '날짜(시간값)',
'',
True)
for i in 주간매출데이터['날짜'].index:
주간매출데이터['날짜(시간값)'].loc[i]=time.mktime(
datetime.strptime(
주간매출데이터['날짜'].loc[i],
'%Y-%m-%d'
).timetuple()
)
# 10000으로 나눈 매출량 필드 추가
주간매출데이터.insert(3, '매출량(만)',
주간매출데이터['매출량']/10000,
True)
# 훈련학습용으로 날짜를 연도, 월, 일로 나눈다
주간매출데이터.insert(4, '연도', '', True)
주간매출데이터.insert(5, '월', '', True)
주간매출데이터.insert(6, '일', '', True)
주간매출데이터.insert(7, '주', '', True)
for i in 주간매출데이터['날짜'].index:
임시=str(주간매출데이터['날짜'].loc[i]).split('-')
연도=int(임시[0])
월=int(임시[1])
일=int(임시[2])
주간매출데이터['연도'].loc[i]=연도
주간매출데이터['월'].loc[i]=월
주간매출데이터['일'].loc[i]=일
주간매출데이터['주'].loc[i]=str(
datetime(연도, 월, 일).isocalendar()[1]
)
createElementDiv(
document,
Element,
'output2'
).write(주간매출데이터)
주간매출데이터훈련_넘파이 = 주간매출데이터[['날짜(시간값)', '연도', '월', '일', '평균가격']].to_numpy()
주간매출데이터목표_넘파이 = 주간매출데이터['매출량(만)'].to_numpy()
주간매출데이터날짜_넘파이 = 주간매출데이터['날짜'].to_numpy()
from sklearn.model_selection import train_test_split
훈련용데이터, 테스트데이터, 훈련용목표, 테스트목표 = \
train_test_split(
주간매출데이터훈련_넘파이,
주간매출데이터목표_넘파이,
random_state=100,
shuffle=False)
from sklearn.preprocessing import PolynomialFeatures
폴리 = PolynomialFeatures(degree=4, include_bias=False) # 절편 속성은 제거
폴리.fit(훈련용데이터) # 특성을 다항으로 자동으로 불림
#print(폴리.get_feature_names_out())
훈련용데이터_가공 = 폴리.transform(훈련용데이터) # 학습에 추가된 파라미터에 맞게 다항 변환
테스트데이터_가공 = 폴리.transform(테스트데이터) # 테스트 세트도 다항 변환, fit했던 훈련 poly 를 사용.
#print(훈련용데이터[0]);
#print(훈련용데이터_가공[0]);
#=====================================
from sklearn.preprocessing import StandardScaler
스케일러 = StandardScaler()
스케일러.fit(훈련용데이터_가공)
훈련용데이터_가공 = 스케일러.transform(훈련용데이터_가공)
테스트데이터_가공 = 스케일러.transform(테스트데이터_가공)
#=====================================
# 릿지모델
from sklearn.linear_model import Ridge
릿지모델 = Ridge(alpha=10)
릿지모델.fit(훈련용데이터_가공, 훈련용목표)
# 종류가 목표가 아닌 이상 정확도는 측정 불가
print("릿지 훈련용모델 정확도")
print(릿지모델.score(훈련용데이터_가공, 훈련용목표))
print("릿지 테스트모델 정확도")
print(릿지모델.score(테스트데이터_가공, 테스트목표))
훈련용목표예측_릿지 = 릿지모델.predict(훈련용데이터_가공)
테스트목표예측_릿지 = 릿지모델.predict(테스트데이터_가공)
#=====================================
# 라쏘모델
from sklearn.linear_model import Lasso
라쏘모델 = Lasso(alpha=10)
라쏘모델.fit(훈련용데이터_가공, 훈련용목표)
# 종류가 목표가 아닌 이상 정확도는 측정 불가
print("라쏘 훈련용모델 정확도")
print(라쏘모델.score(훈련용데이터_가공, 훈련용목표))
print("라쏘 테스트모델 정확도")
print(라쏘모델.score(테스트데이터_가공, 테스트목표))
훈련용목표예측_라쏘 = 라쏘모델.predict(훈련용데이터_가공)
테스트목표예측_라쏘 = 라쏘모델.predict(테스트데이터_가공)
#=====================================
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import matplotlib as mat
# 기준 폰트 변경 : legend 의 한글을 적용하려면 필수
fm.fontManager.addfont('./NANUMMYEONGJO.TTF') # 폰트명 : NanumMyeongjo
mat.rc('font', family='NanumMyeongjo')
###################
# 폰트 목록 출력 ( 폰트 추가 후 정확한 이름을 확인하려면 필요
#font_list = [font.name for font in fm.fontManager.ttflist]
#for f in font_list:
# print(f)
###################
# 개별 폰트 적용
NanumMyengjo = fm.FontProperties(
fname='./NANUMMYEONGJO.TTF'
)
NanumMyengjoBold = fm.FontProperties(
fname='./NANUMMYEONGJOBOLD.TTF'
)
# 그래프
fig = plt.figure(
figsize=(15, 7)
)
plt.xticks(
주간매출데이터훈련_넘파이[:, 0],
주간매출데이터날짜_넘파이,
rotation=90, fontsize=8)
plt.title('주간 아보카도 매출량(릿지,라쏘)',
fontproperties=NanumMyengjoBold,
fontsize=32
);
line_alpha=0.5
# 원본
plt.plot(
훈련용데이터[:,0],
훈련용목표,
#marker='o',
color='gray',
label='원본',
alpha=line_alpha
)
plt.plot(
테스트데이터[:, 0],
테스트목표,
#marker='o',
color='gray',
alpha=line_alpha
)
# 릿지
plt.plot(
훈련용데이터[:,0],
훈련용목표예측_릿지,
marker='d',
color='blue',
label='훈련패턴(릿지)',
alpha=line_alpha
)
# 라쏘
plt.plot(
훈련용데이터[:,0],
훈련용목표예측_라쏘,
marker='d',
color='red',
label='훈련패턴(라쏘)',
alpha=line_alpha
)
# 릿지 예측
plt.plot(
테스트데이터[:, 0],
테스트목표예측_릿지,
marker='*',
color='green',
label='예측패턴(릿지)',
alpha=line_alpha
)
# 라쏘 예측
plt.plot(
테스트데이터[:, 0],
테스트목표예측_라쏘,
marker='*',
color='red',
label='예측패턴(라쏘)',
alpha=line_alpha
)
plt.xlabel('날짜', fontsize=16)
plt.ylabel('매출량(단위:만)', fontsize=12)
plt.legend(
shadow=True
)
ax = plt.gca()
# 축만 그리드
ax.xaxis.grid(True)
# 배경색, 마진 조정
ax.set_facecolor('#e8e7d2')
ax.margins(x=0.01, y=0.02)
# 주위 이상한 여백 없애기
fig.tight_layout()
fig