Es ist praktisch, eine Bibliothek in Python zu verwenden, um Daten zu analysieren und zu organisieren. Ich benutze oft Numpy, Matplotlib, Pandas, Seaborn.
Nachdem ich verschiedene Analysen mit Jupyter Notebook ausprobiert und entschieden habe, dass diese Art der Verarbeitung durchgeführt werden soll, möchte ich ein Skript erstellen und es jeden Tag automatisch ausführen.
Fühlen Sie sich frei, AWS Lambda jede Stunde auszuführen, um das Skript auszuführen. Sie müssen den Server nicht warten. Darüber hinaus ist es billig.
Wenn Sie die Bibliothek jedoch mit Python von AWS Lambda verwenden möchten, müssen Sie [Bereitstellungspaket erstellen] angeben (https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-package.html). nicht. Wenn Sie eine Bibliothek verwenden, für die eine Kompilierung erforderlich ist, z. B. Numpy, benötigen Sie außerdem eine Amazon Linux-Umgebung, was problematisch ist.
AWS Cloud9 kann als Entwicklungsumgebung verwendet werden, indem ein Server auf EC2 eingerichtet und über den Browser Ihres PCs darauf zugegriffen wird. Es mag gut sein, Amazon Linux mit Docker auszuführen, aber es ist einfacher, es in der Cloud einzurichten. Wenn Sie es eine Weile nicht verwendet haben, wird die EC2-Instanz anscheinend ohne Erlaubnis angehalten, was Ihrer Brieftasche schont.
Erstellen Sie eine neue Umgebung über das AWS Cloud9-Menü. Es gibt nichts, worüber Sie vorsichtig sein müssen, aber im Moment können Sie nur zwischen Amazon Linux oder Ubuntu Server 18.04 LTS wählen. Lambdas Umgebung wird zu Amazon Linux 2, aber es kann nicht geholfen werden. Diesmal habe ich mich für Amazon Linux entschieden.
Grundsätzlich gemäß [Dokumentation] einrichten (https://docs.aws.amazon.com/cloud9/latest/user-guide/lambda-functions.html). Klicken Sie beim Start von Cloud9 ganz rechts auf die Registerkarte "AWS-Ressourcen", um das Lambda-Menü anzuzeigen. Wenn Sie auf die Schaltfläche "Neue Lambda-Funktion erstellen" klicken, wird ein Assistent mit dem Namen "Serverlose Anwendung erstellen" angezeigt. Dieses Mal werde ich es mit dem Namen envtest machen. Leider war Python 3.6 das einzige Python, das als Laufzeit ausgewählt werden konnte.
Wenn der Assistent beendet ist, sollten Sie einen Ordner namens envtest haben.
Bevor wir den Code schreiben, installieren wir die erforderlichen Bibliotheken. envtest/venv/ Hat eine virtuelle Python-Umgebung. Über die Cloud9 IDE-Konsole
source ./envtest/venv/bin/activate
Nach der Aktivierung durch Eingabe installiert pip immer mehr erforderliche Bibliotheken. AWS Lambda hat ein Limit von 250 MB für die Bereitstellung der Paketgröße einschließlich Bibliotheken. Installieren Sie nur das erforderliche Minimum. Diesmal Numpy, Matplotlib, Pandas, Seaborn, Pillow, boto3 Ich habe es installiert, aber es war okay (nur knapp).
envtest/envtest/lambda_function.py Ich werde die Lambda-Funktion in schreiben.
Um den Trend der Anzahl der mit Corona-Viren infizierten Personen in Tokio zu erfassen, lesen wir diesmal den täglichen CSV der Anzahl der infizierten Personen in Tokio, zeichnen den Tageswert und den gleitenden 7-Tage-Durchschnitt auf und laden ihn in S3 hoch. tat. Ich habe eine Bitmap mit 320 x 240 Pixel, wie in Adafruits Pyportal gezeigt.
2020-9-5 So sieht es jetzt aus.
Klicken Sie hier, um die neuesten Informationen zu erhalten
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
#Erfassung von Details zur Ankündigung neuer Coronavirus-positiver Patienten
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['Veröffentlicht_Datum'].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)
Mit nur dieser einen Zeile wird die CSV von der URL heruntergeladen und zu Pandas.DataFrame gemacht. groß.
df['date'] = df['Veröffentlicht_Datum'].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()
Um die spätere Handhabung zu vereinfachen, erstellen Sie eine DateTime-Objektspalte aus der Spalte, die das Datum als Zeichenfolge enthält, und definieren Sie sie als indizierten DataFrame neu. Berechnen Sie außerdem den gleitenden 7-Tage-Durchschnitt, um eine neue Spalte zu erstellen.
fig, ax = plt.subplots(figsize=(width,height), dpi=ppi)
ax.plot(df['date'], color='g', label="Daily")
ax.plot(df['ma7'], 'r', label="ma7")
Grafikzeichnung mit Matplotlib. Ich möchte es am Ende 320x240pixel machen, also stelle die dpi entsprechend ein und stelle die Breite und Höhe ein.
pic_IObytes = io.BytesIO()
plt.savefig(pic_IObytes, format='png')
pic_IObytes.seek(0)
Speichern Sie das Diagramm im PNG-Format im Speicher. Pyportal kann nur das Bitmap-Format lesen, daher wollte ich es als Bitmap speichern. Das von mir verwendete Backend von matplotlib unterstützte das Speichern im BMP-Format jedoch nicht.
im = Image.open(pic_IObytes)
pic_IObytes_bmp = io.BytesIO()
im.save(pic_IObytes_bmp, format='bmp')
pic_IObytes_bmp.seek(0)
Da es keine Hilfe dafür gibt, öffnen Sie es nach dem Speichern als PNG-Format mit Pillow und speichern Sie es erneut als BMP-Format.
s3_client.upload_fileobj(pic_IObytes_bmp, "pyportal", "covid19_tokyo.bmp", ExtraArgs={'ACL': 'public-read'})
In S3 hochladen und veröffentlichen.
Das Debuggen von Lambda-Funktionen ist normalerweise umständlich. Einfache Dinge, die nur Standardfunktionen verwenden, können weiterhin mit der IDE auf dem AWS Lambda-Verwaltungsbildschirm verwendet werden. Wenn Sie jedoch diesmal viele externe Bibliotheken verwenden, können Sie dies auch nicht tun.
Das Debuggen mit der Cloud 9-IDE ist jedoch einfach. Sie können den Debugger auch verwenden, indem Sie Haltepunkte festlegen. Vielen Dank.
Debuggen Sie mit "Lokal ausführen" und stellen Sie es bei Erfolg bereit. Klicken Sie einfach im Lambda-Menü der Cloud9 IDE auf die Schaltfläche "Bereitgestellte Lambda-Funktion bereitstellen". Die Umgebung wird komprimiert und auf AWS Lambda hochgeladen.
Da wir dieses Mal am Ende auf S3 hochladen, müssen wir die Amazon S3FullAccess-Richtlinie für die Rolle dieser Funktion im AWS Lambda-Verwaltungsbildschirm festlegen.
Wenn alles gut geht, legen Sie EventBridge (CloudWatch Events) als Auslöser fest und legen Sie die Rate (1 Tag) fest, um den Vorgang abzuschließen.
Die Cloud9-IDE ist auch nicht schlecht, aber manchmal möchte ich viel mit dem Jupyter-Notebook machen. Starten Sie daher Jupyter Notebook auf dem Server von Clould9, damit Sie mit Jupyter Notebook über den Browser Ihres PCs oder Smartphones entwickeln können.
Wenn Sie die Umgebung für das Experimentieren mit dem Jupyter Notebook vorbereiten, wird Ihnen wahrscheinlich das EBS-Volumen ausgehen. Machen Sie es gemäß der Dokumentation größer. Ich habe es bei 20 GiB gehalten.
Resize an Amazon EBS volume used by an environment
Richten Sie über die Cloud9 IDE-Konsole miniconda ein und richten Sie Ihre bevorzugte Python-Umgebung ein.
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
Danach können Sie mit conda eine Umgebung erstellen, wie Sie möchten.
jupyter notebook --ip=0.0.0.0
Geben Sie beim Start 0.0.0.0 für die IP an, damit von außen darauf zugegriffen werden kann. Die Sicherheit ist robust, also legen Sie mindestens ein Passwort fest.
Klicken Sie im AWS Cloud9-Verwaltungsbildschirm im Element EC2-Instanz auf "Zur Instanz wechseln", um den Verwaltungsbildschirm des von Ihnen verwendeten EC2 anzuzeigen. Sie können auf Jupyter Notebook zugreifen, indem Sie die URL in "Public DNS (IPv4)" in die Zwischenablage kopieren und mit einem Browser mit ": 8888" und der am Ende angegebenen Portnummer darauf zugreifen. So was.
http://ec2-xx-xxx-xx-xx.ap-northeast-1.compute.amazonaws.com:8888/
Recommended Posts