😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

HTMLμ—μ„œ Python을 μ‚¬μš©ν•  수 μžˆλŠ” PyScript (15) λ³Έλ¬Έ

πŸ‘©‍πŸ’» λ°±μ—”λ“œ(Back-End)/Node js

HTMLμ—μ„œ Python을 μ‚¬μš©ν•  수 μžˆλŠ” PyScript (15)

μ§•μ§•μ•ŒνŒŒμΉ΄ 2022. 11. 28. 15:04
728x90
λ°˜μ‘ν˜•

<λ³Έ λΈ”λ‘œκ·ΈλŠ” itadventrue λ‹˜μ˜ λΈ”λ‘œκ·Έλ₯Ό μ°Έκ³ ν•΄μ„œ κ³΅λΆ€ν•˜λ©° μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€ :-)>

https://itadventure.tistory.com/558

 

νŒŒλ„(16) - 파이슀크립트의 νŠΉμ’Œμ•™~점으둜 λ¨Έμ‹ λŸ¬λ‹!

🐳 'νŒŒλ„'λŠ” ν¬λ ˆμ΄κ°€ λ„μ „ν•˜κ³  μžˆλŠ” 파이슀크립트 λ„μ „κΈ°μ˜ μ€„μž„λ§μž…λ‹ˆλ‹€. μ§€λ‚œ κ²Œμ‹œκΈ€μ—μ„œ μ—°μž¬λ˜λŠ” κΈ€μž…λ‹ˆλ‹€. : https://itadventure.tistory.com/557 νŒŒλ„!(15) - λΌμ˜νšŒκ·€μ™€ 4μ°¨λ°©μ •μ‹κΉŒμ§€ 🍿 'νŒŒλ„'λŠ”

itadventure.tistory.com

 

 

πŸ„ μ•Œκ³ λ¦¬μ¦˜ μ’…λ₯˜λ₯Ό μ„ νƒν•˜λŠ” μ›Ή νŽ˜μ΄μ§€

  • index.html
<html> 
    <head> 
      <title>λ‹€ν•­νšŒκ·€ + 라쏘 λ¦¬κ·Έλ ˆμ…˜</title>
      <link rel="stylesheet" 
        href="https://pyscript.net/alpha/pyscript.css" /> 
      <script defer 
        src="https://pyscript.net/alpha/pyscript.js"></script> 

<py-env>
  - pandas
  - matplotlib
  - seaborn
  - scikit-learn
  - paths :
    - ./common.py
</py-env>
    </head>
    
  <body> 
    <link rel="stylesheet" href="pytable.css"/>

    μ•Œκ³ λ¦¬μ¦˜ 선택 :
    <select id="algorithm">
      <option value="">μ•Œκ³ λ¦¬μ¦˜μ„ μ„ νƒν•˜μ„Έμš”</option>
      <option value="ridge_value">릿지 νšŒκ·€ (Ridge Regression)</option>
      <option value="lasso_value">라쏘 νšŒκ·€ (Lasso Regression)</option>
    </select><br/>
    μ•ŒνŒŒκ°’ 선택 : 
    <select id="alpha_value">
       <option value="0.001">0.001</option>
       <option value="0.01">0.01</option>
       <option value="0.1">0.1</option>
       <option value="1">1</option>
       <option value="10">10</option>
       <option value="100">100</option>
    </select><br/>
    ν›ˆλ ¨μ μˆ˜ : <span id="train_score" style=''></span><br/>
    ν…ŒμŠ€νŠΈμ μˆ˜ : <span id="test_score" style=''></span><br/>
    
    <div id="graph"></div>

<py-script>
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' )

<!-- νŒλ‹€μŠ€μ—μ„œ csv λ₯Ό 데이터 ν”„λ ˆμž„μœΌλ‘œ μ½μ–΄μ˜΄ -->
SalesData = pd.read_csv(open_url(
"http://dreamplan7.cafe24.com/pyscript/csv/avocado.csv"
))      

<!-- # 3개 ν•„λ“œλ§Œ μΆ”λ €μ„œ 데이터 ν”„λ ˆμž„μ„ λ‹€μ‹œ λ§Œλ“¬ -->
SalesData = SalesData[[
  'Date', 
  'Total Volume',
  'AveragePrice'
]]   
SalesData.columns = [
  'Day', 
  'Amount',
  'AveragePrice'
]

print(SalesData)
<!-- λ‚ μ§œλ³„λ‘œ ( μ£Ό λ‹¨μœ„λ‘œ ) 그룹을 지을 λ•Œλ„ λ§€μΆœλŸ‰μ€ κ·Έλ£Ήλ‹¨μœ„λ‘œ ν•©μ‚°ν•˜μ—¬ 합계 -->
WeekdaysSales_sum = SalesData.fillna(0) \
.groupby('Day', as_index=False)[['Amount']].sum() \
.sort_values(by='Day', ascending=True)

WeekdaysSales_mean = SalesData.fillna(0) \
.groupby('Day', as_index=False)[['AveragePrice']].mean() \
.sort_values(by='Day', ascending=True)
<!-- 2개의 데이터 ν”„λ ˆμž„μ„ ν•˜λ‚˜λ‘œ merge  (on에 기재된 'λ‚ μ§œ'λ₯Ό κΈ°μ€€) -->
WeekdaysSalesData = pd.merge(WeekdaysSales_sum, WeekdaysSales_mean, on = 'Day')
<!-- λ‚ μ§œ(μ‹œκ°„κ°’) μΆ”κ°€ -->
WeekdaysSalesData.insert(1, 'Day(timeValue)',
    '',   True)
for i in WeekdaysSalesData['Day'].index:
  WeekdaysSalesData['Day(timeValue)'].loc[i]=time.mktime(
  datetime.strptime(
    WeekdaysSalesData['Day'].loc[i], 
    '%Y-%m-%d'
    ).timetuple()
  )
<!-- 10000으둜 λ‚˜λˆˆ λ§€μΆœλŸ‰ ν•„λ“œ μΆ”κ°€ -->
WeekdaysSalesData.insert(3, 'Amount(10000)', 
WeekdaysSalesData['Amount']/10000, 
  True)
<!-- ν›ˆλ ¨ν•™μŠ΅μš©μœΌλ‘œ λ‚ μ§œλ₯Ό 연도, μ›”, 일둜 λ‚˜λˆˆλ‹€ -->
WeekdaysSalesData.insert(4, 'year', '', True)
WeekdaysSalesData.insert(5, 'month', '', True)
WeekdaysSalesData.insert(6, 'day', '', True)
WeekdaysSalesData.insert(7, 'week', '', True)
for i in WeekdaysSalesData['Day'].index:
  temp = str(WeekdaysSalesData['Day'].loc[i]).split('-')
  year = int(temp[0])
  month = int(temp[1])
  day = int(temp[2])
  WeekdaysSalesData['year'].loc[i] = year
  WeekdaysSalesData['month'].loc[i] = month
  WeekdaysSalesData['day'].loc[i] = day
  WeekdaysSalesData['week'].loc[i] = str(
    datetime(year, month, day).isocalendar()[1]
  )
createElementDiv(
  document, 
  Element, 
  'output2'
).write(WeekdaysSalesData)
WeekdaysSalesDataTrain_numpy = WeekdaysSalesData[['Day(timeValue)', 'year', 'month', 'day', 'week', 'AveragePrice']].to_numpy()
WeekdaysSalesDataTest_numpy = WeekdaysSalesData['Amount(10000)'].to_numpy()
WeekdaysSalesDataDay_numpy = WeekdaysSalesData['Day'].to_numpy()
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = \
  train_test_split(
    WeekdaysSalesDataTrain_numpy, 
    WeekdaysSalesDataTest_numpy,
    random_state=100,
    shuffle=False)
<!-- PolynomialFeatures ( 폴리노미얼 피쳐 ), λ‹€ν•­νŠΉμ„± λͺ¨λ“ˆ -->
<!-- μ œκ³±μ΄λ‚˜ κ³±ν•˜κΈ°ν•  수 μžˆλŠ” 경우의 μˆ˜κ°€ λͺ¨λ‘ λ‚˜μ—΄ -->
from sklearn.preprocessing import PolynomialFeatures
polynomial = PolynomialFeatures(degree=4, include_bias=False) # 절편 속성은 제거
polynomial.fit(X_train) # νŠΉμ„±μ„ λ‹€ν•­μœΌλ‘œ μžλ™μœΌλ‘œ 뢈림

train_polynomial_added = polynomial.transform(X_train) # ν•™μŠ΅μ— μΆ”κ°€λœ νŒŒλΌλ―Έν„°μ— 맞게 λ‹€ν•­ λ³€ν™˜
test_polynomial_added = polynomial.transform(X_test) # ν…ŒμŠ€νŠΈ μ„ΈνŠΈλ„ λ‹€ν•­ λ³€ν™˜, fitν–ˆλ˜ ν›ˆλ ¨ poly λ₯Ό μ‚¬μš©.

<!-- μŠ€μΌ€μΌν™”λŠ” '데이터λ₯Ό μ•ˆμ •ν™”' -->
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(train_polynomial_added)
train_polynomial_added = scaler.transform(train_polynomial_added)
test_polynomial_added = scaler.transform(test_polynomial_added)
from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso

import matplotlib.pyplot as plt
import matplotlib as mat
<!-- μžλ°”μŠ€ν¬λ¦½νŠΈμ™€ 톡신 -->
from js import document
from pyodide import create_proxy

def graph_func(event):
    def_algorithm = document.getElementById("algorithm").value
    def_alpha_value = float(document.getElementById("alpha_value").value)

    if def_algorithm=='ridge_value':
      <!-- ===================================== -->
      <!-- 릿지λͺ¨λΈ -->
      ridge_model = Ridge(alpha=def_alpha_value)
      ridge_model.fit(train_polynomial_added, y_train)
      <!-- ν›ˆλ ¨κ³Όμ •μ— λŒ€ν•œ 척도λ₯Ό 평가 -> score()  -->
      print("릿지 ν›ˆλ ¨μš©λͺ¨λΈ 정확도")
      ridge_train_score = ridge_model.score(train_polynomial_added, y_train)
      print("릿지 ν…ŒμŠ€νŠΈλͺ¨λΈ 정확도")
      ridge_test_score = ridge_model.score(test_polynomial_added, y_test)
      document.getElementById("train_score").innerHTML = ridge_train_score
      document.getElementById("test_score").innerHTML = ridge_test_score

      <!-- μŠ€μΌ€μΌν™”λœ 데이터λ₯Ό λ°”νƒ•μœΌλ‘œ 예츑결과 -->
      y_train_predict = ridge_model.predict(train_polynomial_added)
      y_test_predict = ridge_model.predict(test_polynomial_added)

    else :
      <!-- ===================================== -->
      <!-- 라쏘λͺ¨λΈ -->
      lasso_model = Lasso(alpha=def_alpha_value)
      lasso_model.fit(train_polynomial_added, y_train)
      <!-- ν›ˆλ ¨κ³Όμ •μ— λŒ€ν•œ 척도λ₯Ό 평가 -> score()  -->
      print("라쏘 ν›ˆλ ¨μš©λͺ¨λΈ 정확도")
      lasso_train_score = lasso_model.score(train_polynomial_added, y_train)
      print("라쏘 ν…ŒμŠ€νŠΈλͺ¨λΈ 정확도")
      lasso_train_score = lasso_model.score(test_polynomial_added, y_test)
      <!-- μŠ€μΌ€μΌν™”λœ 데이터λ₯Ό λ°”νƒ•μœΌλ‘œ 예츑결과 -->
      y_train_predict = lasso_model.predict(train_polynomial_added)
      y_test_predict = lasso_model.predict(test_polynomial_added)
    <!-- κ·Έλž˜ν”„ -->
    fig = plt.figure(
    figsize=(15, 7)
    )
    <!-- μ£Όμœ„ μ΄μƒν•œ μ—¬λ°± μ—†μ• κΈ° -->
    fig.tight_layout()
    plt.xticks(
      WeekdaysSalesDataTrain_numpy[:, 0],
      WeekdaysSalesDataDay_numpy, 
      rotation=90)
    plt.title('Weekdays Avocado SalesAmount ( + algorithm )')
    <!-- 원본 -->
    plt.plot(        
        X_train[:,0],
        y_train,
        #marker='o',
        color='gray',
        label='Original'
    )
    plt.plot(        
        X_test[:,0],
        y_test,
        #marker='o',
        color='gray'
    )

    <!-- ν›ˆλ ¨ -->
    plt.plot(        
        X_train[:,0],
        y_train_predict,
        marker='d',
        color='blue',
        label='Train pattern'
    )
    <!-- 예츑 -->
    plt.plot(        
        X_test[:,0],
        y_test_predict,
        marker='*',
        color='green',
        label='Predict pattern'
    )
    plt.legend(
      shadow=True
    )
    plt.xticks(
      WeekdaysSalesDataTrain_numpy[:, 0],
      WeekdaysSalesDataDay_numpy, 
      rotation=90)
    plt.xlabel('Day')
    plt.ylabel('Amount(10000)')
    ax = plt.gca()
    <!-- μΆ•λ§Œ κ·Έλ¦¬λ“œ -->
    ax.xaxis.grid(True)
    <!-- 배경색, λ§ˆμ§„ μ‘°μ • -->
    ax.set_facecolor('#e8e7d2')
    ax.margins(x=0.01, y=0.02)
    pyscript.write("graph", fig)

e1 = document.getElementById("algorithm")
e1.addEventListener("change", create_proxy(graph_func))  
    
e2 = document.getElementById("alpha_value")
e2.addEventListener("change", create_proxy(graph_func))  
</py-script> 
  </body> 
</html>

 

  • common.py
def createElementDiv(document, Element, name):
    element = document.createElement('div')
    element.id = name
    document.body.append(element)
    return Element(name)

 

 

 

 

 

 

 

 

 

 

 

728x90
λ°˜μ‘ν˜•
Comments