# file name : reidai12_1.py
# reidai12_1 気温から予測するアイス売上アプリ

import streamlit as st
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib_fontja

# 機械学習関連
from sklearn.model_selection import train_test_split
# 線形回帰モデル
from sklearn.linear_model import LinearRegression

# ------ (1) start ------
# ------ (1) end ------

# ====== UI ======
# Web ページのタイトルと横方向のスタイル（中央）
st.set_page_config(page_title='気温から予測するアイス売上アプリ')
st.title('気温から予測するアイス売上アプリ')

# -------- データ準備------
# サンプルデータの辞書データをデータフレームに変換
data={'気温':[10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40],
      '売上':[10, 12, 18, 24, 31, 35, 38, 37, 32, 25, 18] }

df=pd.DataFrame(data)             # データフレームに変換

# 特徴量とターゲットデータ
X=df[['気温']]                     # データフレーム（2 次元）
y=df['売上']                       # シリーズ（1 次元）

# -------- データ分割・モデル設定・学習------
# データを訓練データ80% とテストデータ20% に分割(test_size=0.2)
X_train,X_test,y_train,y_test = \
        train_test_split(X,y,test_size=0.2,random_state=42)
# 線形回帰をモデル設定し、学習
model1=LinearRegression() # モデル設定
model1.fit(X_train,y_train) # 学習

# -------- 評価計算--------
r2 =model1.score(X_test,y_test) # R2(決定係数)
y_pred=model1.predict(X_test) # y の予測値
mse=float(np.mean((y_test-y_pred)**2)) # MSE(平均二乗誤差)
rmse=float(np.sqrt(mse)) # RMSE(二乗平均平方根誤差)

# 回帰式（線形）のf 文字列
a=float(model1.coef_[0]) ; b=float(model1.intercept_)
eq=f'  \n y={a:.3f}x + {b:.3f}（x=気温、y=アイス売上）'
# 改行は\n の前に2 個のスペース␣␣が必要

# --- (2) start ---
# --- (2) end ---

# ■Web ページを横に2分割し表示■
col_left,col_right=st.columns(2)

#===== ここから画面左側 =====
with col_left: 
    # -------- グラフ--------
    st.header('グラフ')
    # グラフ準備
    x_min,x_max=float(X['気温'].min()),float(X['気温'].max())
    x_line=np.linspace(x_min,x_max,200)     # グラフ準備：x軸
    x_line_df=pd.DataFrame({'気温': x_line})
    y_line_lin=model1.predict(x_line_df)    # グラフ準備：y軸
    
    # --- (3) start ---
    # --- (3) end ---

    # グラフ描画
    fig,ax=plt.subplots()
    ax.scatter(X['気温'].values,y.values,label='データ')
    ax.plot(x_line,y_line_lin,linewidth=2,label='線形回帰',
    color='blue')
    
    # --- (4) start ---
    # --- (4) end ---
    
    ax.set(xlabel='気温(℃)',ylabel='アイス売上(万円)')
    ax.set_title('気温とアイス売上')
    ax.legend()
    ax.set_axisbelow(True)                  # グリッドを点より後ろに
    ax.grid(True)                           # グリッド
    st.pyplot(fig)                          # グラフ表示

    # -------- モデルの評価--------
    st.write(f'線形回帰式：{eq}')             # 線形回帰式
    st.write(f'【線形】：R2：{r2:.3f}, RMSE：{rmse:.2f} 万円')
    
    # --- (5) start ---
    # --- (5) end ---

#===== ここから画面右側 =====
with col_right:
    # -------- 予測--------
    st.header('予測')
    st.write('気温を入力すると、売上金額を予測します！ ')
    temperature=st.number_input('気温（℃）',
            min_value=int(x_min), max_value=int(x_max), 
            value=int((x_min+x_max)/2))
    X_in=pd.DataFrame({'気温': [temperature]})
    pred1=float(model1.predict(X_in)[0])
    
    st.subheader('アイス売上予測')
    st.info(f'【線形】: {pred1:.1f} 万円')
    
    # --- (6) start ---
    # --- (6) end ---
    
    # -------- モデルの評価結果--------
    
    st.header('モデルの評価結果')
    
    # --- (7) start ---
    # --- (7) end ---