Sie können die Daten hier ablegen. https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068/resource/c2d997db-1450-43fa-8037-ebb11ec28d4c Obwohl es im CSV-Format vorliegt und es viele Spalten gibt, die nichts enthalten, denke ich, dass die Daten sauber und einfach zu handhaben sind. Zum Zeitpunkt des Schreibens scheint es Daten bis zu 7/9 zu geben.
Dieses Mal habe ich eine Analyseumgebung für Jupyter erstellt, die mit Docker eingerichtet wurde. Es ist durchaus angemessen, aber bitte beachten Sie, dass ich nur das wiederverwendete, was ich anderswo verwendet habe (ich benötige nicht so viel).
FROM python:3.8.2
USER root
EXPOSE 9999
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
RUN apt-get update && apt-get -y install locales default-mysql-client && \
localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm
ADD ./requirements_python.txt /code
RUN pip install --upgrade pip
RUN pip install -r /code/requirements_python.txt
WORKDIR /root
RUN jupyter notebook --generate-config
RUN echo c.NotebookApp.port = 9999 >> ~/.jupyter/jupyter_notebook_config.py
RUN echo c.NotebookApp.token = \'jupyter\' >> ~/.jupyter/jupyter_notebook_config.py
CMD jupyter lab --no-browser --ip=0.0.0.0 --allow-root
requirement_python.txt
glob2
json5
jupyterlab
numpy
pandas
pyOpenSSL
scikit-learn
scipy
setuptools
tqdm
urllib3
matplotlib
xlrd
Von hier aus werden wir die Implementierung beschreiben.
Laden Sie zunächst die erforderlichen Pakete und Dateien. Diesmal benutze ich nur Matplotlib und Pandas. Ändern Sie das Veröffentlichungsdatum zu diesem Zeitpunkt in den Datums- / Uhrzeittyp.
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
%matplotlib inline
df_patient = pd.read_csv('./data/130001_tokyo_covid19_patients.csv')
df_patient['Veröffentlicht_Datum'] = pd.to_datetime(df_patient['Veröffentlicht_Datum'])
df_patient.head()
Für diese Datenverarbeitung werden wir wie folgt vorgehen.
Dies ist bei Gruppen von nicht so schwierig. Lassen Sie zu diesem Zeitpunkt auch nur die erforderlichen Spalten.
df_patient_day = df_patient.groupby(['Veröffentlicht_Datum','geduldig_Alter']).count().reset_index()[['Veröffentlicht_Datum','geduldig_Alter','No']]
df_patient_day
Wenn die Beschreibung des Alters Japanisch enthält, werden die Zeichen im Teil von matplotlib verstümmelt (es ist schwierig, die Umgebung wie oben beschrieben wiederzuverwenden). Ersetzen Sie sie daher wie folgt.
genes_dict = {'Unter 10 Jahren':'under 10',\
'10er': '10', \
'20er Jahre': '20', \
'30er Jahre': '30', \
'Vierziger Jahre': '40', \
'50er Jahre': '50', \
'60er Jahre': '60', \
'70er Jahre': '70', \
'80er Jahre': '80', \
'90er Jahre': '90', \
'100 Jahre und älter': 'over 100', \
"'-": '-',
'Unbekannt': 'unknown'
}
df_patient_day['geduldig_Alter'] = [genes_dict[x] for x in df_patient_day['geduldig_Alter'].values.tolist()]
df_patient_day
Im obigen Fall liegt ein Problem vor, und wenn die Anzahl der neu infizierten Personen an diesem Tag und in diesem Alter nicht vorhanden ist, gibt es keine Daten, und es tritt ein Problem auf, wenn später ein gleitender Durchschnitt ermittelt wird. Daher liegen diese Daten hier im Bereich des oben genannten Alters × Erstellen Sie ein direktes Produkt des gesamten Datumsbereichs und kombinieren Sie es mit dem oben genannten DataFrame (bitte lassen Sie mich wissen, wenn Sie hier einen besseren Weg kennen!).
genes = ['under 10',\
'10', \
'20', \
'30', \
'40', \
'50', \
'60', \
'70', \
'80', \
'90', \
'over 100', \
'-',
'unknown'
]
days = pd.date_range(start=df_patient['Veröffentlicht_Datum'].min(), end=df_patient['Veröffentlicht_Datum'].max(), freq='D')
data = [[x, y] for x in days for y in genes]
df_data = pd.DataFrame(data, columns=['Veröffentlicht_Datum', 'geduldig_Alter'])
df_data = pd.merge(df_data, df_patient_day, on=['Veröffentlicht_Datum', 'geduldig_Alter'], how='left').fillna(0)
df_data = df_data.rename(columns={'No':'Anzahl der Personen'})
df_data
Nehmen Sie einen gleitenden Durchschnitt für jede Altersgruppe. Mit der Funktion von Pandas können Sie leicht einen gleitenden Durchschnitt ermitteln. Für einen gleitenden 7-Tage-Durchschnitt rollen Sie einfach (7). Wenn Sie den Durchschnitt nehmen möchten, rollen Sie (7) .mean (). Und da die ersten 6 Tage nan sein werden, löschen Sie es mit dropna (). Dieses Mal werde ich es für eine spätere Implementierung zu einem DataFrame für jedes Alter machen und es im Wörterbuch speichern. Dies ist abgeschlossen!
result_diff = {}
for x in genes:
df = df_data[df_data['geduldig_Alter'] == x]
df = pd.Series(df['Anzahl der Personen'].values.tolist(), index=df['Veröffentlicht_Datum'].values)
result_diff[x] = df.rolling(7).mean().dropna()
Zum Schluss visualisieren.
fig, axe = plt.subplots()
for x in genes:
df_diff = result_diff[x]
axe.plot(df_diff.index, df_diff.values, label=x)
axe.legend()
axe.set_ylim([0,65])
Zum Schluss werde ich das Ergebnis anzeigen.
Von den 20er bis 50er Jahren wurde bestätigt, dass sich das Alter in der Reihenfolge des jüngeren Alters geändert hat. Trotzdem ist es erstaunlich, wie man die Anzahl der Menschen in den Zwanzigern erhöht. Die Ankündigung von Tokio war keine Lüge.
Ich möchte nicht sagen, was die Faktoren hier sind, aber Sie können den Inhalt des Berichts schnell mit öffentlichen Daten wie diesen überprüfen. Warum versuchen Sie es nicht auch als Übung? Es gibt noch viele Dinge, die untersucht werden können, indem man dies mit der tatsächlichen Bevölkerungsverteilung vergleicht, und ich denke, es ist ein gutes Lehrmaterial, um die Datenverarbeitung tatsächlich zu üben.
Recommended Posts