【初心者向け】Streamlitの簡単な機械学習アプリ【pythonでWebアプリ】

Python

概要

  • streamlitを使って簡単にWebアプリを作成
  • sklearnのKmeansを使って教師なし学習(クラスタリング)
  • CSVのアップロード機能

ソースコード

  • コピペで使えます。
  • 読み込めるCSVは1列目にタイムスタンプがある、時系列データです。
import datetime
import streamlit as st
import pandas as pd
import plotly.express as px
from sklearn.cluster import KMeans


def uploader():
    uploaded_file = st.file_uploader("ファイルのアップロード")
    dataframe = None
    if uploaded_file is not None:
        dataframe = pd.read_csv(uploaded_file, index_col=[0], encoding='cp932', parse_dates=True)

    return dataframe


@st.cache
def convert_df(df):
    # IMPORTANT: Cache the conversion to prevent computation on every rerun
    return df.to_csv().encode('cp932')


def downloader(df):
    csv = convert_df(df)

    st.download_button(
        label="Download",
        data=csv,
        file_name=f'{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}.csv',
        mime='text/csv',
    )


def processing_df(df, resample, calc_type):
    if resample == '' or df is None:
        pass
    else:
        if calc_type == 'sum':
            df = df.resample(resample).sum()
            df = df.dropna()
        elif calc_type == 'mean':
            print(resample)
            df = df.resample(resample).mean()
            df = df.dropna()
        else:
            pass

    return df


def main():
    st.title("demo apps")
    df = uploader()

    st.write("処理方法を選択してください。")
    calc_type = st.selectbox('演算方法の設定', ['', 'sum', 'mean'])
    resample = st.selectbox('時間間隔の設定', ['', '30min', '1H', '1D', '1M', '1Y'])

    df = processing_df(df, resample, calc_type)

    if df is not None:
        # ダウンロードエリア
        downloader(df)
        # kmeansでクラス分け
        kmeans = KMeans(n_clusters=2,random_state=0).fit(df.iloc[:,0:2])
        # 可視化
        plotly_fig = px.scatter(df,x=df.columns[-1],y=df.columns[0],color=kmeans.labels_)
        st.plotly_chart(plotly_fig)
        # dataframe
        st.table(df)


if __name__ == '__main__':
    main()

解説

  • csvファイルのアップローダー
  • アップロードされたファイルがあれば、データフレームとしてファイルを読み込む処理が走ります。
def uploader():
    uploaded_file = st.file_uploader("ファイルのアップロード")
    dataframe = None
    if uploaded_file is not None:
        dataframe = pd.read_csv(uploaded_file, index_col=[0], encoding='cp932', parse_dates=True)

    return dataframe
  • ダウンローダーで使う関数
  • データフレームをエンコードして、ダウンローダーに渡す。
@st.cache
def convert_df(df):
    # IMPORTANT: Cache the conversion to prevent computation on every rerun
    return df.to_csv().encode('cp932')
  • ダウンローダー
  • エンコードされたcsvをWebアプリ上でダウンロードボタンとして表示させる。
def downloader(df):
    csv = convert_df(df)

    st.download_button(
        label="Download",
        data=csv,
        file_name=f'{datetime.datetime.now().strftime("%Y%m%d%H%M%S")}.csv',
        mime='text/csv',
    )
  • データフレームの処理
  • リサンプル指定がないもしくはデータフレームがなければpass
  • その他の場合、sumかmeanを指定されたリサンプルで行う。
def processing_df(df, resample, calc_type):
    if resample == '' or df is None:
        pass
    else:
        if calc_type == 'sum':
            df = df.resample(resample).sum()
            df = df.dropna()
        elif calc_type == 'mean':
            print(resample)
            df = df.resample(resample).mean()
            df = df.dropna()
        else:
            pass

    return df

どんなアプリか

コメント

タイトルとURLをコピーしました