StreamlitとさけのわAPIで簡単ウェブアプリ作成
はじめに
ふだんはPythonでデータ分析やアプリ開発、趣味でFlutter(Dart)を触っているらぴするです。
今回はStreamlitとさけのわデータプロジェクトのAPIを用いて、日本酒のフレーバーチャートを表示する簡単なウェブアプリを作ってみたいと思います。
Streamlitについて
PythonにおいてWebアプリを作るフレームワークはDjangoやFlask、Bottle、Dashなど沢山ありますが、一番手軽にWebアプリを作成できるフレームワークがStreamlitです。
とりあえず動くものを作りたい!という方には非常におすすめです。
さけのわデータプロジェクトのAPIについて
日本酒アプリのさけのわが提供するAPIで、日本酒に関する「銘柄の基本情報」や「フレーバーの数値」、「詳細のタグ」などを取得することができます。
今回はこちらのデータをStreamlitで可視化してみたいと思います。
さけのわデータとは
日本酒アプリさけのわが保有するフレーバーを数値化したデータや人気銘柄情報を公開するプロジェクトです。利用規約の範囲で誰でも無料で利用することができ、ECサイトでデータを表示したり、アプリやサービスを作ったり、データ解析を行ったりすることができます
さけのわデータプロジェクト
さっそくウェブアプリを作ってみよう!
まずはStreamlitのインストール
pip install streamlit
次に必要なパッケージをインポート
import pandas as pd
import numpy as np
import requests
import json
import streamlit as st
import plotly.express as px
Streamlitはmarkdownが使用できるので、タイトルをつけていきます
# markdownで文章が書ける
st.markdown('# 簡単日本酒アプリ')
st.markdown('[さけのわAPI](https://sakenowa.com)のデータを表示しています:')
APIのエンドポイントをdictで用意します
# エンドポイント
urls = {
"地域一覧": "https://muro.sakenowa.com/sakenowa-data/api/areas",
"銘柄一覧": "https://muro.sakenowa.com/sakenowa-data/api/brands",
"蔵元一覧": "https://muro.sakenowa.com/sakenowa-data/api/breweries",
"ランキング": "https://muro.sakenowa.com/sakenowa-data/api/rankings",
"フレーバーチャート": "https://muro.sakenowa.com/sakenowa-data/api/flavor-charts",
"フレーバータグ": "https://muro.sakenowa.com/sakenowa-data/api/flavor-tags",
"銘柄ごとフレーバータグ": "https://muro.sakenowa.com/sakenowa-data/api/brand-flavor-tags",
}
データ取得の流れは
地域IDを取得⇒蔵元IDを取得⇒銘柄IDを取得⇒フレーバーチャート情報を取得
といった感じになります。
ユーザーがドロップダウンで好きな地域、蔵元、銘柄を取得できるようにコードを書いていきます
# 地域名を取得
areas_response = requests.get(urls.get("地域一覧")).json()
areas = [area["name"] for area in areas_response["areas"]]
select_areas = st.sidebar.selectbox("好きな地域を選んでください", areas)
# 地域IDを取得
areaId = [area["id"] for area in areas_response["areas"] if area["name"]==select_areas][0]
# 蔵元名を取得
breweries_response = requests.get(urls.get("蔵元一覧")).json()
breweries = [breweries["name"] for breweries in breweries_response["breweries"] if breweries["areaId"]==areaId]
select_breweries = st.sidebar.selectbox("好きな蔵元を選んでください", breweries)
# 蔵元IDを取得
breweryId = [breweries["id"] for breweries in breweries_response["breweries"] if breweries["name"]==select_breweries][0]
# 銘柄名を取得
brands_response = requests.get(urls.get("銘柄一覧")).json()
brands = [brands["name"] for brands in brands_response["brands"] if brands["breweryId"]==breweryId]
select_brands = st.sidebar.selectbox("好きな銘柄を選んでください", brands)
# 銘柄IDを取得
brandId = [brands["id"] for brands in brands_response["brands"] if brands["name"]==select_brands][0]
# フレーバーチャートを取得
flavor_charts_response = requests.get(urls.get("フレーバーチャート")).json()
flavor_charts = [flavor_charts for flavor_charts in flavor_charts_response["flavorCharts"] if flavor_charts["brandId"]==brandId]
そして最後にplotlyを用いてレーダーチャートにフレーバーの値を反映させていきます
# plotlyでレーダーチャートを表示
st.markdown(f'## {select_brands}のフレーバーチャート')
try:
df = pd.DataFrame(flavor_charts)
df = df.drop('brandId', axis=1)
# 見やすくするためにカラム名を変更、その後plotlyで読み込めるようにデータを転置
df = df.rename(columns={'f1':'華やか', 'f2':'芳醇', 'f3':'重厚', 'f4':'穏やか', 'f5':'ドライ', 'f6':'軽快'}).T
fig = px.line_polar(df, r=df[0], theta=df.index, line_close=True, range_r=[0,1])
st.plotly_chart(fig)
# フレーバーチャートのデータがないものもあるので例外処理
except:
st.markdown('## この銘柄はフレーバーチャートを表示できません!!')
以上で完成です!
コードを書くのは一つのファイルだけで済むので、とても簡単ですね。
(Djangoは心が折れそうになります。。。)
ウェブアプリを起動してみよう!
ターミナルを開き
streamlit run app.py
でブラウザが起動し、アプリが立ち上がります。(app.pyは自分のpythonファイル名に置き換えてください)
上から順番にコピペしていくだけで動くようになっているので、ぜひ試してみてください。
Discussion