[PYTHON] Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet

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.

Was wurde gemacht

[New Metropolitan Corona Virus Control Site für Tokio-Metropolen] 1 Daten werden erfasst, organisiert, geplottet und an Slack gesendet. c19bot.PNG

Umgebung

Es ist notwendig, das Token von Slackbot im Voraus vorzubereiten, aber in diesem Artikel wird die Methode zur Ausgabe des Tokens weggelassen.

Wie poste ich?

Überblick

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.

Datenerfassung

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

Grafikzeichnung (Pandas, Matplotlib)

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.

Letzte positive Zählung

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

Veröffentlichen Sie die neueste Anzahl von Positiven (Slackbot)

Es ist die Verarbeitung von post.post_message (txt). c19bot_u.PNG

↑ 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".

Grafikbeitrag

Dies ist der Prozess von post.upload_figure (" "," "). c19bot_b.PNG

↑ 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.

Jeden Tag automatisch posten (crontab)

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

Zusammenfassung

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

Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet
Erstellen Sie einen BOT, der die Anzahl der infizierten Personen in der neuen Corona anzeigt
Veröffentlichte die Anzahl der neuen Corona-Positiven in Tokio an Slack (auf Heroku bereitgestellt)
Suchen Sie eine Richtlinie für die Anzahl der Prozesse / Threads, die auf dem Anwendungsserver festgelegt werden sollen
[Python] Programmieren, um die Nummer von a in einer Zeichenfolge zu finden, die eine bestimmte Anzahl von Malen wiederholt.
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
Die Geschichte des Erstellens eines Bots, der aktive Mitglieder in einem bestimmten Slack-Kanal mit Python anzeigt
Ich habe versucht, die Exponentialfunktion und die Logistikfunktion an die Anzahl der COVID-19-positiven Patienten in Tokio anzupassen
Erstellen Sie einen Bot, um Corona-Virus-Informationen zu retweeten
Hat die Anzahl der Ladenschließungen aufgrund des Einflusses des neuen Koronavirus zugenommen?
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
Die Geschichte, wie ein Geschäft BOT (AI LINE BOT) nach Go To EAT in der Präfektur Chiba durchsucht (1)
Eine Geschichte über das Erstellen eines Programms, mit dem die Anzahl der Instagram-Follower in einer Woche von 0 auf 700 erhöht wird
[Python] Erstellen Sie ein Skript, das FeedParser und LINE Notify verwendet, um LINE über die neuesten Informationen zum neuen Koronavirus des Ministeriums für Gesundheit, Arbeit und Soziales zu informieren.
Wie man eine Benutzergruppe mit Slack-Benachrichtigung erwähnt, wie man die ID einer Benutzergruppe überprüft
Die Geschichte der Erstellung von Botonyan, das den Inhalt von Google Text & Tabellen als Antwort auf ein bestimmtes Keyword in Slack zurückgibt
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Die Geschichte, wie ein Geschäft BOT (AI LINE BOT) nach Go To EAT in der Präfektur Chiba durchsucht (2) [Übersicht]
Finden Sie die Anzahl der Tage in einem Monat
Ich habe versucht, die Anzahl der mit dem Coronavirus infizierten Menschen in Japan nach der Methode des neuesten Papiers in China vorherzusagen
Ich habe versucht, die Anzahl der mit dem Coronavirus infizierten Personen unter Berücksichtigung der Auswirkung des Verzichts auf das Ausgehen vorherzusagen
Ein Python-Skript, das die Anzahl der Jobs für eine bestimmte Bedingung von Indeed.com abruft
[Python] Ein Programm, das die kürzeste Anzahl von Schritten in einem Spiel findet, das Wolken überquert
Eine Geschichte von Versuch und Irrtum beim Versuch, eine dynamische Benutzergruppe in Slack zu erstellen
Die Theorie, dass der Schlüssel zur Kontrolle der Infektion des neuen Coronavirus die Hyperdispersion der Anfälligkeit ist.
Ich habe versucht, die neuen mit dem Corona-Virus infizierten Menschen in Ichikawa City, Präfektur Chiba, zusammenzufassen
Lassen Sie uns eine Rangfolge der Anzahl der wirksamen Reproduktionen des neuen Koronavirus nach Präfektur erstellen
Fügen Sie eine Funktion hinzu, um dem Wetter heute mitzuteilen, dass der Bot locker ist (hergestellt von Python).
Erstellen Sie einen Datensatz mit Bildern, die für das Training verwendet werden sollen
[Python] Ein Programm, das die Anzahl der Täler zählt
So ermitteln Sie die Anzahl der Stellen in Python
Erstellen Sie einen Slack Bot
Verwenden Sie Hash, um das Kollisionsurteil von etwa 1000 Bällen in Python zu erleichtern (im Zusammenhang mit dem neuen Corona-Virus).
Erstellen Sie mit MeCab mit Discord einen Bot, der nur das Ergebnis der morphologischen Analyse zurückgibt
Ich habe versucht, die Anzahl der Todesfälle pro Kopf von COVID-19 (neues Koronavirus) nach Ländern zu tabellieren
So erstellen Sie eine Instanz einer bestimmten Klasse aus dict mit __new__ () in Python
[Abgeschlossen] Bot, der eine Benachrichtigung über den Start der Live-Übertragung von Nico Nico an Discord auf discord.py sendet
Ich habe versucht, den Trend der Anzahl der Schiffe in der Bucht von Tokio anhand von Satellitenbildern zu ermitteln.
[Konzept] Bot, der eine Benachrichtigung über den Beginn der Live-Live-Übertragung von Nico Nico an Discord auf discord.py sendet
[Python] Ein Programm, um die Anzahl der Äpfel und Orangen zu ermitteln, die geerntet werden können
Holen Sie sich die Anzahl der spezifischen Elemente in der Python-Liste
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Stellen wir uns die Anzahl der mit Matplotlib mit dem Coronavirus infizierten Personen vor
Ermitteln Sie die Anzahl der Vorkommen für jedes Element in der Liste
Erstellen Sie eine neue Liste, indem Sie doppelte Elemente in der Liste kombinieren
Ich habe versucht, einen Bot für die Ankündigung eines Wiire-Ereignisses zu erstellen
Ich möchte vorerst eine Docker-Datei erstellen.
Eine Geschichte, die bestätigte, ob die Zahl der Coronas bei jungen Menschen wirklich schnell zunimmt
Schlafverarbeitung für einen bestimmten Zeitraum (Sekunden) oder länger in Python
Hypothese, warum das neue Koronavirus in städtischen Gebieten wie Tokio nicht so häufig vorkommt
Eine kleine süchtig machende Geschichte mit den Berechtigungen des von expdp angegebenen Verzeichnisses (für Anfänger)
[Google Photo & Slack Photo Bot] Eine Geschichte über das Erstellen eines Bots, der ein Foto in Google Photo erfasst und an Slack sendet.
Rasppie? Was ist das? Hardware-Level Unerfahrene College-Studenten haben ein System entwickelt, mit dem sie erfassen können, ob sich Personen im Büro befinden
So bestimmen Sie die Existenz eines Selenelements in Python