[PYTHON] Die epidemische Vorhersage des neuen Koronavirus wurde mit explosiver Geschwindigkeit im Internet veröffentlicht

Dieser Artikel hat auch die Form Artikel im offiziellen Blog von Yotsuya Lab veröffentlicht.

Wenn Sie möchten, lesen Sie bitte auch den Blog von Yotani Lab.

Zuvor gab es einen Artikel von Herrn Yamashin. Es ist ein sehr interessanter Artikel, der die Parameter für die Erstellung des SEIR-Modells aus dem aktuellen Übergang der Anzahl infizierter Personen schätzt und die Anzahl der Fälle in der Zukunft vorhersagt.

Schätzen Sie die Anzahl der mit dem neuen Koronavirus infizierten Personen mithilfe eines mathematischen Modells

Hintergrund

Während ich diesen Artikel las, dachte ich "Oh, es ist erstaunlich. Ich wünschte, jeder könnte es sehen, wenn er möchte" und dachte ernsthaft darüber nach, es im WEB zu veröffentlichen. Das Skript zur Vorhersage ist in Python geschrieben. Ich musste Python auf meinem PC einrichten, um die Bilder zu sehen. Außerdem muss ich eine Bibliothek einrichten und eine Umgebung für die Python3-Serie vorbereiten ... Oh, das ist ärgerlich! !! !! Es ist ein Geheimnis, das wurde.

Als Ergebnis habe ich es geschafft. Klicken Sie hier für die öffentlich zugänglichen Dienste. Von der folgenden URL. Vorhersage einer neuen COVID-19-Infektion mit dem Koronavirus

Um das Skript auszuführen und die neuesten Daten abzurufen, muss die Quell-CSV jedes Mal von Kaggle heruntergeladen werden. Außerdem ist das Update-Timing unterschiedlich, sodass es ziemlich schwierig ist, es einmal am Tag zu sehen. Ich habe das Skript jedes Mal ausgeführt, wenn ich es bekommen habe.

Eigentlich, Herr Yamashin, habe ich auch jeden Tag das Bild des Blog-Artikels ersetzt. Wusstest du schon ...?

Ich wollte auch die neuesten Daten sehen, aber es war mühsam, die Umgebung zu erstellen. (Ingenieure sind nervige Brocken. Sie sind Dämonen. Ich denke nur an nervige Dinge. Zuerst richten wir eine Docker-Umgebung ein, um dieses Skript auszuführen. Ob Heim-PC oder Firmen-PC ...

Um zu sehen, stellte ich über einen Pendelzug eine SSH-Verbindung zu meinem VPS her und traf Befehle. Aber wie erwartet werde ich müde oder verärgert ...

Aus diesem Grund haben wir die Corona Virus Epidemic Prediction veröffentlicht, die jeder im Web sehen kann!

Dieses Mal möchte ich darüber sprechen, was ich über die Veröffentlichung und Implementierung gedacht habe.

Technologieauswahl

Aus der Geschichte der verwendeten Technologie. Der Zweck dieser Zeit ist wie folgt.

  1. Holen Sie sich regelmäßig die neuesten Daten
  2. Ich möchte automatisch ein Berechnungsskript ausführen
  3. Ich möchte eine Umgebung, die jederzeit durch Anzeigen von Grafiken oder Verteilen von Bildern im Web angezeigt werden kann.

Um diese Anforderungen zu erfüllen, haben wir uns entschlossen, sie einzeln zu löschen.

Das Repository ist hier für die Öffentlichkeit zugänglich.

https://github.com/428lab/new_coronavirus_infection

Da ich Python benutze, ist es Django oder Flask sowie die Serverseite, oder? Ich dachte du da! !! Das ist eine gute Entscheidung! Ich wollte es auch benutzen. Aber diesmal ist es anders! !!

Python-Skripte funktionieren nicht so gut wie ich erwartet hatte. Nein, ich habe meinen Hauptjob gemacht. Die Aufgabe besteht darin, die JSON-Folie der Verifizierungsdaten auszugeben. Um dieses System aufzubauen, wie lautet dann die Reihenfolge der automatischen Verteilung und wie erreichen wir dies?

Ich werde Schritt für Schritt erklären.

  1. Verwenden Sie die Docker-Umgebung, um die Entwicklungsumgebung zu vereinheitlichen
  2. Klicken Sie auf Kaggles API, um den neuesten Covid-19.CSV (Bash) zu erhalten.
  3. Legen Sie den Ländernamen und die Bevölkerung jedes Landes fest (Python)
  4. Geben Sie eine JSON-Datei aus, die so formatiert ist, dass sie im Web einfach zu verwenden ist (Python).
  5. Lesen Sie die JSON-Datei und zeigen Sie sie in Chart.js an. (Nuxt)
  6. In das öffentliche Verzeichnis des Servers hochladen (Bash)
  7. Arbeitsersparnis bei den Kosten und der Automatisierung des Serverbetriebs (Ausführen von Cron mit VPS)

In Anbetracht der Wartungskosten werden die Funktionen durch jeden Faktor geteilt. Es ist nicht sehr gelobt, da es hergestellt wird, und obwohl es in einigen Teilen ziemlich belastend sein kann, wählen wir aktiv die Technologie aus, an die die beteiligten Personen gewöhnt sind, um die Offenlegung zu priorisieren.

Gründe für die Auswahl der einzelnen Technologien

Ich möchte ein wenig über die Gründe für die Auswahl der Technologie sprechen. Es war ein System, das so aufgebaut war, dass es nicht durch das Festlegen mehrerer Sprachen und Umgebungen gebunden wurde. Ich denke, dass die Güte, sich bei der Entwicklung eines so kleinen Produkts umzudrehen, auch als Material für Projekte verwendet werden kann.

Docker verwenden

Ich habe diesmal Docker verwendet, weil ich die Entwicklungsumgebung jedes Einzelnen so weit wie möglich vereinheitlichen wollte. Der neulich veröffentlichte Artikel ist Python, kann jedoch je nach Entwicklungsumgebung mit Python-Befehlen ausgeführt werden oder existiert gleichzeitig mit Python 3. Darüber hinaus ist es schwierig, für jedes Projekt wie Node.js eine Bibliothek auszuwählen und zu erstellen, und es ist auch erforderlich, Pyenv zu erstellen.

Ich habe mich jedoch für Docker entschieden, weil es diese umgebungsabhängigen Probleme lösen und eine Situation schaffen kann, in der meine persönliche Entwicklungsumgebung nicht verschmutzt ist. Übrigens verwende ich Docker-compose unter der Annahme, dass die Wartung einfacher ist und die Anzahl der Container zunimmt.

Ausgabe in JSON-Datei

Was den Python-Code betrifft, wurde Herr Yamashin bereits im vorherigen Artikel erwähnt, daher werde ich die Erklärung hier weglassen. Als ich über diese Datenausgabe nachdachte, dachte ich darüber nach, wie die Daten effizient an das WEB übergeben werden können. Wenn Sie so viel wie möglich an die Daten ausgeben, kann die WEB-Seite die Entscheidung überlassen, ob sie verwendet werden sollen oder nicht. Dieses Mal haben wir in Bezug auf die Datenskala die tatsächlichen und vorhergesagten Werte nach Ländern gruppiert und gleichzeitig die Aufzeichnung ermöglicht, wobei die Zeit zum Zeitpunkt der Ausgabe belassen wurde. Da die numerischen Werte der Ausgabedaten das Array verwenden, das zum Zeitpunkt der Graphenerstellung so wie es ist eingefügt wird, ist die Implementierung selbst sehr einfach.

    def plot_bar(self, ax):
        width = 0.5
        #Initialisierung vom Typ Wörterbuch
        self.graph["fact"] = dict()
        self.graph["fact"]["infected"] = dict()
        self.graph["fact"]["recovered"] = dict()
        self.graph["fact"]["deaths"] = dict()

        for day, infected, recovered, deaths in zip(self.timestamp, self.infected, self.recovered, self.deaths ):
            bottom = 0
            ax.bar(day, infected, width, bottom, color='red', label='Infectious')
            #Zu den Ausgabedaten des Diagramms hinzugefügt
            self.graph["fact"]["infected"][day.strftime("%Y/%m/%d")] = infected
            bottom += infected
            ax.bar(day, recovered, width, bottom, color='blue', label='Recovered')
            #Zu den Ausgabedaten des Diagramms hinzugefügt
            self.graph["fact"]["recovered"][day.strftime("%Y/%m/%d")] = recovered
            bottom += recovered
            ax.bar(day, deaths, width, bottom, color='black', label='Deaths')
            #Zu den Ausgabedaten des Diagramms hinzugefügt
            self.graph["fact"]["deaths"][day.strftime("%Y/%m/%d")] = deaths
            bottom += deaths

        ax.set_ylabel('Confirmed infections',fontsize=20)
        handler, label = ax.get_legend_handles_labels()
        ax.legend(handler[0:3] , label[0:3], loc="upper left", borderaxespad=0. , fontsize=20)

        return 

    def plot_estimation(self, ax, estimatedParams):
        day = self.timestamp[0]
        day_list = []
        max = 0
        #Initialisierung vom Typ Wörterbuch (vorhergesagte infizierte Person)
        self.graph["estimation"] = dict()

        estimated_value_list = []
        for estimated_value in self.estimate4plot(estimatedParams.x[0])[:,2]:
            if max < estimated_value:
                max = estimated_value
                peak = (day, estimated_value)

            day_list.append(day)
            estimated_value_list.append(estimated_value)
            day += datetime.timedelta(days=1) 
            if estimated_value < 0:
                break
        ax.annotate(peak[0].strftime('%Y/%m/%d') + ' ' + str(int(peak[1])), xy = peak, size = 20, color = "black")
        ax.plot(day_list, estimated_value_list, color='red', label="Estimation infection", linewidth=3.0)

        #Wirf die Vorhersage einer infizierten Person ein
        self.graph["estimation"]["infection"] = estimated_value_list

        day = self.timestamp[0]
        day_list = []
        estimated_value_list = []
        for estimated_value in self.estimate4plot(estimatedParams.x[0])[:,3]:
            day_list.append(day)
            estimated_value_list.append(estimated_value)
            day += datetime.timedelta(days=1) 
            if estimated_value < 0:
                break
        ax.plot(day_list, estimated_value_list, color='blue', label="Estimation recovered", linewidth=3.0)

        #Drücken Sie die Wiederherstellungsvorhersage
        self.graph["estimation"]["recovered"] = estimated_value_list

        day = self.timestamp[0]
        day_list = []
        estimated_value_list = []
        for estimated_value in self.estimate4plot(estimatedParams.x[0])[:,4]:
            day_list.append(day)
            estimated_value_list.append(estimated_value)
            day += datetime.timedelta(days=1) 
            if estimated_value < 0:
                break
        ax.plot(day_list, estimated_value_list, color='black', label="Estimation deaths", linewidth=3.0)

        #Wirf tödliche Vorhersagen ein
        self.graph["estimation"]["deaths"] = estimated_value_list

        ax.set_ylim(0,)

        handler, label = ax.get_legend_handles_labels()
        ax.legend(handler[0:6] , label[0:6], loc="upper right", borderaxespad=0. , fontsize=20)

        return


Geben Sie danach einfach den eingetauchten Wörterbuchtyp so aus, wie er ist. Der Ausgabe-JSON wird so implementiert, dass er zuerst Daten enthält, wie unten gezeigt. Es erkennt dies als Javascript-Objekt.

{
    "fact": {
        "infected": {
            "2020/01/22": 2,
            "2020/01/23": 1,
            "2020/01/24": 1,
        },
        "recovered": {
            "2020/01/22": 0,
            "2020/01/23": 0,
            "2020/01/24": 0,
        },
        "deaths": {
            "2020/01/22": 0,
            "2020/01/23": 0,
            "2020/01/24": 0,
        }
    },
    "estimation": {
        "infection": [
            1.0,
            1.001343690430807,
            1.057149907444775,
            1.1604873710493135,
            1.3082809855652382,
            1.500433415450257,
            1.7392685227686018,
            2.0292066531306356,
        ],
        "recovered": [
            0.0,
            0.02712800489579143,
            0.05505548053170182,
            0.0851617724612349,
            0.1186923604385037,
            0.15685109117056692,
            0.20087311338956979,
            0.2520859691391483,
        ],
        "deaths": [
            0.0,
            0.0021553841476101903,
            0.004374288136297892,
            0.0067663042324873765,
            0.009430388748244232,
            0.012462190151582021,
            0.015959843930437784,
            0.02002882643985976,
        ]
    }
}

Außerdem wird das Ausgabeziel mit Datum und Uhrzeit im Sicherungsordner gespeichert und die Hauptdaten werden im Ordner "Assets" von Nuxt ausgegeben. Die Nuxt-Seite sucht nach einer Möglichkeit, dies so zu gestalten, dass Sie sich dieser Ausgabe nicht bewusst sein müssen.

Sprachauswahl auf der WEB-Vorderseite

Wie bereits erwähnt, verwende ich Nuxt.js, ein JavaScript-Framework, um diese Website zu erstellen. Es gibt mehrere Gründe, sich dafür zu entscheiden, aber wenn Vue.js so bleibt, wie es ist, muss ich dies oft auch tun, also habe ich diesmal ein wenig bestanden. Und ich habe es zu Nuxt.js geschafft.

Durch die statische Lieferung mit Nuxt werden die Zeichnungskosten auf der Benutzerseite und die Last zum Zeitpunkt des serverseitigen Renderns reduziert. Weil ich Angst vor der Abrechnung habe! !! !!

Es gibt hier keine Beschreibung der technischen Elemente, aber ich konnte nicht viel Zeit mit dem Design und Layout verbringen, deshalb habe ich Bootstrap verwendet, um es zu vereinfachen. Darüber hinaus legen wir Wert darauf, Bilder nur für freigegebene Artikel auf Facebook und Twitter zu verwenden, um einen Mechanismus zu erreichen, der so einfach wie möglich zu teilen ist.

(Tatsächlich ist der OGP-Bereich auch ziemlich gut implementiert.)

Die Faltlinien und Balkendiagramme werden nur in Farbtönen geändert, aber die gesammelten Ergebnisse und Prognosen sind so einfach wie möglich zu beurteilen. Da das Datum der X-Achse sehr fein wird, habe ich beschlossen, die Spitzen- und Maximaldaten getrennt auszugeben. Es fühlt sich immer noch flach an, also ist es ein Punkt der Verbesserung.

Führen Sie auf VPS oder Server mit Bash aus

Grundsätzlich werden alle Dateivorgänge in Bash geschrieben. Es gibt keinen Grund, warum es so schwierig ist, aber mit Bash ist es einfach, in Cron zu laufen, und Sie können Befehle wie das Generieren von Garn ausführen. Kurz gesagt, dies ist alles, was Sie tun müssen, um es freizugeben. Dieses Mal ist der Maßstab klein, und im Grunde genommen verwenden wir die Stapelverarbeitung. Daher verwenden wir dieses Verfahren von der Erfassung bis zur Ausführung der ZIP-Datei.

Es ist erwähnenswert, dass Cron nur eine automatische Ausführung trifft und die gesamte tatsächliche Ausführung im Shell-Skript erfolgt.

Der VPS-Server wird diesmal übrigens von Mixhost ausgeliehen.

https://mixhost.jp/

Derzeit verfügt Mixhost über ein System zur Unterstützung der Verteilung von Inhalten im Zusammenhang mit dem Corona-Virus. Durch die Ausleihe dieses Dienstes leihen wir auch VPS kostenlos zur Veröffentlichung aus. Mir wurde klar, dass der 6-Kern-Speicher mit einer Umgebung von 8 GB und einer SSD von 500 GB sehr gesegnet ist. Sei fett! !! !!

https://mixhost.jp/news/432

Zusammenfassung

Damit konnte ich es in zwei Tagen, nachdem ich angefangen hatte, es ernst zu machen, der Öffentlichkeit zugänglich machen. Danach habe ich detaillierte Änderungen wiederholt, aber dieses Mal habe ich eine Site erstellt, ohne das Design genau zu bestimmen, wobei der Veröffentlichung Vorrang eingeräumt wurde. Wenn Sie das Design näher erläutern oder den Code auf der Python-Seite berühren möchten, greifen Sie auf das folgende Repository zu.

https://github.com/428lab/new_coronavirus_infection

Recommended Posts

Die epidemische Vorhersage des neuen Koronavirus wurde mit explosiver Geschwindigkeit im Internet veröffentlicht
Zeichnen Sie die Ausbreitung des neuen Koronavirus
Schätzen Sie die maximale Infektiosität des neuen Coronavirus ab
Folding @ Home unter Linux Mint soll zur Analyse des neuen Corona-Virus beitragen
Fassen Sie den Titel von Hottentori in Hateb zusammen und schauen Sie sich die Gegenwart des Web an
Zum Zeitpunkt des Python-Updates mit Ubuntu
GUI-Simulation des neuen Koronavirus (SEIR-Modell)
Bis die Webanwendung mit Sakura VPS veröffentlicht wird
Tweet die dreifache Vorhersage des Bootsrennens auf Twitter
Aufgaben zu Beginn eines neuen Python-Projekts
Ich habe die Tweets über den neuen Corona-Virus analysiert, die auf Twitter veröffentlicht wurden
Erstellen Sie mit hug einen Web-API-Server mit explosiver Geschwindigkeit
Zusammenfassung des mit einer Geschwindigkeit von einer Sekunde durchgeführten Bildcrawls
Quantifizieren Sie den Grad der Selbstbeherrschung, der erforderlich ist, um das neue Koronavirus einzudämmen