サイトアイコン アマチュア無線局JS2IIU

Streamlit応用編 第3回: データのアップロードとダウンロード

こんにちは、JS2IIUです。連続投稿、3日目です。まだまだ前半なので順調です。引き続きよろしくお願いします。

はじめに

第3回目の今回は、Streamlitを使ってユーザーからデータをアップロードしてもらい、そのデータを処理した後にダウンロードさせる方法について解説します。これにより、ユーザーが自分のデータをアプリケーションに入力し、その結果を取得できるようになります。

ファイルのアップロード

Streamlitでは、st.file_uploaderを使ってユーザーがファイルをアップロードできるようにすることができます。これにより、ユーザーはローカルに保存しているファイルをアプリケーションにアップロードし、その内容を利用してさまざまな処理を行うことが可能です。

基本的なファイルアップロードの例

次の例では、ユーザーにCSVファイルをアップロードしてもらい、その内容を表示します。

import streamlit as st
import pandas as pd

# ファイルアップロード
uploaded_file = st.file_uploader("CSVファイルをアップロードしてください", type="csv")

# ファイルがアップロードされた場合
if uploaded_file is not None:
    df = pd.read_csv(uploaded_file)
    st.write("アップロードされたデータフレーム:")
    st.write(df)

このコードでは、st.file_uploaderを使ってユーザーにCSVファイルのアップロードを促します。ユーザーがファイルを選択すると、そのファイルが読み込まれ、データフレームとして表示されます。

ファイルをドラッグ&ドロップすることができます。これは便利ですね。

読み込みが終わるとデータフレームの表示になります。しまった、pd.read_csvの時にindex_col=0としておかないとダメでしたね。index_colについてはこちらのページが詳しいです。

今回の例でアップロードしたCSVファイルの中身はこんな感じです。行末のコンマも余分ですね・・・

,Sun,Mon,Tue,Wed,Thu,Fri,Sat,
ShopA,10,23,24,21,34,27,21,
ShopB,32,33,56,38,44,58,32,

複数ファイルのアップロード

Streamlitでは、st.file_uploaderを使って複数のファイルを同時にアップロードすることも可能です。次の例では、複数のCSVファイルをアップロードし、それぞれの内容を表示します。

import streamlit as st
import pandas as pd

# 複数ファイルのアップロード
uploaded_files = st.file_uploader("複数のCSVファイルをアップロードしてください", type="csv", accept_multiple_files=True)

# 各ファイルを処理
if uploaded_files:
    for uploaded_file in uploaded_files:
        df = pd.read_csv(uploaded_file)
        st.write(f"アップロードされたファイル: {uploaded_file.name}")
        st.write(df)

このコードでは、ユーザーが複数のCSVファイルを選択でき、それぞれのファイルが順に読み込まれて表示されます。

よーく見ると、Drag and drop files hereになってますね!

ファイルのダウンロードリンク

アップロードされたデータを処理した後、ユーザーにその結果をダウンロードさせる機能も重要です。st.download_buttonを使用すると、ユーザーが任意のファイルをダウンロードできるリンクを簡単に作成できます。

ダウンロードリンクの例

次の例では、ユーザーがアップロードしたデータに対して簡単な処理を行い、その結果をCSVファイルとしてダウンロードできるようにします。

import streamlit as st
import pandas as pd

# ファイルアップロード
uploaded_file = st.file_uploader("CSVファイルをアップロードしてください", type="csv")

# ファイルがアップロードされた場合
if uploaded_file is not None:
    df = pd.read_csv(uploaded_file, index_col=0)
    st.write("アップロードされたデータフレーム:")
    st.write(df)

    # 簡単なデータ処理
    processed_df = df.describe()

    # 処理結果を表示
    st.write("処理されたデータフレーム:")
    st.write(processed_df)

    # 処理結果をCSVとしてダウンロード
    csv = processed_df.to_csv().encode('utf-8')
    st.download_button(
        label="処理結果をダウンロード",
        data=csv,
        file_name='processed_data.csv',
        mime='text/csv',
    )

このコードでは、ユーザーがアップロードしたCSVファイルに対して、describe関数を使って基本的な統計情報を取得し、その結果をCSVファイルとしてダウンロードできるリンクを生成しています。

「処理結果をダウンロード」をクリックすると以下の内容のファイルがダウンロードできました。

,Sun,Mon,Tue,Wed,Thu,Fri,Sat
count,3.0,3.0,3.0,3.0,3.0,3.0,3.0
mean,29.0,37.666666666666664,40.666666666666664,46.0,46.666666666666664,48.0,31.666666666666668
std,17.69180601295413,17.47378989610821,16.041612554021288,29.816103031751148,14.189197769195175,18.193405398660254,10.503967504392488
min,10.0,23.0,24.0,21.0,34.0,27.0,21.0
25%,21.0,28.0,33.0,29.5,39.0,42.5,26.5
50%,32.0,33.0,42.0,38.0,44.0,58.0,32.0
75%,38.5,45.0,49.0,58.5,53.0,58.5,37.0
max,45.0,57.0,56.0,79.0,62.0,59.0,42.0

まとめ

第3回目では、Streamlitを使ったファイルのアップロードとダウンロードの方法について学びました。これにより、ユーザーが自身のデータをアプリケーションに入力し、その処理結果を取得できるインタラクティブなアプリケーションを作成することが可能になります。

次回は、レイアウトのカスタマイズについて解説します。カラムレイアウトの利用やカスタムCSSの適用によって、アプリケーションの見た目をより洗練されたものにする方法を紹介しますので、ぜひお楽しみに!

最後まで読んでいただきありがとうございました。73

補足:Streamlit応用編 記事リスト

Streamlit応用編 第1回: キャッシュ機能の活用
https://js2iiu.com/2024/08/28/streamlit-01-cache/

Streamlit応用編 第2回: インタラクティブなウィジェットの応用
https://js2iiu.com/2024/08/29/streamlit-02-widget/

Streamlit応用編 第3回: データのアップロードとダウンロード
https://js2iiu.com/2024/08/29/streamlit-03-download/

Streamlit応用編 第4回: レイアウトのカスタマイズ
https://js2iiu.com/2024/08/30/streamlit-04-layout/

Streamlit応用編 第5回: テーマのカスタマイズ
https://js2iiu.com/2024/08/31/streamlit-05-theme-custom/

Streamlit応用編 第6回: デプロイと共有
https://js2iiu.com/2024/09/01/streamlit-06-deploy/

Streamlit応用編 第7回: 認証とセキュリティ
https://js2iiu.com/2024/09/02/streamlit-07-security/

Streamlit応用編 第8回: データベースとの連携
https://js2iiu.com/2024/09/02/streamlit-08-database/

Streamlit応用編 第9回: 複雑なデータビジュアライゼーション
https://js2iiu.com/2024/09/05/streamlit-09-visualization/

Streamlit応用編 第10回: マルチページアプリの作成
https://js2iiu.com/2024/09/06/streamlit-10-multipage/

Streamlit応用編 第11回: StreamlitでAPIを作成する方法
https://js2iiu.com/2024/09/07/streamlit-11-api/

最後に、書籍のPRです。
24年9月に出版された「ハイパーモダンPython-信頼性の高いワークフローを構築するモダンテクニック」、Claudio Jolowicz著、嶋田、鈴木訳。開発環境の構築、プロジェクトの管理、テストに関して実践的な内容でとても参考になる一冊です。ぜひ手に取ってみてください。

最後まで読んでいただきありがとうございます。

モバイルバージョンを終了