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.
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.
Aus der Geschichte der verwendeten Technologie. Der Zweck dieser Zeit ist wie folgt.
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.
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.
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.
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.
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.
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.
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
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