Vous pouvez déposer les données ici. https://catalog.data.metro.tokyo.lg.jp/dataset/t000010d0000000068/resource/c2d997db-1450-43fa-8037-ebb11ec28d4c Bien qu'il soit au format csv et qu'il y ait de nombreuses colonnes qui ne contiennent rien, je pense que les données sont propres et faciles à manipuler. Au moment de la rédaction de cet article, il semble y avoir des données allant jusqu'à 7/9.
Cette fois, j'ai créé un environnement d'analyse sur Jupyter mis en place avec Docker. C'est tout à fait approprié, mais veuillez noter que je ne fais que réutiliser ce que j'ai utilisé ailleurs (je n'en ai pas besoin autant).
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
De là, nous décrirons l'implémentation.
Commencez par charger les packages et fichiers requis. Cette fois, je n'utilise que matplotlib et pandas. Concernant la date de publication, changez-la en type datetime à ce moment.
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['Publié_Date'] = pd.to_datetime(df_patient['Publié_Date'])
df_patient.head()
Pour ce traitement de données, nous le ferons comme suit.
Ce n'est pas si difficile avec Group by. Aussi, ne laissez que les colonnes nécessaires à ce moment.
df_patient_day = df_patient.groupby(['Publié_Date','patient_Âge']).count().reset_index()[['Publié_Date','patient_Âge','No']]
df_patient_day
De plus, s'il y a du japonais dans la description de l'âge, les caractères seront déformés dans la partie de matplotlib (il est difficile à gérer en réutilisant l'environnement comme décrit ci-dessus), remplacez-le comme suit.
genes_dict = {'Moins de 10 ans':'under 10',\
'10 ans': '10', \
'20 ans': '20', \
'30 s': '30', \
'Quarante': '40', \
'Années 50': '50', \
'Années 60': '60', \
'Années 70': '70', \
'Années 80': '80', \
'Années 90': '90', \
'100 ans et plus': 'over 100', \
"'-": '-',
'inconnue': 'unknown'
}
df_patient_day['patient_Âge'] = [genes_dict[x] for x in df_patient_day['patient_Âge'].values.tolist()]
df_patient_day
Il y a un problème dans le cas ci-dessus, et si le nombre de personnes nouvellement infectées n'existe pas ce jour-là et cet âge, il n'y a pas de données, et ce sera un problème lors de la prise d'une moyenne mobile plus tard, donc ici ces données sont dans la fourchette de l'âge ci-dessus × Créez un produit direct de toute la plage de dates et combinez-le avec le DataFrame ci-dessus (s'il vous plaît laissez-moi savoir si vous connaissez un meilleur moyen ici!).
genes = ['under 10',\
'10', \
'20', \
'30', \
'40', \
'50', \
'60', \
'70', \
'80', \
'90', \
'over 100', \
'-',
'unknown'
]
days = pd.date_range(start=df_patient['Publié_Date'].min(), end=df_patient['Publié_Date'].max(), freq='D')
data = [[x, y] for x in days for y in genes]
df_data = pd.DataFrame(data, columns=['Publié_Date', 'patient_Âge'])
df_data = pd.merge(df_data, df_patient_day, on=['Publié_Date', 'patient_Âge'], how='left').fillna(0)
df_data = df_data.rename(columns={'No':'Nombre de personnes'})
df_data
Prenez une moyenne mobile pour chaque groupe d'âge. Vous pouvez facilement obtenir une moyenne mobile avec la fonction de pandas. Pour une moyenne mobile sur 7 jours, faites simplement rouler (7). Si vous voulez prendre la moyenne, faites rouler (7) .mean (). Et puisque les 6 premiers jours seront nan, supprimez-le avec dropna (). Cette fois, pour une implémentation ultérieure, je vais en faire un DataFrame pour chaque âge et le stocker dans le dictionnaire. C'est tout ce qu'on peut en dire!
result_diff = {}
for x in genes:
df = df_data[df_data['patient_Âge'] == x]
df = pd.Series(df['Nombre de personnes'].values.tolist(), index=df['Publié_Date'].values)
result_diff[x] = df.rolling(7).mean().dropna()
Visualisez enfin.
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])
Enfin, j'afficherai le résultat.
Des années 20 aux années 50, il a été confirmé que les âges ont changé par ordre de plus jeune âge. Même ainsi, comment augmenter le nombre de personnes dans la vingtaine est incroyable. L'annonce de Tokyo n'était pas un mensonge.
Je ne veux pas dire quels sont les facteurs ici, mais vous pouvez vérifier rapidement le contenu du rapport avec des données publiques comme celle-ci, alors pourquoi ne pas l'essayer également comme pratique? Il y a encore beaucoup de choses qui peuvent être étudiées en comparant cela avec la distribution réelle de la population, et je pense que c'est un bon matériel pédagogique pour pratiquer réellement le traitement des données.