Créez rapidement un tableau de bord d'analyse de données Python avec Streamlit et déployez-le sur AWS

introduction

Je souhaite créer un tableau de bord capable de visualiser et d'analyser les données de manière intuitive et de les publier en tant qu'application Web. Mais html, css et js sont gênants, donc je ne veux pas les déranger. Dans un tel cas, Streamlit vous permet de créer un tableau de bord d'analyse de données avec un seul script Python sans aucun problème. Dans cet article

Je vais partir. Puisqu'il est un tel moment, en tant que sujet, regardez les données qui peuvent confirmer le trafic des personnes dans les 23 quartiers de Tokyo publiées dans Yahoo Data Solution, et le nouveau Corona Vérifions l'impact des mesures.

\ # Surtout la seconde moitié est un enregistrement qu'un débutant du système Web a essayé à tâtons, il devrait donc y avoir diverses lacunes dans le contenu et la description. \ # J'apprécierais si vous pouviez le signaler.

Création d'applications

Installation Streamlit

Streamlit est OSS. GitHub:https://github.com/streamlit/streamlit

L'installation est OK avec ce qui suit.

pip install streamlit

En exécutant la commande suivante, vous pouvez lancer l'application de démonstration localement et la vérifier sur le navigateur (le navigateur se lancera automatiquement).

streamlit hello

image.png

La Page officielle du didacticiel est facile à comprendre et à utiliser. Cet article de commentaire est également disponible.

[Une addition] Ceci est également utile.

Préparation des données

C'est un tel moment, vous voudrez donc voir comment les nouvelles mesures corona affectent le flux de personnes à Tokyo. Lorsque j'ai recherché de telles données, je les ai trouvées sur Yahoo! Data Solution. "Transition quotidienne de la population estimée séjournant à Tokyo 23 quartiers (total / visiteurs / résidents)" Données Il a été publié en tant que données ouvertes (à compter du 10 avril 2020). Cette fois, je vais essayer de visualiser cela d'une manière agréable.

[Source: Yahoo! Data Solution (https://ds.yahoo.co.jp/report/, 09/04/2020)] Les données sont mises à jour quotidiennement. Les données jusqu'au 9 avril 2020 sont utilisées ici.

Les données originales sont au format Excel et comprennent le nombre de résidents, de visiteurs et le nombre total de personnes dans les 23 quartiers de Tokyo sur une base quotidienne. Comme il est enregistré dans une feuille séparée pour chaque mois, convertissez-le en csv à l'avance.

Lisez chacun de ces éléments et combinez-les en un seul.

import numpy as np
import pandas as pd

data_02 = pd.read_csv('Transition du quartier 23 de Tokyo 0409_février.csv')
data_03 = pd.read_csv('Transition du quartier 23 de Tokyo 0409_Mars.csv')
data_04 = pd.read_csv('Transition du quartier 23 de Tokyo 0409_avril.csv')

data_all = pd.concat([data_02, data_03.iloc[:, 2:], data_04.iloc[:, 2:]], axis=1)
data_all.head()
Zone Classification cible 1er février 2 février 3 février 4 février 5 février 6 février 7 février 8 février ... 30 mars 31 mars 1er avril 2 avril 3 avril 4 avril 5 avril 6 avril 7 avril 8 avril
0 Les 23 quartiers entiers de Tokyo entier 10485000 10164000 11676000 11687000 11659000 11690000 11691000 10471000 ... 11393000 11388000 11288000 11263000 11256000 10021000 9737000 11212000 11104000 10859000
1 NaN Résident 8921000 8921000 8921000 8921000 8921000 8921000 8921000 8921000 ... 8949000 8949000 8924000 8924000 8924000 8924000 8924000 8924000 8924000 8924000
2 NaN Visiteurs 1564000 1243000 2755000 2766000 2738000 2769000 2770000 1550000 ... 2444000 2439000 2364000 2339000 2332000 1097000 813000 2288000 2180000 1935000
3 Chiyoda-ku entier 454900 356900 1028900 1039900 1031900 1043900 1041900 453900 ... 857000 855000 819500 802500 791500 266500 195500 775500 731500 624500
4 NaN Résident 54900 54900 54900 54900 54900 54900 54900 54900 ... 56000 56000 55500 55500 55500 55500 55500 55500 55500 55500

Les zones et les classifications cibles sont organisées en MultiIndex et en sortie.

data_all.fillna(method='ffill', inplace=True)
data_all.set_index(['zone', 'Classification des cibles'], inplace=True)

data_all.to_csv('tokyo_0409.csv', index=True, header=True)

Les données finales ressemblent à ceci.

data_all.head(7)
1er février 2 février 3 février 4 février 5 février 6 février 7 février 8 février 9 février 10 février ... 30 mars 31 mars 1er avril 2 avril 3 avril 4 avril 5 avril 6 avril 7 avril 8 avril
Zone Classification cible
Les 23 quartiers entiers de Tokyo Général 10485000 10164000 11676000 11687000 11659000 11690000 11691000 10471000 10149000 11523000 ... 11393000 11388000 11288000 11263000 11256000 10021000 9737000 11212000 11104000 10859000
Résident 8921000 8921000 8921000 8921000 8921000 8921000 8921000 8921000 8921000 8921000 ... 8949000 8949000 8924000 8924000 8924000 8924000 8924000 8924000 8924000 8924000
Visiteurs 1564000 1243000 2755000 2766000 2738000 2769000 2770000 1550000 1228000 2602000 ... 2444000 2439000 2364000 2339000 2332000 1097000 813000 2288000 2180000 1935000
Chiyoda-ku Général 454900 356900 1028900 1039900 1031900 1043900 1041900 453900 356900 958900 ... 857000 855000 819500 802500 791500 266500 195500 775500 731500 624500
Résident 54900 54900 54900 54900 54900 54900 54900 54900 54900 54900 ... 56000 56000 55500 55500 55500 55500 55500 55500 55500 55500
Visiteurs 400000 302000 974000 985000 977000 989000 987000 399000 302000 904000 ... 801000 799000 764000 747000 736000 211000 140000 720000 676000 569000
Chuo-ku Général 441000 367000 849000 857000 852000 861000 863000 440000 370000 793000 ... 733000 728000 701000 691000 684000 307000 256000 675000 641000 563000

Créer un tableau de bord

À partir de là, nous allons créer un tableau de bord. Streamlit vous permet de créer un tableau de bord avec un seul script Python. Cette fois, j'écrirai le script sous la forme streamlit_app.py.

Le contenu des données est affiché dans un graphique linéaire. Spécifiez la zone cible dans la zone de sélection et faites-en une spécification qui vous permet de voir la transition chronologique du nombre de résidents, de visiteurs et du nombre total de la zone.

streamlit_app.py


import numpy as np
import pandas as pd
import streamlit as st
import plotly.graph_objects as go

st.title('Transition quotidienne de la population estimée dans 23 quartiers de Tokyo')
st.write('[Source: Yahoo Data Solution]')

data_all = pd.read_csv('data/tokyo_0409.csv')
erea_list = data_all['zone'].unique()

data_all.set_index(['zone', 'Classification des cibles'], inplace=True)

#Changer la valeur en tenue verticale
data_all = data_all.T
#Convertir la date en type datetime
data_all.index = map(lambda x: '2020'+x, data_all.index)
data_all.index = pd.to_datetime(data_all.index, format='%Y année%m mois%jour j')
data_all.index.name = 'temps'

#Sélectionnez la zone d'affichage avec la boîte de sélection
selected_erea = st.sidebar.selectbox(
    'Sélectionnez la zone à afficher:',
    erea_list
)

#affichage graphique
st.write(f'##Affichage:{selected_erea}')
data_plotly = data_all[(selected_erea)]
data_plot = [
    go.Scatter(x=data_plotly.index,
               y=data_plotly['Résident'],
               mode='lines',
               name='Résident'),
    go.Scatter(x=data_plotly.index,
               y=data_plotly['Visiteur'],
               mode='lines',
               name='Visiteur'),
    go.Scatter(x=data_plotly.index,
               y=data_plotly['L'ensemble'],
               mode='lines',
               name='L'ensemble')]
layout = go.Layout(
    xaxis={"title": "Date"},
    yaxis={"title": "Nombre de personnes"}
)
st.plotly_chart(go.Figure(data=data_plot, layout=layout))


image.png

Utilisez la méthode st.write () du module streamlit, etc. Nous définirons les chaînes de caractères, les tableaux et les graphiques à afficher à l'écran.

De plus, en tant que processus interactif, st.selectbox () est utilisé pour afficher les options de la zone cible. En ayant la valeur sélectionnée par l'utilisateur dans selected_erea comme valeur de retour, Les informations de la zone correspondante sont dessinées dans un graphique. Vous pouvez placer des éléments dans la barre latérale sur le côté gauche de l'écran avec st.sidebar, ce qui le rend un peu joli.

Pour l'affichage graphique, des méthodes simples telles que st.line_chart () sont fournies, Je ne semblais pas pouvoir gérer les dates, etc. Cette fois, j'utilise st.plotly_chart () pour créer un graphique interactif avec Plotly et le dessiner.

Une autre caractéristique de Streamlit est Vous pouvez tracer des données sur la carte avec st.map () Vous pouvez afficher une barre de progression pour les processus qui prennent beaucoup de temps avec st.progress (). Je voulais également utiliser cette zone, mais cette fois je l'omettrai.

Il est pratique de pouvoir créer un écran avec juste un court script Python sans être du tout conscient du HTML.

Déployer sur AWS

Utilisation supposée, vous pouvez vérifier rapidement les données disponibles, partager les résultats avec l'équipe, etc. Je pense que c'est à ce sujet, mais comme c'est un gros problème, je vais le déployer sur une instance AWS EC2 et le publier en tant que test.

procédure: 1: Créez une instance t2.micro de l'offre gratuite AWS EC2 2: Exécutez l'application dans l'instance

streamlit run streamlit_app.py

3: Acquisition de domaine Cette fois, j'ai obtenu un nom de domaine approprié ʻonedata.ml du service de domaine gratuit [freenom](https://www.freenom.com/ja/index.html). (Vous pouvez obtenir gratuitement les domaines ".tk", ".ml", ".ga", ".cf", ".gq") 4: Modifier le fichier de configuration streamlit Dans le fichier de configuration (config.toml) dans le dossier ~ / .streamlit`, Entrez le nom de domaine que vous avez obtenu comme adresse d'accès.

[browser]
gatherUsageStats = false
serverAddress = "onedata.ml"

[server]
port = 8501

5: Transfert de port de 80 à 8501 Par défaut, streamlit accepte la communication sur le port 8501. Je veux pouvoir accéder à partir du port par défaut 80 afin d'accéder sans spécifier le port par nom de domaine. Pour ce faire, vous avez besoin des privilèges root lors de l'exécution de l'application. Par conséquent, ici, nous allons y faire face en jouant avec iptables et en transférant l'accès du port 80 au port 8501.

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8501

6: Ouverture du port 80 Modifiez le groupe de sécurité> Règles entrantes sur le tableau de bord EC2 et laissez le port 80 ouvert.

Voici l'application que j'ai créée ↓ http://onedata.ml

Mise en œuvre ↓ https://github.com/tkmz-n/streamlit_app

Résumé

Créez une application de démonstration simple pour visualiser les données ouvertes à l'aide de Streamlit J'ai essayé de le déployer sur AWS et de le publier.

En regardant les données, nous pouvons voir que le trafic de personnes dans les 23 quartiers de Tokyo diminue progressivement depuis la fin du mois de mars. Continuons à rester chez nous dans le but de faire converger la nouvelle Corona le plus rapidement possible.

Recommended Posts

Créez rapidement un tableau de bord d'analyse de données Python avec Streamlit et déployez-le sur AWS
Créez un arbre de décision à partir de zéro avec Python et comprenez-le (3. Bibliothèque d'analyse de données édition Pandas)
[AWS lambda] Déployer, y compris diverses bibliothèques avec lambda (générer un zip avec un mot de passe et le télécharger vers s3) @ Python
Créez un script de déploiement avec fabric et cuisine et réutilisez-le
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
Créer un Ubuntu de démarrage USB avec un environnement Python pour l'analyse des données
[AWS] Créez un environnement Python Lambda avec CodeStar et faites Hello World
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (4. Structure des données)
Créez un arbre de décision à partir de 0 avec Python et comprenez-le (5. Entropie des informations)
Étapes pour créer un bot Twitter avec Python
Mettez à jour les données en les téléchargeant sur s3 d'aws avec une commande, et supprimez les données utilisées (en chemin)
Quand j'ai essayé de créer un environnement virtuel avec Python, cela n'a pas fonctionné
Analyse de données avec Python
[Python] Comment créer un environnement de serveur Web local avec SimpleHTTPServer et CGIHTTPServer
Note de lecture: Introduction à l'analyse de données avec Python
Créer une couche pour AWS Lambda Python dans Docker
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Déployer une application Web créée avec Streamlit sur Heroku
Obtenez une grande quantité de données Twitter de Starba avec python et essayez l'analyse de données Partie 1
Étapes pour créer rapidement un environnement d'apprentissage en profondeur sur Mac avec TensorFlow et OpenCV
Jusqu'à ce que vous créiez un environnement d'apprentissage automatique avec Python sur Windows 7 et que vous l'exécutiez
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python
Créer un répertoire avec python
Créez un bot Mastodon avec une fonction pour répondre automatiquement avec Python
J'ai écrit rapidement un programme pour étudier la DI avec Python ①
Associez Python Enum à une fonction pour la rendre appelable
Probablement le moyen le plus simple de créer un pdf avec Python 3
Créez des applications, enregistrez des données et partagez-les avec un seul e-mail
Créons un diagramme PRML avec Python, Numpy et matplotlib.
20200329_Introduction à l'analyse de données avec Python 2nd Edition Personal Summary
Essayez d'ouvrir une sous-fenêtre avec PyQt5 et Python
Créez un outil d'analyse vidéo simple avec python wxpython + openCV
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM
Créer un message correspondant à la localisation avec la chaîne de traduction python
Obtenez des données supplémentaires vers LDAP avec python (Writer et Reader)
Vue d'ensemble de l'environnement virtuel Python et comment le créer
Obtenez de manière récursive la liste Excel dans un dossier spécifique avec python et écrivez-la dans Excel.
Procédure pour créer un Job qui extrait une image Docker et la teste avec des actions Github
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
[Python / Ruby] Comprendre le code Comment obtenir des données en ligne et les écrire au format CSV
Étapes pour configurer Pipenv, créer une application CRUD avec Flask et la conteneuriser avec Docker
[Python] J'ai écrit un test de "Streamlit" qui facilite la création d'applications de visualisation.
[Python] Qu'est-ce qu'un tuple? Explique comment utiliser sans toucher et comment l'utiliser avec des exemples.
traitement pour utiliser les données notMNIST en Python (et essayé de les classer)
Créez un fichier temporaire avec django sous forme de zip et renvoyez-le
Introduction à l'analyse de données avec Python P32-P43 [ch02 3.US Baby Names 1880-2010]
Créez un environnement virtuel avec Python!
Essayez de créer un environnement python avec Visual Studio Code et WSL
J'ai essayé de créer une liste de nombres premiers avec python
Introduction à l'analyse de données par Python P17-P26 [ch02 1.usa.gov données de bit.ly]
Obtenez des données de VPS MySQL avec Python 3 et SQL Alchemy
Liens vers des personnes qui commencent tout juste l'analyse de données avec python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
Créez une application de scraping avec Python + Django + AWS et modifiez les tâches
J'ai essayé de créer des taureaux et des vaches avec un programme shell
Je veux créer un fichier pip et le refléter dans le menu fixe