💻

StreamlitとさけのわAPIで簡単ウェブアプリ作成

2020/09/27に公開

はじめに

ふだんはPythonでデータ分析やアプリ開発、趣味でFlutter(Dart)を触っているらぴするです。
今回はStreamlitさけのわデータプロジェクトのAPIを用いて、日本酒のフレーバーチャートを表示する簡単なウェブアプリを作ってみたいと思います。

Streamlitについて

PythonにおいてWebアプリを作るフレームワークはDjangoやFlask、Bottle、Dashなど沢山ありますが、一番手軽にWebアプリを作成できるフレームワークがStreamlitです。
とりあえず動くものを作りたい!という方には非常におすすめです。
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ファイル名に置き換えてください)
sample_app

上から順番にコピペしていくだけで動くようになっているので、ぜひ試してみてください。

Discussion