Die Stadtregierung von Tokio veröffentlicht täglich in Tokio die Anzahl der Personen, die positiv für das neue Koronavirus (COVID-19) sind. Ich wollte diese Daten automatisch an Slack senden, also habe ich den Quellcode erstellt.
[New Metropolitan Corona Virus Control Site für Tokio-Metropolen] 1 Daten werden erfasst, organisiert, geplottet und an Slack gesendet.
Es ist notwendig, das Token von Slackbot im Voraus vorzubereiten, aber in diesem Artikel wird die Methode zur Ausgabe des Tokens weggelassen.
Ich habe bot implementiert, um Inhalte in Slack zu posten, indem ich "python3 run.py" ausgeführt habe.
Der Inhalt von run.py
ist wie folgt.
import plot
import post
def main():
df = plot.fetch_csv() #Datenerfassung
plot.plot_hist(df) #Diagrammzeichnung
txt = plot.info_str(df) #Letzte positive Zählung
post.post_message(txt) #Veröffentlichen Sie die letzte Anzahl von Positiven
post.upload_figure("", "") #Postgraph
if __name__ == "__main__":
main()
Ich habe "post.py" und "plot.py" im selben Verzeichnis wie "run.py" vorbereitet.
Dies ist der Prozess von plot.fetch_csv ()
.
[Öffentliche Daten von Tokio] 2 wurden erfasst.
import requests
import pandas as pd
URL = "https://stopcovid19.metro.tokyo.lg.jp/"
def fetch_csv():
r = requests.get(URL+"data/130001_tokyo_covid19_patients.csv")
df = pd.read_csv(io.BytesIO(r.content),sep=",")
return df
Dies ist der Prozess von plot.plot_hist (df)
.
Zeichnen Sie anhand der erfassten Daten ein Histogramm mit Pandas.
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
PNG = "hist"
def plot_hist(df):
#Extrahieren Sie nur Datumsspalten mit dem Zeitstempel
df = pd.to_datetime(df.loc[:, "Veröffentlicht_Datum"])
# bins(Gesamtzahl der Tage)Berechnung
num_bins = calc_num_days(df)
#Auf und ab geteilt
fig, axes = plt.subplots(nrows=2, ncols=1, sharex=True)
df.hist(ax=axes[0], bins=num_bins)
axes[0].set_title("Tagsüber", fontproperties=FP)
df.hist(ax=axes[1], bins=num_bins, cumulative=True)
plt.title("Akkumulation", fontproperties=FP)
plt.suptitle("Tokio COVID-19 Anzahl der Positiven(Datenquelle"+URL+")", fontproperties=FP)
#Stellen Sie die Schrittgröße der x-Achse auf 1 Woche ein
plt.gca().get_xaxis().set_major_formatter(mdates.DateFormatter("%y/%m/%d"))
plt.gca().get_xaxis().set_major_locator(mdates.DayLocator(interval=7))
plt.xticks(rotation=90) #Drehen Sie die Beschriftung der x-Achse um 90 Grad
plt.savefig(PNG, bbox_inches="tight")
calc_num_days (df)
wird verwendet, um die Bins des Histogramms zu berechnen.
In den erfassten Daten (csv) sind die ersten Zeilen ohne die Kopfzeile die Patientendaten an dem Tag, an dem die Anzahl der Positiven zum ersten Mal bestätigt wurde, und die letzte Zeile sind die neuesten Patientendaten.
def calc_num_days(df):
s = df.iloc[0] #1. Reihe, 1. Spalte
e = df.iloc[-1] #Erste Spalte der letzten Zeile
delta_days = e - s
return delta_days.days + 1
Da für den Titel des Diagramms japanische Schrift verwendet wird, wird "fontproperties" wie "plt.title (" kumulativ ", fontproperties = FP)" angegeben.
FONT_TTF = "/home/[Nutzername]/.local/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf/ipaexg.ttf"
FP = FontProperties(fname=FONT_TTF)
Abhängig von der Umgebung können Sie japanische Schriftarten verwenden, ohne die Schriftarteneigenschaften anzugeben.
Übrigens wollte ich ursprünglich mit einem Balkendiagramm anstelle eines Histogramms zeichnen, aber es hat nicht funktioniert. Der Punkt, der nicht funktionierte, war, dass die horizontale Achse anstelle der Zeitachse als Beschriftung behandelt wurde und der Tag, an dem die Anzahl der Positiven 0 war, nicht gut gezeichnet werden konnte. Ich dachte, es wäre besser, ein Etikett für den Tag zu erstellen, an dem die Anzahl der positiven Personen 0 war, aber ich dachte, es wäre einfacher, es als Histogramm zu zeichnen, also zeichnete ich es mit einem Histogramm. Ich wäre Ihnen dankbar, wenn Sie mir sagen könnten, ob es einen intelligenteren Weg gibt.
Es ist ein Prozess mit plot.info_str (df)
.
Ich erstelle den Text, den ich aus den Daten an Slack senden möchte.
def info_str(df):
#Extrahieren Sie nur Datumsspalten
df = df.loc[:, "Veröffentlicht_Datum"]
today = df.iloc[-1] #Erste Spalte der letzten Zeile
# index:Datum, colums:Anzahl der Personen
df = df.value_counts().sort_index()
num_y = int(df.iloc[-2]) # yesterday
num_t = int(df.iloc[-1]) # today
txt = today+"Positive Person zu der Zeit:"+str(num_t)+"Mann\n" \
+"(Im Vergleich zu gestern:"+str(num_t - num_y)+"Mann,Gesamt"+str(df.sum())+"Mann)\n" \
+ URL
return txt
Es ist die Verarbeitung von post.post_message (txt)
.
↑ Ich werde dies auf Slack posten.
Verwenden Sie das Slackbot-Modul und die Slack-API von Python.
import json
import requests
SLACK_API = "https://slack.com/api/"
TITLE = "COVID-19 Anzahl positiver Menschen in Tokio"
def post_message(txt, title=TITLE):
API_METHOD = "chat.postMessage"
response = requests.post(SLACK_API + API_METHOD, data={
"token": SLACK_TOKEN,
"channel": SLACK_CHANNEL,
"username": USER_NAME,
"as_user": True,
"attachments": json.dumps([
{
"fallback": title,
"color": "#00FFFF",
"title": title,
"text": txt,
}
])
}).json()
Beschreibe das Token von Slackbot in SLACK_TOKEN
.
Beschreiben Sie den Kanalnamen (" # hogehuga "
) in SLACK_CHANNEL
.
Beschreiben Sie den Benutzernamen des Bots in "USER_NAME".
Dies ist der Prozess von post.upload_figure (" "," ")
.
↑ Ich werde dieses Bild auf Slack posten.
PNG = "hist"
PNG_FILE = PNG+".png "
def upload_figure(txt, title=TITLE):
files = {"file": open(PNG_FILE, "rb")}
param = {
"token": SLACK_TOKEN,
"channels": CHANNEL_ID,
"filename": PNG_FILE,
"initial_comment": title+"\n"+txt,
"title": title
}
requests.post(url=SLACK_API+"files.upload", params=param, files=files)
CHANNEL_ID
entspricht der Zeichenfolge am Ende der Kanal-URL. Es ist kein Kanalname.
Wenn das Terminal (Server) immer ausgeführt wird, können Sie mithilfe von crontab regelmäßig Befehle ausführen. Wenn Sie beispielsweise jeden Tag automatisch um 15:05 Uhr posten möchten, öffnen Sie den Editor mit "crontab -e" und schreiben Sie Folgendes.
05 15 * * * cd [Verzeichnis mit Quellcode]; python3 run.py >run.log
Wir haben die Anzahl der Positiven für das neue Corona-Virus in Tokio erfasst und einen Bot erstellt, der auf Slack veröffentlicht werden kann.
In Bezug auf zukünftige Probleme möchte ich automatisch benachrichtigen können, wenn [Tokio-Daten] 2 aktualisiert werden. Wenn Sie eine gute Methode finden, würde ich sie gerne ausprobieren.
Recommended Posts