put analyse data in namedtuple list + add global data in html template + fix css

This commit is contained in:
rmanach 2021-12-29 22:26:03 +01:00
parent 37712f892d
commit 3952c6cab2
3 changed files with 119 additions and 11 deletions

View File

@ -3,11 +3,12 @@ import json
import logging import logging
import os import os
import re import re
from collections import namedtuple
from datetime import datetime as dt from datetime import datetime as dt
from enum import Enum from enum import Enum
from functools import partial from functools import partial
from multiprocessing import Pool from multiprocessing import Pool
from typing import Any, Dict, List, Optional, OrderedDict, Tuple from typing import Any, Dict, List, Optional, OrderedDict, Tuple, Union
import numpy as np import numpy as np
import requests import requests
@ -33,7 +34,8 @@ OUTPUT_SUFFIX = f"{TMP_SUFFIX}{FORMAT_SUFFIX}"
TMP_FILE_REGEX = re.compile(r"^.*{}$".format(OUTPUT_SUFFIX.replace(".", "\."))) TMP_FILE_REGEX = re.compile(r"^.*{}$".format(OUTPUT_SUFFIX.replace(".", "\.")))
MAIN_URL = "https://covid.thegux.fr/" # MAIN_URL = "https://covid.thegux.fr/"
MAIN_URL = "/home/romain/code/covid-plotter/"
# cycler could be better, but for ages plots it's ok # cycler could be better, but for ages plots it's ok
AGE_COLORS = { AGE_COLORS = {
@ -79,6 +81,10 @@ class AgeGroup(DreesEnum):
VERY_OLD = (4, "[80;+]") VERY_OLD = (4, "[80;+]")
VaccineMean = namedtuple("VaccineMean", ["age", "field", "percent"])
AgeMean = namedtuple("AgeMean", ["age", "field", "percent"])
def get_data( def get_data(
file_path: Optional[str] = None, file_path: Optional[str] = None,
extension: Optional[str] = "json", extension: Optional[str] = "json",
@ -283,11 +289,12 @@ def save_and_close_fig(
logging.info(f"{output_path} plotted") logging.info(f"{output_path} plotted")
def analyse(np_data: np.ndarray, np_date: np.ndarray) -> None: def analyse(np_data: np.ndarray) -> List[Union[VaccineMean, AgeMean]]:
""" """
analyse data analyse data
""" """
logging.info("analysing data...") logging.info("analysing data...")
lst_analyse_data: List[Union[VaccineMean, AgeMean]] = list()
np_percent_vac, _ = get_vaccine_percent(np_data) np_percent_vac, _ = get_vaccine_percent(np_data)
logging.info("--- field by age vaccine mean percent ---") logging.info("--- field by age vaccine mean percent ---")
@ -297,6 +304,9 @@ def analyse(np_data: np.ndarray, np_date: np.ndarray) -> None:
np.nanmean(np_percent_vac[:, age_group.value, field.value]) * 100, 2 np.nanmean(np_percent_vac[:, age_group.value, field.value]) * 100, 2
) )
print(f"{field.name} - {age_group.label} - vac : {mean_vac_percent}%") print(f"{field.name} - {age_group.label} - vac : {mean_vac_percent}%")
lst_analyse_data.append(
VaccineMean(age_group.label, field.label, mean_vac_percent)
)
logging.info("--- age by field and vac status mean percent ---") logging.info("--- age by field and vac status mean percent ---")
for field in Field: for field in Field:
@ -310,6 +320,9 @@ def analyse(np_data: np.ndarray, np_date: np.ndarray) -> None:
np.nanmean(np_percent_age[:, age_group.value]), 2 np.nanmean(np_percent_age[:, age_group.value]), 2
) )
print(f"age: {age_group.label} - field: {field.name} = {percent_age_mean}%") print(f"age: {age_group.label} - field: {field.name} = {percent_age_mean}%")
lst_analyse_data.append(
AgeMean(age_group.label, field.label, percent_age_mean)
)
percent_age_vac_mean = np.round( percent_age_vac_mean = np.round(
np.nanmean(np_percent_age_vac[:, age_group.value]), 2 np.nanmean(np_percent_age_vac[:, age_group.value]), 2
@ -324,6 +337,7 @@ def analyse(np_data: np.ndarray, np_date: np.ndarray) -> None:
print( print(
f"age: {age_group.label} - status: unvac - field: {field.name} = {percent_age_unvac_mean}%" f"age: {age_group.label} - status: unvac - field: {field.name} = {percent_age_unvac_mean}%"
) )
return lst_analyse_data
def plot_bar_age_percent_vac_status_by_field( def plot_bar_age_percent_vac_status_by_field(
@ -523,7 +537,9 @@ def move_tmp_plots() -> None:
logging.info("files moved") logging.info("files moved")
def generate_html_page(np_date: np.ndarray) -> None: def generate_html_page(
np_date: np.ndarray, lst_analyse_data: List[Union[VaccineMean, AgeMean]]
) -> None:
logging.info("generating html page with plots...") logging.info("generating html page with plots...")
os.makedirs(BUILD_REPOSITORY, exist_ok=True) os.makedirs(BUILD_REPOSITORY, exist_ok=True)
env = Environment( env = Environment(
@ -540,6 +556,8 @@ def generate_html_page(np_date: np.ndarray) -> None:
"static": os.path.join(MAIN_URL, STATIC_REPOSITORY), "static": os.path.join(MAIN_URL, STATIC_REPOSITORY),
"src": DATA_URL, "src": DATA_URL,
"period": f"{date_start} - {date_end}", "period": f"{date_start} - {date_end}",
"vaccine_mean": [x for x in lst_analyse_data if type(x) == VaccineMean],
"age_mean": [x for x in lst_analyse_data if type(x) == AgeMean],
} }
) )
with open(os.path.join(BUILD_REPOSITORY, "index.html"), "w") as f: with open(os.path.join(BUILD_REPOSITORY, "index.html"), "w") as f:
@ -593,7 +611,7 @@ if __name__ == "__main__":
dic_data_grouped: Dict[dt, Any] = group_by_age_date(dic_data) dic_data_grouped: Dict[dt, Any] = group_by_age_date(dic_data)
np_data, np_date = get_np_data(dic_data_grouped) np_data, np_date = get_np_data(dic_data_grouped)
analyse(np_data, np_date) lst_analyse_data = analyse(np_data)
if not args.no_plot: if not args.no_plot:
os.makedirs(OUTPUT_REPOSITORY, exist_ok=True) os.makedirs(OUTPUT_REPOSITORY, exist_ok=True)
@ -612,4 +630,4 @@ if __name__ == "__main__":
move_tmp_plots() move_tmp_plots()
if args.to_html: if args.to_html:
generate_html_page(np_date) generate_html_page(np_date, lst_analyse_data)

View File

@ -18,14 +18,52 @@
flex: 0 1 33% flex: 0 1 33%
} }
.table-container {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
flex-wrap: wrap;
}
.table-item {
flex: 0 1 33%
}
.img-bars { .img-bars {
width: 1500px; width: 1500px;
height: 500px; height: 500px;
border: solid border: solid
} }
table, th, td {
border: 1px solid black;
}
table {
border-collapse: collapse;
margin: auto;
width: 60%;
}
img { img {
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: contain; object-fit: contain;
} }
hr {
width: 100%;
margin-top: 40px;
border: 0;
height: 1px;
background: #333;
background-image: -webkit-linear-gradient(left, #ccc, #333, #ccc);
background-image: -moz-linear-gradient(left, #ccc, #333, #ccc);
background-image: -ms-linear-gradient(left, #ccc, #333, #ccc);
background-image: -o-linear-gradient(left, #ccc, #333, #ccc);
}
h1, h3, h5 {
text-decoration: underline;
}

View File

@ -1,24 +1,76 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Thegux covid-19</title> <title>Covid-19 DREES dataset</title>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="keywords" content="thegux, covid"> <meta name="keywords" content="thegux, covid">
<link rel="stylesheet" href="{{ static }}/css/index.css"> <link rel="stylesheet" href="{{ static }}/css/index.css">
<meta name="description" content="A simple page to share some useful data about covid 19"> <meta name="description" content="A simple page to share some useful data about DREES covid 19 dataset">
</head> </head>
<body> <body>
<div class="main-container"> <div class="main-container">
<h1>Thegux covid-19</h1> <h1>Covid-19 DREES dataset</h1>
<div>source : <a href="{{ src }}">Data DRESS</a></div> <div>source : <a href="{{ src }}">Data DRESS</a></div>
<div>période temporelle : <b>{{ period }}</b></div> <div>période temporelle : <b>{{ period }}</b></div>
<div>pas de temps : <b>journalier</b></div> <div>pas de temps : <b>journalier</b></div>
<h3>Hospitalisations/Soins critiques/Décés par status vaccinal groupés et tranches d'âges</h3> <div>contact: <b>admin@thegux.fr</b></div>
<hr/>
<h3>Données globales</h3>
<h5>Répartition des tranches d'âges par catégorie (moyennée sur la période temporelle)</h5>
<div class="table-container">
{% for field in fields %}
<div class="table-item">
<table>
<tr>
<th colspan="2">{{ field.label }}</th>
</tr>
<tr>
<th>Age</th>
<th>%</th>
</tr>
{% for mean in age_mean %}
{% if field.label == mean.field %}
<tr>
<td>{{ mean.age }}</td>
<td>{{ mean.percent }}</td>
</tr>
{% endif %}
{% endfor %}
</table>
</div>
{% endfor %}
</div>
<h5>Pourcentage de vaccinés par catégorie (moyenné sur la période temporelle)</h5>
<div class="table-container">
{% for field in fields %}
<div class="table-item">
<table>
<tr>
<th colspan="2">{{ field.label }}</th>
</tr>
<tr>
<th>Age</th>
<th>%</th>
</tr>
{% for mean in vaccine_mean %}
{% if field.label == mean.field %}
<tr>
<td>{{ mean.age }}</td>
<td>{{ mean.percent }}</td>
</tr>
{% endif %}
{% endfor %}
</table>
</div>
{% endfor %}
</div>
<hr/>
<h3>Hospitalisations/Soins critiques/Décés par status vaccinal et tranches d'âges groupées</h3>
{% for field in fields %} {% for field in fields %}
<img src="{{ static }}/plots/age_percent_vac_{{ field.name.lower() }}.png"/> <img src="{{ static }}/plots/age_percent_vac_{{ field.name.lower() }}.png"/>
<img src="{{ static }}/plots/age_percent_unvac_{{ field.name.lower() }}.png"/> <img src="{{ static }}/plots/age_percent_unvac_{{ field.name.lower() }}.png"/>
{% endfor %} {% endfor %}
<h3>Hospitalisations/Soins critiques/Décés par tranches d'âges groupés et status vaccinal</h3> <h3>Hospitalisations/Soins critiques/Décés par tranches d'âges et status vaccinal groupé</h3>
{% for age in ages %} {% for age in ages %}
{% for field in fields %} {% for field in fields %}
<img src="{{ static }}/plots/vac_percent_{{ age.name.lower() }}_{{ field.name.lower() }}.png"/> <img src="{{ static }}/plots/vac_percent_{{ age.name.lower() }}_{{ field.name.lower() }}.png"/>