Il est pratique d'utiliser une bibliothèque en Python pour analyser et organiser les données. J'utilise souvent Numpy, Matplotlib, Pandas, Seaborn.
Après avoir essayé diverses analyses avec Jupyter Notebook et décidé que ce type de traitement devait être effectué, je souhaite créer un script et l'exécuter automatiquement chaque jour.
N'hésitez pas à exécuter AWS Lambda toutes les heures pour exécuter le script. Vous n'avez pas besoin de maintenir le serveur. De plus, c'est bon marché.
Mais si vous souhaitez utiliser la bibliothèque avec Python d'AWS Lambda, vous devez lui donner Créer un package de déploiement ne pas. De plus, si vous utilisez une bibliothèque qui nécessite une compilation, telle que Numpy, vous aurez besoin d'un environnement Amazon Linux, ce qui est un problème.
AWS Cloud9 peut être utilisé comme environnement de développement en configurant un serveur sur EC2 et en y accédant à partir du navigateur de votre PC. Il peut être bon d'exécuter Amazon Linux avec Docker, mais il est plus facile de le configurer dans le cloud. De plus, si vous ne l'avez pas utilisé depuis un certain temps, il semble que l'instance EC2 sera suspendue sans autorisation, ce qui est gentil avec votre portefeuille.
Créez un nouvel environnement à partir du menu AWS Cloud9. Il n'y a rien à faire attention, mais pour l'instant, les seules plates-formes que vous pouvez choisir sont Amazon Linux ou Ubuntu Server 18.04 LTS. L'environnement Lambda devient Amazon Linux 2, mais cela ne peut pas être aidé. Cette fois, j'ai choisi Amazon Linux.
Fondamentalement, configurez-le conformément à la Documentation. Lorsque Cloud9 est lancé, cliquez sur l'onglet "Ressources AWS" à l'extrême droite pour afficher le menu Lambda. Lorsque vous appuyez sur le bouton «Créer une nouvelle fonction Lambda», un assistant appelé «Créer une application sans serveur» apparaît. Cette fois, je vais le faire avec le nom envtest. Malheureusement, Python 3.6 était le seul Python qui pouvait être sélectionné comme Runtime.
Lorsque l'assistant a terminé, vous devriez avoir un dossier appelé envtest.
Avant d'écrire le code, installons les bibliothèques requises. envtest/venv/ Possède un environnement virtuel Python. Depuis la console Cloud9 IDE
source ./envtest/venv/bin/activate
Après l'activation en tapant, pip installera de plus en plus de bibliothèques requises. AWS Lambda a une limite de 250 Mo pour la taille du package de déploiement, y compris les bibliothèques. Installez uniquement le minimum requis. Cette fois Numpy, Matplotlib, Pandas, Seaborn, Pillow, boto3 Je l'ai installé, mais ça allait (à peine).
envtest/envtest/lambda_function.py J'écrirai la fonction Lambda dans.
Cette fois, afin de saisir la tendance du nombre de personnes infectées par le virus corona à Tokyo, nous allons lire le CSV quotidien du nombre de personnes infectées à Tokyo, tracer la valeur quotidienne et la moyenne mobile sur 7 jours, et le télécharger sur S3. fait. J'ai une image bitmap de 320x240 pixels comme indiqué dans Adafruit's Pyportal.
2020-9-5 Ça ressemble à ça maintenant.
Cliquez ici pour les dernières nouvelles
lambda_function.py
import base64
import io
from datetime import datetime as dt
import boto3
import pandas as pd
import seaborn as sns
from matplotlib import pyplot as plt
sns.set(style="whitegrid")
from PIL import Image
#Acquisition des détails de l'annonce de nouveaux patients positifs au coronavirus
URL = 'https://stopcovid19.metro.tokyo.lg.jp/data/130001_tokyo_covid19_patients.csv'
s3_client = boto3.client('s3')
def lambda_handler(event, context):
df = pd.read_csv(URL)
df['date'] = df['Publié_Date'].apply(lambda a: dt.strptime(a, '%Y-%m-%d'))
df = pd.DataFrame(df['date'].value_counts(sort=False).sort_index())
df['ma7'] = df.iloc[:,0].rolling(window=7).mean()
#PyPortal is 320 x 240
ppi = 227
width = 320 / ppi
height = 240 / ppi
SMALL_SIZE = 4
MEDIUM_SIZE = 10
BIGGER_SIZE = 12
plt.rc('font', size=SMALL_SIZE) # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE) # fontsize of the axes title
plt.rc('axes', labelsize=MEDIUM_SIZE) # fontsize of the x and y labels
plt.rc('xtick', labelsize=SMALL_SIZE) # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE) # fontsize of the tick labels
plt.rc('legend', fontsize=SMALL_SIZE) # legend fontsize
plt.rc('figure', titlesize=BIGGER_SIZE) # fontsize of the figure title
fig, ax = plt.subplots(figsize=(width,height), dpi=ppi)
ax.plot(df['date'], color='g', label="Daily")
ax.plot(df['ma7'], 'r', label="ma7")
#ax.text(0, 1, "212", fontsize=4)
ax.set_title("Tokyo COVID-19")
#fig.legend()
fig.autofmt_xdate()
plt.tight_layout()
pic_IObytes = io.BytesIO()
plt.savefig(pic_IObytes, format='png')
pic_IObytes.seek(0)
im = Image.open(pic_IObytes)
pic_IObytes_bmp = io.BytesIO()
im.save(pic_IObytes_bmp, format='bmp')
pic_IObytes_bmp.seek(0)
#pic_hash = base64.b64encode(pic_IObytes_bmp.read())
s3_client.upload_fileobj(pic_IObytes_bmp, "pyportal", "covid19_tokyo.bmp", ExtraArgs={'ACL': 'public-read'})
return ''
df = pd.read_csv(URL)
Avec juste cette ligne, il téléchargera le CSV à partir de l'URL et le rendra Pandas.DataFrame. génial.
df['date'] = df['Publié_Date'].apply(lambda a: dt.strptime(a, '%Y-%m-%d'))
df = pd.DataFrame(df['date'].value_counts(sort=False).sort_index())
df['ma7'] = df.iloc[:,0].rolling(window=7).mean()
Pour faciliter la gestion ultérieure, créez une colonne d'objet DateTime à partir de la colonne contenant la date sous forme de chaîne de caractères et redéfinissez-la en tant que DataFrame indexé. Calculez également la moyenne mobile sur 7 jours pour créer une nouvelle colonne.
fig, ax = plt.subplots(figsize=(width,height), dpi=ppi)
ax.plot(df['date'], color='g', label="Daily")
ax.plot(df['ma7'], 'r', label="ma7")
Dessin graphique avec matplotlib. Je veux le rendre 320x240pixel à la fin, alors réglez le dpi de manière appropriée et définissez la largeur et la hauteur.
pic_IObytes = io.BytesIO()
plt.savefig(pic_IObytes, format='png')
pic_IObytes.seek(0)
Enregistrez le graphique au format PNG en mémoire. Pyportal ne peut lire que le format bitmap, je voulais donc l'enregistrer sous forme de bitmap. Mais le backend de matplotlib que j'utilise ne prenait pas en charge l'enregistrement au format BMP.
im = Image.open(pic_IObytes)
pic_IObytes_bmp = io.BytesIO()
im.save(pic_IObytes_bmp, format='bmp')
pic_IObytes_bmp.seek(0)
Comme il n'y a aucune aide pour cela, une fois enregistré au format PNG, ouvrez-le avec Pillow et enregistrez-le à nouveau au format BMP.
s3_client.upload_fileobj(pic_IObytes_bmp, "pyportal", "covid19_tokyo.bmp", ExtraArgs={'ACL': 'public-read'})
Téléchargez sur S3 et publiez.
Les fonctions Lambda sont généralement lourdes à déboguer. Des choses simples qui n'utilisent que des fonctions standard peuvent toujours être utilisées avec l'EDI sur l'écran de gestion AWS Lambda, mais si vous utilisez beaucoup de bibliothèques externes comme cette fois, vous ne pouvez pas le faire non plus.
Cependant, il est facile de déboguer avec l'EDI Cloud 9. Vous pouvez également utiliser le débogueur en définissant des points d'arrêt. Je vous remercie.
Déboguer avec «Exécuter local» et déployer si réussi. Appuyez simplement sur le bouton «Déployer la fonction Lambda sélectionnée» dans le menu Lambda de Cloud9 IDE. Il compressera l'environnement et le téléchargera sur AWS Lambda.
Puisque cette fois, nous allons télécharger vers S3 à la fin, nous devons définir la stratégie Amazon S3FullAccess pour le rôle de cette fonction à partir de l'écran de gestion AWS Lambda.
Si tout se passe bien, définissez EventBridge (CloudWatch Events) comme déclencheur et définissez le taux (1 jour) pour terminer.
L'IDE Cloud9 n'est pas mal non plus, mais il y a des moments où je veux faire beaucoup avec le Jupyter Notebook. Par conséquent, lancez Jupyter Notebook sur le serveur de Clould9 afin de pouvoir développer avec Jupyter Notebook depuis le navigateur de votre PC ou smartphone.
Vous serez probablement à court de volume EBS lorsque vous préparerez l'environnement pour expérimenter avec Jupyter Notebook. Agrandissez-le selon la documentation. Je l'ai gardé à 20 Gio.
Resize an Amazon EBS volume used by an environment
Depuis la console Cloud9 IDE, configurez miniconda et configurez votre environnement Python préféré.
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
Après cela, vous pouvez créer un environnement comme vous le souhaitez avec conda.
jupyter notebook --ip=0.0.0.0
Lors du lancement, spécifiez 0.0.0.0 pour l'IP afin qu'elle soit accessible de l'extérieur. La sécurité est renforcée, alors définissez au moins un mot de passe.
Cliquez sur «Aller à l'instance» dans l'élément Instance EC2 sur l'écran de gestion AWS Cloud9 pour afficher l'écran de gestion de l'EC2 que vous utilisez. Vous pouvez accéder au Jupyter Notebook en copiant l'URL dans «Public DNS (IPv4)» dans le presse-papiers et en y accédant avec un navigateur avec «: 8888» et le numéro de port spécifié à la fin. Comme ça.
http://ec2-xx-xxx-xx-xx.ap-northeast-1.compute.amazonaws.com:8888/
Recommended Posts