diff --git a/src/notebook/indicators/reference_indicators.md b/src/notebook/indicators/reference_indicators.md index 88ac5d08..aa728ebd 100644 --- a/src/notebook/indicators/reference_indicators.md +++ b/src/notebook/indicators/reference_indicators.md @@ -13,116 +13,353 @@ jupyter: --- -# Indicateurs QualiCharge : Structure +# Indicateurs de référence QualiCharge -Ce Notebook présente une proposition de structuration et de représentation des indicateurs Qualicharge sous forme de requêtes SQL construites à partir d'une codification des indicateurs. +Ce Notebook présente les indicateurs de références gérés sous Qualicharge. -La liste des indicateurs est présentée sur [ce lien](https://loco-philippe.github.io/IRVE/files/indicateurs.html). +La première partie est une présentation générale des indicateurs. + +La deuxième partie est la représentation de chaque indicateur sous forme de requête SQL. *Nota 1 : La dimension temporelle des indicateurs n'est pas prise en compte, elle sera ajoutée dans une version ultérieure* *Nota 2 : La représentation visuelle des indicateurs (ex. diagramme circulaire, diagramme à barre, carte choroplèthe, courbe...) n'est pas abordée.* - +# PARTIE 1 : Présentation générale + +## Introduction + +Les indicateurs sont constitués d'une liste de valeurs. On distingue les types suivants : + +- scalaire (une seule valeur numérique) +- temporel (une liste de valeurs associées à un index temporel), +- catégorie (une liste de valeurs associées à un index catégoriel) +- multiple (multi-dimensionnel: une liste de valeurs associées à plusieurs index) + +Les indicateurs peuvent être: + +- dynamiques : générés dynamiquement à partir de l'état courant des données, +- historisés : générés périodiquement (heure, jour, mois ou année) et stockés pour être réutilisés. + +Par exemple, le nombre de points de recharge est un indicateur dynamique mais si l'on souhaite disposer d'un indicateur de l'évolution du nombre de points de recharges, celui-ci doit être historisé. + +Un indicateur peut être visualisé suivant différentes représentations. Par exemple, un indicateur de type 'catégorie' peut être représenté par : + +- un tableau à deux colonnes, +- un diagramme en barres, +- un diagramme circulaire, +- une carte choroplèthe (si l'index de l'indicateur est associé à une carte). + +Un [indicateur historisé](./historisation.md) peut être représenté en fonction de sa dimension temporelle. Par exemple: + +- une moyenne sur une période, +- un historique sur une période, +- état courant. + +Le mode de représentation d'un indicateur n'est pas abordé. + +## Exemple - baromètre AVERE + +Les indicateurs présentés dans le {term}`Baromètre AVERE` sont les suivants : + +- chiffres clés : + - Nombre total de points de recharge ouverts au public + - Taux d'évolution sur 12 mois + - Taux de disponibilité moyen d'un point de charge + - Points de recharge en moyenne pour 100 000 habitants +- répartition spatiale (cartes choroplèthes) : + - Nombre de stations de recharge par région + - Nombre de points de recharge par région + - Puissance totale installée par région +- typologie (diagrammes circulaires) : + - Répartition des points de recharge par type de site d’implantation + - Recharge selon la catégorie de puissance + - Recharge selon la catégorie de puissance par région (diagramme en barres empilées) +- évolution (diagramme en barre) + - Evolution du nombre de points de recharge par année + - Évolution du nombre de points de recharge par mois +- usage (diagramme en barres) + - Nombre de sessions moyen mensuel par point de recharge + - Taux de disponibilité du mois par catégorie de puissance + ## Structure des indicateurs - - -### Codification des indicateurs +### Types d'indicateurs -Les indicateurs sont codifiés par une chaine de caractères *[type]-[périmètre]-[valeur de périmètre]-[critère]* avec : +Cinq types d'indicateurs sont définis: -- *type* : identifiant du type d'indicateur (ex. 'i1' : nombre de points de recharge) -- *périmètre et valeur de périmètre*: sous ensemble des données sur lequel appliquer l'indicateur. Les périmètres actuellement définis sont les suivants : - - 00: national (sans valeur) - - 01: région (valeur : code de la région) - - 02: département (valeur : code du département) - - 03: EPCI (valeur : code de l'EPCI) - - 04: commune (valeur : code de la commune) -- *critère* : paramètre spécifique du type d'indicateur +- indicateurs d'infrastructure : Ils décrivent le parc installé (évolution temporelle, répartition géographiques, caratéristiques, dimensionnement) +- indicateurs d'usage : Ils décrivent l'utilisation effective des infrastructures (qualité de service, volumétrie, répartition) +- indicateurs temporels : Ils analysent l'évolution des deux catégories d'indicateurs précédent sur une période temporelle +- indicateurs d'état : Ils représentent un état d'une partie des données (ex. liste des stations du réseau autoroutier) +- indicateurs étendus : Ils concernent les indicateurs obtenus avec des jeux de données en lien (ex. relevés ENEDIS) -Le périmètre par défaut est l'ensemble des données. +*Les indicateurs d'exploitation (liés aux aménageurs et enseignes) ainsi que les indicateurs liés à des attributs spécifiques (ex. accès deux roues, période d'ouverture, accès handicapés...) sont à ajouter.* + +### Codification des indicateurs + +Les indicateurs sont codifiés par une chaine de caractères : *[type]-[périmètre]-[valeur de périmètre]-[level]* +ou bien pour les indicateurs temporels : *[type]-[périodicité]-[périmètre]-[valeur de périmètre]-[level]* +avec: + +- type : identifiant du type d'indicateur (ex. 'i1' : nombre de points de recharge) +- période : périodicité des données utilisées + - y : données annuelles + - m : données mensuelles + - w : données hebdomadaires + - d : données quotidiennes +- périmètre et valeur de périmètre: sous ensemble des données sur lequel appliquer l'indicateur. Les périmètres actuellement définis sont les découpages administratifs : + - 0: national (valeur : 00 tout, 01 métropole, 02 DOM, 03 TOM, 04 métropole et DOM) + - 1: région (valeur : code de la région) + - 2: département (valeur : code du département) + - 3: EPCI (valeur : code de l'EPCI) + - 4: commune (valeur : code de la commune) +- level : niveau de découpage du résultat (découpage administratif - voir périmètre). Les valeurs associées à un 'level' sont dénommées 'target'. +Le périmètre par défaut est l'ensemble des données. -Exemples de codification : -- **t4-04-74012** : Pourcentage de stations par nombre de points de recharge (t4) pour la ville (04) d'Annemasse (74012) -- **i1-01-93** : Nombre de points de recharge (i1) pour la région (01) PACA (93) -- **i1-01-93-03** : Nombre de points de recharge (i1) pour la région (01) PACA (93) par EPCI (03) +*Exemples* +- **t4-4-74012** : Pourcentage de stations par nombre de points de recharge (t4) pour la ville (4) d'Annemasse (74012) +- **i1-1-93** : Nombre de points de recharge (i1) pour la région (1) PACA (93) +- **i1-1-93-3** : Nombre de points de recharge (i1) pour la région (1) PACA (93) par EPCI (3) +- **i1-m-1-93-3** : Nombre de points de recharge (i1) mensuel (m) pour la région (1) PACA (93) par EPCI (3) - **t1** : Nombre de points de recharge par niveau de puissance (t1) pour l'ensemble des données (pas de périmètre choisi) +- **e1** : liste des stations du réseau autoroutier (e1) - +### Résultat des indicateurs + +Le résultat d'un indicateur peut être représenté par une structure tabulaire composée des champs suivants : + +- valeur : résultat de l'indicateur pour une catégorie et une target, +- valeur additionnelle : informations associées à la valeur +- catégorie (facultative) : décomposition associée à l'indicateur +- target (facultative) : découpage associé au level choisi + +Le champ 'valeur additionnelle' est utilisé pour les données structurées associées au champ 'valeur'. +Ce champ est au format JSON et concerne les informations liées à l'historisation ainsi que les données des indicateurs d'état. + +Si aucune catégorisation et aucun level ne sont définis, le résultat se réduit à une valeur. + +*Exemple* + +'i1' : le résultat est le nombre de points de recharge (valeur) -### Exemples de mise en oeuvre +Si uniquement une catégorisation est définie, le résultat est une liste de valeurs associées à chaque catégorie. +*Exemple* -Les exemples ci-dessous concerna l'indicateur 'i1' qui fournit le nombre de points de recharge. +'t1' : le résultat est le nombre de points de recharge (valeur : nb_pdc) par niveau de puissance (catégorie : p_range) -Les colonnes de gauche sont les valeurs calculées liées à l'indicateur (ex. pour 'i1' : 'nb_pdc'). +| nb_pdc | p_range | +| ------ | ------------ | +| 10892 | [15.0, 26.0) | +| 4807 | [175, 360.0) | +| 3282 | [65, 175.0) | +| 2359 | [26, 65.0) | +| 2157 | [0, 15.0) | +| 25 | [360, None) | -Les colonnes de droite sont des données complémentaires spécifiques à chaque indicateur (ex. pour 'i1' : 'code' indique un critère de regroupement associé à une zone géographique) +Si uniquement un level est défini, le résultat est une liste de valeurs associées à chaque target. +*Exemple* -#### Ensemble des données +i1-1-93-2 : Nombre de points de recharge (i1) pour la région (1) PACA (93) par département (2) +Le résultat est le nombre de points de recharge (valeur : nb_pdc) par département (target : code du département). -La codification est 'i1-00-00' (ou bien 'i1') +| nb_pdc | code | +| ------ | ------ | +| 473 | 13 | +| 450 | 06 | +| 175 | 83 | +| 170 | 84 | +| 105 | 04 | +| 57 | 05 | -Le résultat est le suivant : +Si une catégorisation et un level sont définis, le résultat est une liste de valeurs associées à chaque target et à chaque catégorie. -| nb_pdc | -|--------| -| 13400 | +*Exemple* +t8-1-93-2 : Nombre de stations par opérateur (t8) pour la région (1) PACA (93) par département (2) +La 'target' est ici le département (représenté par son code) et la 'catégorie' est l'opérateur (nom_operateur). +| nb_stat | nom_operateur | code | +| ------- | ------------------------------- | ------ | +| 273 | IZIVIA | 06 | +| 31 | IZIVIA | 13 | +| 28 | TotalEnergies Charging Services | 13 | +| 21 | LUMI'IN | 84 | +| 16 | Power Dot France | 13 | +| 10 | LUMI'IN | 04 | +| 8 | Last Mile Solutions | 13 | +| 7 | CAR2PLUG | 83 | +| 7 | Bump | 13 | +| 7 | Power Dot France | 84 | -#### Ensemble des données avec une répartition par région (01) +## Indicateurs d'infrastructure -La codification est 'i1-00-00-01' (ou bien 'i1---01') +### Infrastructure - typologie -Le résultat est le suivant : +Objectif : -| nb_pdc | code | -| :----- | :--- | -| 3538 | 84 | -| 2351 | 93 | -| 1391 | 11 | -| 1082 | 44 | -| 1027 | 75 | +- analyse de la typologie (comparaison des ratios) -*ex. ligne 1 : 'code' 84 indique le code de la région.* +| id | nom | Pr | type | historisé | +| ----------- | --------------------------------------------------------- | --- | ----- | --------------------- | +| t1-xx-yy-zz | Nombre de points de recharge par niveau de puissance | 1 | infra | oui (national/région) | +| t2-xx-yy-zz | Pourcentage de points de recharge par niveau de puissance | 2 | infra | synthèse | +| t3-xx-yy-zz | Nombre stations par nombre de points de recharge | 1 | infra | non | +| t4-xx-yy-zz | Pourcentage de stations par nombre de points de recharge | 2 | infra | non | +| t5-xx-yy-zz | Nombre de stations par type d'implantation | 1 | infra | oui (national/région) | +| t6-xx-yy-zz | Pourcentage de stations par type d'implantation | 2 | infra | synthèse | +| t7-xx-yy-zz | Densité EPCI (nb EPCI avec / nb EPCI total) | 3 | infra | oui (national/région) | +| t8-xx-yy-zz | Nombre stations par opérateur | 1 | infra | oui (national/région) | +| t9-xx-yy-zz | Pourcentage de stations par opérateur | 2 | infra | synthèse | +L'identification des opérateurs (nom) est actuellment facultative (à rendre obligatoire). +La classification des niveaux de puissances nominale est à valider (en liaison avec le type d'alimentation AC/DC). La classification retenue actuellement est la suivante : 0-15 / 15-26 / 26-65 / 65-175 / 175-360 / > 360 (valeurs de seuil choisies à partir de l'existant Qualicharge). -#### Région (01) PACA (93) +### Infrastructure - quantitatif -La codification est 'i1-01-93' (équivalent à 'i1-01-93-00') +Objectif: -Le résultat est le suivant : +- analyse de la répartition géographique (les ratios permettent les comparaisons) -| nb_pdc |code| -|--------|----| -| 2351 | 93 | +| id | nom | Pr | type | historisé | +| ----------- | ------------------------------------------------ | --- | ----- | ---------------------- | +| i1-xx-yy-zz | Nombre de points de recharge ouverts au public | 1 | infra | oui (département/EPCI) | +| i2-xx-yy-zz | Ratio pour 100 000 habitants | 1 | infra | synthèse | +| i3-xx-yy-zz | Ratio pour 100 km2 | 2 | infra | synthèse | +| i4-xx-yy-zz | Nombre de stations de recharge ouverts au public | 1 | infra | oui (département/EPCI) | +| i5-xx-yy-zz | Ratio pour 100 000 habitants | 1 | infra | synthèse | +| i6-xx-yy-zz | Ratio pour 100 km2 | 2 | infra | synthèse | +| i7-xx-yy-zz | Puissance installée | 1 | infra | oui (département/EPCI) | +| i8-xx-yy-zz | Ratio pour 100 000 habitants | 1 | infra | synthèse | +| i9-xx-yy-zz | Ratio pour 100 km2 | 2 | infra | synthèse | +zz : critère de répartition par périmètre (ex. 02 : répartition par département) +## Indicateurs d'infrastructure du réseau autoroutes -#### Région (1) PACA (93) par département (02) +Objectif: -La codification est 'i1-01-93-02' +- analyse du niveau d'équipement des stations +- analyse de la couverture des trajets nationaux +- analyse de la répartition par station -Le résultat est le suivant : +### Indicateurs globaux -| nb_pdc | code | -| :----- | :--- | -| 782 | 83 | -| 668 | 06 | -| 268 | 13 | -| 262 | 05 | -| 214 | 84 | -| 157 | 04 | +| id | nom | Pr | type | historisé | +| --- | ------------------------------------------------------------------ | --- | ----- | --------- | +| a1 | Nombre de points de recharge (i1-xx) | 1 | infra | oui | +| a2 | Nombre de stations de recharge (i4-xx) | 2 | infra | oui | +| a3 | Puissance installée (i7-xx) | 2 | infra | oui | +| a4 | Nombre de points de recharge par niveau de puissance (t1-xx) | 1 | infra | non | +| a5 | Densité des stations équipées (nb stations équipées / nb stations) | 3 | infra | oui | +| a6 | Distance moyenne inter-station de recharge | 3 | infra | oui | + +ex. Suivi du déploiement des IRVE dans les stations (nécessite de disposer du nombre de stations). +ex. Suivi temporel de la distance interstation (utilisation du graphe pour calculer les distances de recharge associée à chaque station). + +L'appartenance d'une station au réseau autoroute est à définir (attribut spécifique et / ou proximité géographique avec les voies de circulation). +Le graphe autoroutier doit permettre d'associer plusieurs stations à un noeud (ou à un tronçon). + +### Indicateurs par station + +| id | nom | Pr | type | historisé | +| --- | -------------------------------------- | --- | ----- | --------- | +| a7 | Puissance installée par station | 2 | infra | non | +| a8 | Nombre de points de charge par station | 2 | infra | non | +| a9 | Distance de recharge par station | 2 | infra | non | + +ex. Analyse de la distance interstation (zones blanches). + +## Indicateurs d'usage + +### Usage - quantitatif + +- analyse de l'évolution temporelle de l'utilisation + +| id | nom | Pr | type | historisé | +| ----------- | ------------------------------------ | --- | ----- | --------------------- | +| u1-xx-yy-zz | Nombre de point de charge actif | 2 | usage | oui (national/région) | +| u2-xx-yy-zz | Pourcentage de point de charge actif | 2 | usage | synthèse | +| u3-xx-yy-zz | Nombre de sessions | 2 | usage | oui (national/région) | +| u4-xx-yy-zz | Energie distribuée | 2 | usage | oui (national/région) | + +u1 est calculé sur une journée +u2 est calculé à partir de u1 et i1 +u3 et u4 sont calculés par heure + +exemple d'utilisation : Analyse du profil horaire de l'énergie fournie en fonction des périodes et de la localisation. + +### Usage - qualité de service + +- analyse de la disponibilité et de l'utilisation des points de recharge + +| id | nom | Pr | type | historisé | +| ------------ | ---------------------------------------------------- | --- | ----- | --------------------- | +| q1-xx-yy-zz | Durée de bon fonctionnement | 2 | usage | oui (national/région) | +| q2-xx-yy-zz | Durée d'utilisation | 2 | usage | oui (national/région) | +| q3-xx-yy-zz | Durée d'ouverture | 2 | usage | oui (national/région) | +| q4-xx-yy-zz | Nombre de sessions réussies | 3 | usage | oui (national/région) | +| q5-xx-yy-zz | Saturation | 2 | usage | non | +| q6-xx-yy-zz | Taux de disponibilité d'un point de charge actif | 2 | usage | synthèse | +| q7-xx-yy-zz | Taux de disponibilité par catégorie de puissance | 3 | usage | synthèse | +| q8-xx-yy-zz | Taux d'utilisation d'un point de charge actif | 2 | usage | synthèse | +| q9-xx-yy-zz | Taux de sessions réussies d'un point de charge actif | 2 | usage | synthèse | +| q10-xx-yy-zz | Taux de saturation d'une station | 3 | usage | non | + +q1, q2, q3, q4 et q5 sont les valeurs cumulées sur une journée +q6, q7 sont calculé à partir de q1 et q3 +q8 est calculé à partir de q2 et q3 +q9 est calculé à partir de q4 et u3 +q10 est calculé à partir de q5 + +## Indicateurs temporels + +Les indicateurs temporels identifiés sont les suivants : + +| id | nom | Pr | base | fonction | +| ------------- | ------------------------------------------------ | --- | ------ | -------------- | +| d1-w-xx-yy-zz | Taux d'évolution du nombre de stations | 1 | i4 | taux évolution | +| d2-w-xx-yy-zz | Evolution du nombre de points de recharge | 1 | i1 | historique | +| d3-w-xx-yy-zz | Nombre de sessions par point de recharge | 2 | u3 | historique | +| d4-w-xx-yy-zz | Taux de disponibilité par catégorie de puissance | 2 | q1, q3 | historique | +| d5-w-xx-yy-zz | Taux de points de recharge avec indispo > 7 j | 3 | q1, q3 | historique | + +Nota : Seule la périodicité est intégrée à la codification (voir chapitre 'codification'), l'intervalle doit donc être ajouté à l'indicateur. + +*Exemple* + +Evolution du nombre mensuel de points de recharge pour 2024 par département : (d2-m---4, entre 01/01/2023 et le 01/01/2024) + +## Indicateurs d'état + +Les indicateurs d'état identifiés sont les suivants : + +| id | nom | Pr | +| ----------- | ---------------------------------------- | --- | +| e1-xx-yy-zz | Liste des stations du réseau autoroutier | 2 | +| e2-xx-yy-zz | Liste des stations actives | 2 | + +Nota : La périodicité d'historisation n'est pas intégrée à la codification (voir chapitre 'codification'), la date doit donc être ajouté à l'indicateur. + +*Exemple* + +Liste des stations du réseau autoroutier (d2) au 31/12/2024 + +## Indicateurs étendus + +Ils concernent le couplage des données avec des jeux de données complémentaires (à définir dans un second temps): + +- couplage consommation / trafic +- couplage nombre de véhicules électriques vendus/immatriculés +- couplage consommation / relevés ENEDIS des points de livraison -*ex. ligne 1 : 'code' 84 indique le code du département.* -## Présentation des indicateurs +# PARTIE 2 : Présentation des indicateurs Les sections suivantes présentent pour chaque indicateur la requête SQL associée pour plusieurs exemples de jeux de paramètres. @@ -137,9 +374,7 @@ Une solution provisoire est utilisée pour le point suivant : ## Infrastructure - quantitatif -Indicateurs pris en compte : 'i1', 'i4', 'i7' - -Les autres indicateurs dérivés ('i2', 'i5', 'i8' ramené à 100 000 habitants et 'i3', 'i6', 'i9' ramené à 100 km2) sont ajoutés dans la prochaine version. +Indicateurs pris en compte : 'i1', 'i2', 'i3', 'i4', 'i5', 'i6', 'i7', 'i8', 'i9' ### I1 : Nombre de points de recharge ouverts au public @@ -241,6 +476,278 @@ ORDER BY ``` + +### I2 : Nombre de points de recharge ouverts au public pour 100 000 habitants + +'nb_pdc_pop' est le nombre de points de recharge pour 100 000 habitants. + + + +#### requête globale + + + +Exemple requête globale : 'i2-0-00-0' ou 'i2' + +```sql +SELECT + ( + SELECT + count(id_pdc_itinerance) AS nb_pdc + FROM + pointdecharge + ) / ( + SELECT + sum(population) + FROM + region + ) * 100000 AS nb_pdc_pop +``` + + + +#### requête globale avec critère + + + +Exemple requête globale avec une répartition par région (01) 'i2-00-00-01' ou 'i2---01' + +```sql +WITH + i1 AS ( + SELECT + count(id_pdc_itinerance) AS nb_pdc, + region.code + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + GROUP BY + region.code + ORDER BY + nb_pdc DESC + ) +SELECT + i1.nb_pdc::float / region.population * 100000 AS nb_pdc_pop, + region.code +FROM + i1 + LEFT JOIN region on i1.code = region.code +ORDER by + nb_pdc_pop DESC +``` + + + +#### requête locale + + + +Exemple requête sur la région (01) PACA (93) 'i2-01-93-00' ou 'i2-01-93' + +```sql +SELECT + ( + SELECT + count(id_pdc_itinerance) AS nb_pdc + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + ORDER BY + nb_pdc DESC + ) / ( + SELECT + sum(population) + FROM + region + WHERE + region.code = '93' + ) * 100000 AS nb_pdc_pop +``` + + + +#### requête locale avec critère + + + +Exemple requête sur la région (01) PACA (93) par département (02) 'i2-01-93-02' + +```sql +WITH + i1 AS ( + SELECT + count(id_pdc_itinerance) AS nb_pdc, + department.code + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + GROUP BY + department.code + ORDER BY + nb_pdc DESC + ) +SELECT + i1.nb_pdc::float / department.population * 100000 AS nb_pdc_pop, + department.code +FROM + i1 + LEFT JOIN department on i1.code = department.code +ORDER by + nb_pdc_pop DESC``` + + + +### I3 : Nombre de points de recharge ouverts au public pour 100 km2 + +'nb_pdc_area' est le nombre de points de recharge pour 100 km2. + + + +#### requête globale + + + +Exemple requête globale : 'i3-0-00-0' ou 'i3' + +```sql +SELECT + ( + SELECT + count(id_pdc_itinerance) AS nb_pdc + FROM + pointdecharge + ) / ( + SELECT + sum(area::float) + FROM + region + ) * 100000000 AS nb_pdc_area +``` + + + +#### requête globale avec critère + + + +Exemple requête globale avec une répartition par région (01) 'i3-00-00-01' ou 'i3---01' + +```sql +WITH + i1 AS ( + SELECT + count(id_pdc_itinerance) AS nb_pdc, + region.code + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + GROUP BY + region.code + ORDER BY + nb_pdc DESC + ) +SELECT + i1.nb_pdc::float / region.area::float * 100000000 AS nb_pdc_area, + region.code +FROM + i1 + LEFT JOIN region on i1.code = region.code +ORDER by + nb_pdc_area DESC +``` + + + +#### requête locale + + + +Exemple requête sur la région (01) PACA (93) 'i3-01-93-00' ou 'i3-01-93' + +```sql +SELECT + ( + SELECT + count(id_pdc_itinerance) AS nb_pdc + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + ORDER BY + nb_pdc DESC + ) / ( + SELECT + sum(area::float) + FROM + region + WHERE + region.code = '93' + ) * 100000000 AS nb_pdc_area +``` + + + +#### requête locale avec critère + + + +Exemple requête sur la région (01) PACA (93) par département (02) 'i3-01-93-02' + +```sql +WITH + i1 AS ( + SELECT + count(id_pdc_itinerance) AS nb_pdc, + department.code + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + GROUP BY + department.code + ORDER BY + nb_pdc DESC + ) +SELECT + i1.nb_pdc::float / department.area::float * 100000000 AS nb_pdc_area, + department.code +FROM + i1 + LEFT JOIN department on i1.code = department.code +ORDER by + nb_pdc_area DESC``` + + ### I4 : Nombre de stations ouvertes au public @@ -281,8 +788,489 @@ FROM LEFT JOIN region on department.region_id = region.id GROUP BY region.code -ORDER BY - nb_stat DESC +ORDER BY + nb_stat DESC +``` + + + +#### requête locale + + + +Exemple requête sur la région (01) PACA (93) 'i4-01-93-00' ou 'i4-01-93' + +```sql +SELECT + count(id_station_itinerance) AS nb_stat, + region.code +FROM + station + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id +WHERE + region.code = '93' +GROUP BY + region.code +ORDER BY + nb_stat DESC +``` + + + +#### requête locale avec critère + + + +Exemple requête sur la région (01) PACA (93) par EPCI (03) 'i4-01-93-03' + +```sql +SELECT + count(id_station_itinerance) AS nb_stat, + epci.code +FROM + station + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id +WHERE + region.code = '93' +GROUP BY + epci.code +ORDER BY + nb_stat DESC +``` + + +### I5 : Nombre de stations ouvertes au public pour 100 000 habitants + +'nb_stat_pop' est le nombre de stations pour 100 000 habitants. + + +#### requête globale + + + +Exemple requête globale : 'i5-0-00-0' ou 'i5' + +```sql +SELECT + ( + SELECT + count(id_station_itinerance) AS nb_stat + FROM + station + ) / ( + SELECT + sum(population) + FROM + region + ) * 100000 AS nb_stat_pop +``` + + + +#### requête globale avec critère + + + +Exemple requête globale avec une répartition par région (01) 'i5-00-00-01' ou 'i5---01' + +```sql +WITH + i4 AS ( + SELECT + count(id_station_itinerance) AS nb_stat, + region.code + FROM + station + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + GROUP BY + region.code + ORDER BY + nb_stat DESC + ) +SELECT + i4.nb_stat::float / region.population * 100000 AS nb_stat_pop, + region.code +FROM + i4 + LEFT JOIN region on i4.code = region.code +ORDER by + nb_stat_pop DESC +``` + + + +#### requête locale + + + +Exemple requête sur la région (01) PACA (93) 'i5-01-93-00' ou 'i5-01-93' + +```sql +SELECT + ( + SELECT + count(id_station_itinerance) AS nb_stat + FROM + station + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + ORDER BY + nb_stat DESC + ) / ( + SELECT + sum(population) + FROM + region + WHERE + region.code = '93' + ) * 100000 AS nb_stat_pop +``` + + + +#### requête locale avec critère + + + +Exemple requête sur la région (01) PACA (93) par département (02) 'i5-01-93-03' + +```sql +WITH + i4 AS ( + SELECT + count(id_station_itinerance) AS nb_stat, + epci.code + FROM + station + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN epci on city.epci_id = epci.id + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + GROUP BY + epci.code + ORDER BY + nb_stat DESC + ) +SELECT + i4.nb_stat::float / epci.population * 100000 AS nb_stat_pop, + epci.code +FROM + i4 + LEFT JOIN epci on i4.code = epci.code +ORDER by + nb_stat_pop DESC``` + + +### I6 : Nombre de stations ouvertes au public pour 100 km2 + +'nb_stat_area' est le nombre de stations pour 100 km2. + + +#### requête globale + + + +Exemple requête globale : 'i6-0-00-0' ou 'i6' + +```sql +SELECT + ( + SELECT + count(id_station_itinerance) AS nb_stat + FROM + station + ) / ( + SELECT + sum(area::float) + FROM + region + + ) * 100000000 AS nb_stat_area +``` + + + +#### requête globale avec critère + + + +Exemple requête globale avec une répartition par région (01) 'i6-00-00-01' ou 'i6---01' + +```sql +WITH + i4 AS ( + SELECT + count(id_station_itinerance) AS nb_stat, + region.code + FROM + station + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + GROUP BY + region.code + ORDER BY + nb_stat DESC + ) +SELECT + i4.nb_stat::float / region.area::float * 100000000 AS nb_stat_area, + region.code +FROM + i4 + LEFT JOIN region on i4.code = region.code +ORDER by + nb_stat_area DESC +``` + + + +#### requête locale + + + +Exemple requête sur la région (01) PACA (93) 'i6-01-93-00' ou 'i6-01-93' + +```sql +SELECT + ( + SELECT + count(id_station_itinerance) AS nb_stat + FROM + station + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + ORDER BY + nb_stat DESC + ) / ( + SELECT + sum(area::float) + FROM + region + WHERE + region.code = '93' + ) * 100000000 AS nb_stat_area +``` + + + +#### requête locale avec critère + + + +Exemple requête sur la région (01) PACA (93) par département (02) 'i6-01-93-03' + +```sql +WITH + i4 AS ( + SELECT + count(id_station_itinerance) AS nb_stat, + epci.code + FROM + station + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN epci on city.epci_id = epci.id + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + GROUP BY + epci.code + ORDER BY + nb_stat DESC + ) +SELECT + i4.nb_stat::float / epci.area::float * 100000000 AS nb_stat_area, + epci.code +FROM + i4 + LEFT JOIN epci on i4.code = epci.code +ORDER by + nb_stat_area DESC +``` + + +### I7 : Puissance installée + +'p_nom' est la puissance nominale cumulée + + +#### requête globale + + + +Exemple requête globale : 'i7-00-00' ou 'i7' + +```sql +SELECT + sum(puissance_nominale) AS p_nom +FROM + pointdecharge +``` + + + +#### requête globale avec critère + + + +Exemple requête globale avec une répartition par région (01) 'i7-00-00-01' ou 'i7---01' + +```sql +SELECT + sum(puissance_nominale) AS p_nom, + region.code +FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id +GROUP BY + region.code +ORDER BY + p_nom DESC +``` + + + +#### requête locale + + + +Exemple requête sur la région (01) PACA (93) 'i7-01-93-00' ou 'i7-01-93' + +```sql +SELECT + sum(puissance_nominale) AS p_nom, + region.code +FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id +WHERE + region.code = '93' +GROUP BY + region.code +ORDER BY + p_nom DESC +``` + + + +#### requête locale avec critère + + + +Exemple requête sur la région (01) PACA (93) par department (04) 'i7-01-93-04' + +```sql +SELECT + sum(puissance_nominale) AS p_nom, + city.code +FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id +WHERE + region.code = '93' +GROUP BY + city.code +ORDER BY + p_nom DESC +``` + + + +### I8 : Puissance installée pour 100 000 habitants + +'p_nom_pop' est la puissance nominale cumulée pour 100 000 habitants + + + +#### requête globale + + + +Exemple requête globale : 'i8-0-00-0' ou 'i8' + +```sql +SELECT + ( + SELECT + sum(puissance_nominale) AS p_nom + FROM + pointdecharge + ) / ( + SELECT + sum(population) + FROM + region + ) * 100000 AS p_nom_pop +``` + + + +#### requête globale avec critère + + + +Exemple requête globale avec une répartition par région (01) 'i8-00-00-01' ou 'i8---01' + +```sql +WITH + i7 AS ( + SELECT + sum(puissance_nominale) AS p_nom, + region.code + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + GROUP BY + region.code + ORDER BY + p_nom DESC + ) +SELECT + i7.p_nom::float / region.population * 100000 AS p_nom_pop, + region.code +FROM + i7 + LEFT JOIN region on i7.code = region.code +ORDER by + p_nom_pop DESC ``` @@ -291,24 +1279,32 @@ ORDER BY -Exemple requête sur la région (01) PACA (93) 'i4-01-93-00' ou 'i4-01-93' +Exemple requête sur la région (01) PACA (93) 'i8-01-93-00' ou 'i8-01-93' ```sql -SELECT - count(id_station_itinerance) AS nb_stat, - region.code -FROM - station - LEFT JOIN localisation ON localisation_id = localisation.id - LEFT JOIN city on city.code = code_insee_commune - LEFT JOIN department on city.department_id = department.id - LEFT JOIN region on department.region_id = region.id -WHERE - region.code = '93' -GROUP BY - region.code -ORDER BY - nb_stat DESC +SELECT + ( + SELECT + sum(puissance_nominale) AS p_nom + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + ORDER BY + p_nom DESC + ) / ( + SELECT + sum(population) + FROM + region + WHERE + region.code = '93' + ) * 100000 AS p_nom_pop ``` @@ -317,43 +1313,65 @@ ORDER BY -Exemple requête sur la région (01) PACA (93) par EPCI (03) 'i4-01-93-03' +Exemple requête sur la région (01) PACA (93) par commune (04) 'i8-01-93-04' ```sql +WITH + i7 AS ( + SELECT + sum(puissance_nominale) AS p_nom, + city.code + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + GROUP BY + city.code + ORDER BY + p_nom DESC + ) SELECT - count(id_station_itinerance) AS nb_stat, - epci.code + i7.p_nom::float / city.population * 100000 AS p_nom_pop, + city.code FROM - station - LEFT JOIN localisation ON localisation_id = localisation.id - LEFT JOIN city on city.code = code_insee_commune - LEFT JOIN department on city.department_id = department.id - LEFT JOIN region on department.region_id = region.id -WHERE - region.code = '93' -GROUP BY - epci.code -ORDER BY - nb_stat DESC + i7 + LEFT JOIN city on i7.code = city.code +ORDER by + p_nom_pop DESC ``` -### I7 : Puissance installée + +### I9 : Puissance installée pour 100 km2 -'p_nom' est la puissance nominale cumulée +'p_nom_area' est la puissance nominale cumulée pour 100 km2. + #### requête globale -Exemple requête globale : 'i7-00-00' ou 'i7' +Exemple requête globale : 'i9-0-00-0' ou 'i9' ```sql -SELECT - sum(puissance_nominale) AS p_nom -FROM - pointdecharge +SELECT + ( + SELECT + sum(puissance_nominale) AS p_nom + FROM + pointdecharge + ) / ( + SELECT + sum(area::float) + FROM + region + ) * 100000000 AS p_nom_area ``` @@ -362,23 +1380,34 @@ FROM -Exemple requête globale avec une répartition par région (01) 'i7-00-00-01' ou 'i7---01' +Exemple requête globale avec une répartition par région (01) 'i9-00-00-01' ou 'i9---01' ```sql +WITH + i7 AS ( + SELECT + sum(puissance_nominale) AS p_nom, + region.code + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + GROUP BY + region.code + ORDER BY + p_nom DESC + ) SELECT - sum(puissance_nominale) AS p_nom, - region.code + i7.p_nom::float / region.area::float * 100000000 AS p_nom_area, + region.code FROM - pointdecharge - LEFT JOIN station ON station.id = station_id - LEFT JOIN localisation ON localisation_id = localisation.id - LEFT JOIN city on city.code = code_insee_commune - LEFT JOIN department on city.department_id = department.id - LEFT JOIN region on department.region_id = region.id -GROUP BY - region.code -ORDER BY - p_nom DESC + i7 + LEFT JOIN region on i7.code = region.code +ORDER by + p_nom_area DESC ``` @@ -387,25 +1416,32 @@ ORDER BY -Exemple requête sur la région (01) PACA (93) 'i7-01-93-00' ou 'i7-01-93' +Exemple requête sur la région (01) PACA (93) 'i9-01-93-00' ou 'i9-01-93' ```sql -SELECT - sum(puissance_nominale) AS p_nom, - region.code -FROM - pointdecharge - LEFT JOIN station ON station.id = station_id - LEFT JOIN localisation ON localisation_id = localisation.id - LEFT JOIN city on city.code = code_insee_commune - LEFT JOIN department on city.department_id = department.id - LEFT JOIN region on department.region_id = region.id -WHERE - region.code = '93' -GROUP BY - region.code -ORDER BY - p_nom DESC +SELECT + ( + SELECT + sum(puissance_nominale) AS p_nom + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + ORDER BY + p_nom DESC + ) / ( + SELECT + sum(area::float) + FROM + region + WHERE + region.code = '93' + ) * 100000000 AS p_nom_area ``` @@ -414,34 +1450,45 @@ ORDER BY -Exemple requête sur la région (01) PACA (93) par department (04) 'i7-01-93-04' +Exemple requête sur la région (01) PACA (93) par commune (04) 'i9-01-93-04' ```sql +WITH + i7 AS ( + SELECT + sum(puissance_nominale) AS p_nom, + city.code + FROM + pointdecharge + LEFT JOIN station ON station.id = station_id + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN department on city.department_id = department.id + LEFT JOIN region on department.region_id = region.id + WHERE + region.code = '93' + GROUP BY + city.code + ORDER BY + p_nom DESC + ) SELECT - sum(puissance_nominale) AS p_nom, + i7.p_nom::float / city.area::float * 100000000 AS p_nom_area, city.code FROM - pointdecharge - LEFT JOIN station ON station.id = station_id - LEFT JOIN localisation ON localisation_id = localisation.id - LEFT JOIN city on city.code = code_insee_commune - LEFT JOIN department on city.department_id = department.id - LEFT JOIN region on department.region_id = region.id -WHERE - region.code = '93' -GROUP BY - city.code -ORDER BY - p_nom DESC + i7 + LEFT JOIN city on i7.code = city.code +ORDER by + p_nom_area DESC ``` ## Infrastructure - typologie -Les indicateurs 't1' à 't6' sont pris en compte, les indicateurs 't8' et 't9' sont ajoutés dans la prochaine version. +Les indicateurs 't1' à 't6' ainsi que 't8' et 't9' sont pris en compte. -L'indicateur 't7' reste à construire (non prioritaire). +L'indicateur 't7' reste à construire. @@ -947,6 +1994,141 @@ FROM ``` +### T8 : Nombre de stations par opérateur + +'nb_stations' est le nombre de stations. + +'nom_operateur' est le nom de l'opérateur. + +ex. il y a 3010 stations (nb_stations) IZIVIA (nom-operateur). + + +#### requête globale + + + +Exemple requête globale : 't8-00-00' ou 't8' + +```sql +SELECT + count(id_station_itinerance) AS nb_stations, + nom_operateur +FROM + station + LEFT JOIN operateur ON operateur_id = operateur.id +GROUP BY + nom_operateur +ORDER BY + nb_stations DESC +``` + + + +#### requête locale + + + +Exemple requête sur l'EPCI (03) Métropole Rouen Normandie (200023414) 't8-03-200023414' +```sql +SELECT + count(id_station_itinerance) AS nb_stations, + nom_operateur +FROM + station + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN epci on city.epci_id = epci.id + LEFT JOIN operateur ON operateur_id = operateur.id +WHERE + epci.code = '200023414' +GROUP BY + nom_operateur +ORDER BY + nb_stations DESC +``` + + +### T9 : Pourcentage de stations par opérateur + +'pct_nb_stations' est le nombre de stations. + +'nom_operateur' est le nom de l'opérateur. + +ex. il y a 3010 stations (nb_stations) IZIVIA (nom-operateur). + + +#### requête globale + + + +Exemple requête globale : 't9-00-00' ou 't9' + +```sql +WITH + t8 AS ( + SELECT + count(id_station_itinerance) AS nb_stations, + nom_operateur + FROM + station + LEFT JOIN operateur ON operateur_id = operateur.id + GROUP BY + nom_operateur + ORDER BY + nb_stations DESC + ) +SELECT + nb_stations / ( + SELECT + sum(nb_stations) + FROM + t8 + ) * 100 AS pct_nb_stations, + nom_operateur +FROM + t8 +``` + + + +#### requête locale + + + +Exemple requête sur l'EPCI (03) Métropole Rouen Normandie (200023414) 't9-03-200023414' + +```sql +WITH + t8 AS ( + SELECT + count(id_station_itinerance) AS nb_stations, + nom_operateur + FROM + station + LEFT JOIN localisation ON localisation_id = localisation.id + LEFT JOIN city on city.code = code_insee_commune + LEFT JOIN epci on city.epci_id = epci.id + LEFT JOIN operateur ON operateur_id = operateur.id + WHERE + epci.code = '200023414' + GROUP BY + nom_operateur + ORDER BY + nb_stations DESC + ) +SELECT + nb_stations / ( + SELECT + sum(nb_stations) + FROM + t8 + ) * 100 AS pct_nb_stations, + nom_operateur +FROM + t8 +``` + + ### Autres indicateurs de typologie diff --git a/src/notebook/misc/create_indicators.md b/src/notebook/misc/create_indicators.md index cbe44fcc..ca41b454 100644 --- a/src/notebook/misc/create_indicators.md +++ b/src/notebook/misc/create_indicators.md @@ -27,13 +27,13 @@ La présentation des requêtes associée est présentée sur [ce notebook](../in ```python editable=true slideshow={"slide_type": ""} import os import pandas as pd +import geopandas as gpd from sqlalchemy import create_engine from create_query import to_indicator #, create_table_pop # Connecteur à la base Qualicharge engine = create_engine(os.getenv("DATABASE_URL")) -# create_table_pop(engine) ``` @@ -213,41 +213,45 @@ query_gen = to_indicator(engine, 'i1-01-93-02', simple=True, format='query', que print(query_gen) ``` -### I4 : Nombre de stations ouvertes au public + +### I2 : Nombre de points de recharge ouverts au public pour 100 000 habitants -'nb_stat' est le nombre de stations. +'nb_pdc_pop' est le nombre de points de recharge pour 100 000 habitants. + #### requête globale ```python -to_indicator(engine, 'i4-0', simple=True) +to_indicator(engine, 'i2') +``` + +```python +to_indicator(engine, 'i2-00-00-00', simple=False) ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 'i4', simple=True, format='query')) +print(to_indicator(engine, 'i2', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 'i4', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i2', simple=True, format='query', query_gen=True) print(query_gen) ``` - #### requête globale avec critère - ```python -to_indicator(engine, 'i4-0-xx-01')[:5] +to_indicator(engine, 'i2-00-00-01')[:5] ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 'i4-0-xx-01', simple=True, format='query')) +print(to_indicator(engine, 'i2-00-00-01', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 'i4-0-xx-01', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i2---01', simple=True, format='query', query_gen=True) print(query_gen) ``` @@ -256,15 +260,19 @@ print(query_gen) ```python -to_indicator(engine, 'i4-01-93-0') +to_indicator(engine, 'i2-01-93-00') ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 'i4-01-93-0', simple=True, format='query')) +print(to_indicator(engine, 'i2-01-93-00', simple=True, format='query')) +``` + +```python +to_indicator(engine, 'i2-01-93') ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 'i4-01-93-0', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i2-01-93', simple=True, format='query', query_gen=True) print(query_gen) ``` @@ -273,22 +281,23 @@ print(query_gen) ```python editable=true slideshow={"slide_type": ""} -to_indicator(engine, 'i4-01-93-03')[:5] +paca_epci = 'i2-01-93-02' +to_indicator(engine, paca_epci, simple=True)[:10] ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 'i4-01-93-03', simple=True, format='query')) +print(to_indicator(engine, 'i2-01-93-02', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 'i4-01-93-03', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i2-01-93-02', simple=True, format='query', query_gen=True) print(query_gen) ``` -### I7 : Puissance installée +### I3 : Nombre de points de recharge ouverts au public pour 100 km2 -'p_nom' est la puissance nominale cumulée +'nb_pdc_area' est le nombre de points de recharge pour 100 km2. @@ -296,34 +305,34 @@ print(query_gen) ```python -to_indicator(engine, 'i7', simple=True) +to_indicator(engine, 'i3') +``` + +```python +to_indicator(engine, 'i3-00-00-00', simple=False) ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 'i7', simple=True, format='query')) +print(to_indicator(engine, 'i3', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 'i7', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i3', simple=True, format='query', query_gen=True) print(query_gen) ``` - #### requête globale avec critère - ```python -i7_nat = to_indicator(engine, 'i7-0--01') -print(i7_nat['p_nom'].sum()) -i7_nat[:5] +to_indicator(engine, 'i3-00-00-01')[:5] ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 'i7-0--01', simple=True, format='query')) +print(to_indicator(engine, 'i3-00-00-01', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 'i7-0--01', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i3---01', simple=True, format='query', query_gen=True) print(query_gen) ``` @@ -332,15 +341,19 @@ print(query_gen) ```python -to_indicator(engine, 'i7-01-93-00', simple=True) +to_indicator(engine, 'i3-01-93-00') ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 'i7-01-93-00', simple=True, format='query')) +print(to_indicator(engine, 'i3-01-93-00', simple=True, format='query')) +``` + +```python +to_indicator(engine, 'i3-01-93') ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 'i7-01-93-00', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i3-01-93', simple=True, format='query', query_gen=True) print(query_gen) ``` @@ -348,53 +361,55 @@ print(query_gen) #### requête locale avec critère -```python -i7_paca_city = to_indicator(engine, 'i7-01-93-04', simple=True) -i7_paca_city[:5] +```python editable=true slideshow={"slide_type": ""} +paca_epci = 'i3-01-93-02' +to_indicator(engine, paca_epci, simple=True)[:10] ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 'i7-01-93-04', simple=True, format='query')) +print(to_indicator(engine, 'i3-01-93-02', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 'i7-01-93-04', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i3-01-93-02', simple=True, format='query', query_gen=True) print(query_gen) ``` -## Infrastructure - typologie - -Les indicateurs 't1' à 't6' sont pris en compte. - -L'indicateur 't7' reste à construire (non prioritaire). - -Les autres indicateurs sont à définir ( +### I4 : Nombre de stations ouvertes au public +'nb_stat' est le nombre de stations. -### T1 : Nombre de points de recharge par niveau de puissance + +#### requête globale + -'nb_pdc' est le nombre de points de recharge. +```python +to_indicator(engine, 'i4-0', simple=True) +``` -'p-range' est la plage de puissance (ex. [65, 175) -> de 65 inclus à 175 exclus) +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i4', simple=True, format='query')) +``` -'p-cat' est l'index de la catégorie (1 pour la catégorie la plus basse) +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i4', simple=True, format='query', query_gen=True) +print(query_gen) +``` -#### requête globale +#### requête globale avec critère ```python -t1_nat = to_indicator(engine, 't1-00') -print(t1_nat['nb_pdc'].sum()) -t1_nat +to_indicator(engine, 'i4-0-xx-01')[:5] ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't1-00', simple=True, format='query')) +print(to_indicator(engine, 'i4-0-xx-01', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't1-00', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i4-0-xx-01', simple=True, format='query', query_gen=True) print(query_gen) ``` @@ -403,162 +418,218 @@ print(query_gen) ```python -to_indicator(engine, 't1-02-75') +to_indicator(engine, 'i4-01-93-0') ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't1-02-75', simple=True, format='query')) +print(to_indicator(engine, 'i4-01-93-0', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't1-02-75', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i4-01-93-0', simple=True, format='query', query_gen=True) print(query_gen) ``` -### T2 : Pourcentage de points de recharge par niveau de puissance + +#### requête locale avec critère + -Indicateur similaire à 't1' ( 'pct_nb_pdc' remplace 'nb_pdc'). +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 'i4-01-93-03')[:5] +``` -'pct_nb_pdc' est le pourcentage de pdc pour le niveau de puissance. +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i4-01-93-03', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i4-01-93-03', simple=True, format='query', query_gen=True) +print(query_gen) +``` + +### I5 : Nombre de stations ouvertes au public pour 100 000 habitants + +'nb_stat_pop' est le nombre de stations pour 100 000 habitants. #### requête globale ```python -to_indicator(engine, 't2', simple=False) +to_indicator(engine, 'i5-0', simple=True) ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't2', simple=True, format='query')) +print(to_indicator(engine, 'i5', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't2', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i5', simple=True, format='query', query_gen=True) print(query_gen) ``` -#### requête locale +#### requête globale avec critère ```python -to_indicator(engine, 't2-02-75', simple=True) +to_indicator(engine, 'i5-0-xx-01')[:5] ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't2-02-75', simple=True, format='query')) +print(to_indicator(engine, 'i5-0-xx-01', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't2-02-75', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i5-0-xx-01', simple=True, format='query', query_gen=True) print(query_gen) ``` -### T3 : Nombre de stations par nombre de points de recharge + +#### requête locale + -'nb_stations' est le nombre de stations. +```python +to_indicator(engine, 'i5-01-93-0') +``` -'nb_pdc' est le nombre de pdc. +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i5-01-93-0', simple=True, format='query')) +``` -ex. il y a 2790 stations (nb_stations) avec un seul pdc (nb_pdc). +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i5-01-93-0', simple=True, format='query', query_gen=True) +print(query_gen) +``` -#### requête globale +#### requête locale avec critère ```python editable=true slideshow={"slide_type": ""} -to_indicator(engine, 't3-00', simple=False)[:5] +to_indicator(engine, 'i5-01-93-03')[:5] ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't3', simple=True, format='query')) +print(to_indicator(engine, 'i5-01-93-03', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't3', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i5-01-93-03', simple=True, format='query', query_gen=True) print(query_gen) ``` +### I6 : Nombre de stations ouvertes au public pour 100 km2 + +'nb_stat_area' est le nombre de stations pour 100 km2. + -#### requête locale +#### requête globale -```python editable=true slideshow={"slide_type": ""} -to_indicator(engine, 't3-04-13001', simple=False) +```python +to_indicator(engine, 'i6-0', simple=True) ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't3-04-13001', simple=True, format='query')) +print(to_indicator(engine, 'i6', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't3-04-13001', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i6', simple=True, format='query', query_gen=True) print(query_gen) ``` -### T4 : Pourcentage de stations par nombre de points de recharge + +#### requête globale avec critère + -Indicateur similaire à 't3' ( 'pct_nb_stations' remplace 'nb_stations'). +```python +to_indicator(engine, 'i6-0-xx-01')[:5] +``` -'pct_nb_stations' est le pourcentage de stations avec un nombre de pdc donné. +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i6-0-xx-01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i6-0-xx-01', simple=True, format='query', query_gen=True) +print(query_gen) +``` -#### requête globale +#### requête locale ```python -to_indicator(engine, 't4', simple=False)[:5] +to_indicator(engine, 'i6-01-93-0') ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't4', simple=True, format='query')) +print(to_indicator(engine, 'i6-01-93-0', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't4', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i6-01-93-0', simple=True, format='query', query_gen=True) print(query_gen) ``` -#### requête locale +#### requête locale avec critère ```python editable=true slideshow={"slide_type": ""} -to_indicator(engine, 't4-04-13001', simple=False) +to_indicator(engine, 'i6-01-93-03')[:5] ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't4-04-13001', simple=True, format='query')) +print(to_indicator(engine, 'i6-01-93-03', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't4-04-13001', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i6-01-93-03', simple=True, format='query', query_gen=True) print(query_gen) ``` -### T5 : Nombre de stations par type d’implantation - -'nb_stations' est le nombre de stations. + +### I7 : Puissance installée -'implantation' est le type d'implantation +'p_nom' est la puissance nominale cumulée + #### requête globale ```python -t5_nat = to_indicator(engine, 't5-00') -print(t5_nat['nb_stations'].sum()) -t5_nat[:10] +to_indicator(engine, 'i7', simple=True) ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't5', simple=True, format='query')) +print(to_indicator(engine, 'i7', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't5', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i7', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête globale avec critère + + +```python +i7_nat = to_indicator(engine, 'i7-0--01') +print(i7_nat['p_nom'].sum()) +i7_nat[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i7-0--01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i7-0--01', simple=True, format='query', query_gen=True) print(query_gen) ``` @@ -567,38 +638,73 @@ print(query_gen) ```python -to_indicator(engine, 't5-03-200023414', simple=False) +to_indicator(engine, 'i7-01-93-00', simple=True) ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't5-03-200023414', simple=True, format='query')) +print(to_indicator(engine, 'i7-01-93-00', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't5-03-200023414', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i7-01-93-00', simple=True, format='query', query_gen=True) print(query_gen) ``` -### T6 : Pourcentage de stations par type d’implantation + +#### requête locale avec critère + -Indicateur similaire à 't5' ( 'pct_nb_stations' remplace 'nb_stations'). +```python +i7_paca_city = to_indicator(engine, 'i7-01-93-04', simple=True) +i7_paca_city[:5] +``` -'pct_nb_stations' est le pourcentage de stations avec un type d'implantation donné. +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i7-01-93-04', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i7-01-93-04', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +### I8 : Puissance installée pour 100 000 habitants + +'p_nom_pop' est la puissance nominale cumulée pour 100 000 habitants + #### requête globale ```python -to_indicator(engine, 't6') +to_indicator(engine, 'i8', simple=True) ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't6', simple=True, format='query')) +print(to_indicator(engine, 'i8', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't6', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i8', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête globale avec critère + + +```python +to_indicator(engine, 'i8-0--01')[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i8-0--01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i8-0--01', simple=True, format='query', query_gen=True) print(query_gen) ``` @@ -607,15 +713,729 @@ print(query_gen) ```python -to_indicator(engine, 't6-03-200023414') +to_indicator(engine, 'i8-01-93-00', simple=True) ``` ```python editable=true slideshow={"slide_type": ""} -print(to_indicator(engine, 't6-03-200023414', simple=True, format='query')) +print(to_indicator(engine, 'i8-01-93-00', simple=True, format='query')) ``` ```python editable=true slideshow={"slide_type": ""} -query_gen = to_indicator(engine, 't6-03-200023414', simple=True, format='query', query_gen=True) +query_gen = to_indicator(engine, 'i8-01-93-00', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale avec critère + + +```python +i7_paca_city = to_indicator(engine, 'i8-01-93-04', simple=True) +i7_paca_city[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i8-01-93-04', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i8-01-93-04', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +### I9 : Puissance installée pour 100 km2 + +'p_nom_area' est la puissance nominale cumulée pour 100 km2. + + + +#### requête globale + + +```python +to_indicator(engine, 'i9', simple=True) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i9', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i9', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête globale avec critère + + +```python +to_indicator(engine, 'i9-0--01')[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i9-0--01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i9-0--01', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale + + +```python +to_indicator(engine, 'i9-01-93-00', simple=True) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i9-01-93-00', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i9-01-93-00', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale avec critère + + +```python +i7_paca_city = to_indicator(engine, 'i9-01-93-04', simple=True) +i7_paca_city[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 'i9-01-93-04', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 'i9-01-93-04', simple=True, format='query', query_gen=True) +print(query_gen) +``` + +## Infrastructure - typologie + +Les indicateurs 't1' à 't6' sont pris en compte. + +L'indicateur 't7' reste à construire (non prioritaire). + +Les autres indicateurs sont à définir ( + + +### T1 : Nombre de points de recharge par niveau de puissance + +'nb_pdc' est le nombre de points de recharge. + +'p-range' est la plage de puissance (ex. [65, 175) -> de 65 inclus à 175 exclus) + +'p-cat' est l'index de la catégorie (1 pour la catégorie la plus basse) + + +#### requête globale + + +```python +t1_nat = to_indicator(engine, 't1-00') +print(t1_nat['nb_pdc'].sum()) +t1_nat +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't1-00', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't1-00', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête globale avec critère + + +```python +to_indicator(engine, 't1-0-xx-01')[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't1-0-xx-01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't1-0-xx-01', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale + + +```python +to_indicator(engine, 't1-02-75') +``` + +```python +to_indicator(engine, 't1-02-75', histo=True) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't1-02-75', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't1-02-75', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale avec critère + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't1-02-93-04')[:10] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't1-02-93-04', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't1-02-93-04', simple=True, format='query', query_gen=True) +print(query_gen) +``` + +### T2 : Pourcentage de points de recharge par niveau de puissance + +Indicateur similaire à 't1' ( 'pct_nb_pdc' remplace 'nb_pdc'). + +'pct_nb_pdc' est le pourcentage de pdc pour le niveau de puissance. + + +#### requête globale + + +```python +to_indicator(engine, 't2', simple=False) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't2', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't2', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête globale avec critère + + +```python +to_indicator(engine, 't2-0-xx-01')[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't2-0-xx-01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't2-0-xx-01', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale + + +```python +to_indicator(engine, 't2-02-75', simple=True) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't2-02-75', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't2-02-75', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale avec critère + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't2-02-93-04')[:10] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't2-02-93-04', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't2-02-93-04', simple=True, format='query', query_gen=True) +print(query_gen) +``` + +### T3 : Nombre de stations par nombre de points de recharge + +'nb_stations' est le nombre de stations. + +'nb_pdc' est le nombre de pdc. + +ex. il y a 2790 stations (nb_stations) avec un seul pdc (nb_pdc). + + +#### requête globale + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't3-00', simple=False)[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't3', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't3', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête globale avec critère + + +```python +to_indicator(engine, 't3-0-xx-01')[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't3-0-xx-01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't3-0-xx-01', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't3-04-13001', simple=False) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't3-04-13001', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't3-04-13001', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale avec critère + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't3-02-93-04')[:10] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't3-02-93-04', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't3-02-93-04', simple=True, format='query', query_gen=True) +print(query_gen) +``` + +### T4 : Pourcentage de stations par nombre de points de recharge + +Indicateur similaire à 't3' ( 'pct_nb_stations' remplace 'nb_stations'). + +'pct_nb_stations' est le pourcentage de stations avec un nombre de pdc donné. + + +#### requête globale + + +```python +to_indicator(engine, 't4', simple=False)[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't4', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't4', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête globale avec critère + + +```python +to_indicator(engine, 't4-0-xx-01')[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't4-0-xx-01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't4-0-xx-01', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't4-04-13001', simple=False) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't4-04-13001', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't4-04-13001', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale avec critère + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't4-02-93-04')[:10] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't4-02-93-04', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't4-02-93-04', simple=True, format='query', query_gen=True) +print(query_gen) +``` + +### T5 : Nombre de stations par type d’implantation + +'nb_stations' est le nombre de stations. + +'implantation' est le type d'implantation + + +#### requête globale + + +```python +t5_nat = to_indicator(engine, 't5-00') +print(t5_nat['nb_stations'].sum()) +t5_nat[:10] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't5', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't5', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête globale avec critère + + +```python +to_indicator(engine, 't5-0-xx-01')[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't5-0-xx-01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't5-0-xx-01', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale + + +```python +to_indicator(engine, 't5-03-200023414', simple=False) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't5-03-200023414', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't5-03-200023414', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale avec critère + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't5-03-200023414-04')[:10] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't5-03-200023414-04', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't5-03-200023414-04', simple=True, format='query', query_gen=True) +print(query_gen) +``` + +### T6 : Pourcentage de stations par type d’implantation + +Indicateur similaire à 't5' ( 'pct_nb_stations' remplace 'nb_stations'). + +'pct_nb_stations' est le pourcentage de stations avec un type d'implantation donné. + + +#### requête globale + + +```python +to_indicator(engine, 't6') +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't6', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't6', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête globale avec critère + + +```python +to_indicator(engine, 't6-0-xx-01')[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't6-0-xx-01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't6-0-xx-01', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale + + +```python +to_indicator(engine, 't6-03-200023414') +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't6-03-200023414', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't6-03-200023414', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale avec critère + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't6-03-200023414-04')[:10] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't6-03-200023414-04', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't6-03-200023414-04', simple=True, format='query', query_gen=True) +print(query_gen) +``` + +### T8 : Nombre de stations par opérateur + +'nb_stations' est le nombre de stations. + +'nom_operateur' est le nom de l'opérateur. + +ex. il y a 3010 stations (nb_stations) IZIVIA (nom-operateur). + + +#### requête globale + + +```python +to_indicator(engine, 't8') +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't8', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't8', simple=True, format='query', query_gen=True)) +``` + + +#### requête globale avec critère + + +```python +to_indicator(engine, 't8-0-xx-01')[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't8-0-xx-01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't8-0-xx-01', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale + + +```python +to_indicator(engine, 't8-03-200023414') +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't8-03-200023414', simple=True, format='query')) +``` + +```python +print(to_indicator(engine, 't8-01-93', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't8-01-93', simple=True, format='query')) +``` + + +#### requête locale avec critère + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't8-01-93-02')[:10] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't8-01-93-03', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't8-01-93-03', simple=True, format='query', query_gen=True) +print(query_gen) +``` + +### T9 : Pourcentage de stations par opérateur + +'pct_nb_stations' est le nombre de stations. + +'nom_operateur' est le nom de l'opérateur. + +ex. il y a 3010 stations (nb_stations) IZIVIA (nom-operateur). + + +#### requête globale + + +```python +to_indicator(engine, 't9') +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't9', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't9', simple=True, format='query', query_gen=True)) +``` + + +#### requête globale avec critère + + +```python +to_indicator(engine, 't9-0-xx-01')[:5] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't9-0-xx-01', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't9-0-xx-01', simple=True, format='query', query_gen=True) +print(query_gen) +``` + + +#### requête locale + + +```python +to_indicator(engine, 't9-03-200023414') +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't9-03-200023414', simple=True, format='query')) +``` + +```python +print(to_indicator(engine, 't9-01-93', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't8-01-93', simple=True, format='query')) +``` + + +#### requête locale avec critère + + +```python editable=true slideshow={"slide_type": ""} +to_indicator(engine, 't9-01-93-02')[:10] +``` + +```python editable=true slideshow={"slide_type": ""} +print(to_indicator(engine, 't9-01-93-03', simple=True, format='query')) +``` + +```python editable=true slideshow={"slide_type": ""} +query_gen = to_indicator(engine, 't9-01-93-03', simple=True, format='query', query_gen=True) print(query_gen) ``` diff --git a/src/notebook/misc/create_query.py b/src/notebook/misc/create_query.py index 8d73d55b..56cc4858 100644 --- a/src/notebook/misc/create_query.py +++ b/src/notebook/misc/create_query.py @@ -20,6 +20,8 @@ import pandas as pd import sys +from sqlalchemy import types, dialects +from pydantic import BaseModel create_query = sys.modules[__name__] @@ -34,26 +36,26 @@ )""" JOIN_P = "LEFT JOIN puissance ON puissance_nominale::numeric <@ p_range " PDC_ALL = f"""pointdecharge - LEFT JOIN station ON station.id = station_id - LEFT JOIN localisation ON localisation_id = localisation.id""" -COG_ALL = f"""LEFT JOIN city on city.code = code_insee_commune - LEFT JOIN epci on city.epci_id = epci.id - LEFT JOIN department on city.department_id = department.id - LEFT JOIN region on department.region_id = region.id""" + INNER JOIN station ON station.id = station_id + INNER JOIN localisation ON localisation_id = localisation.id""" +COG_ALL = f"""INNER JOIN city on city.code = code_insee_commune + INNER JOIN epci on city.epci_id = epci.id + INNER JOIN department on city.department_id = department.id + INNER JOIN region on department.region_id = region.id""" STAT_ALL = f"""station - LEFT JOIN localisation ON localisation_id = localisation.id""" + INNER JOIN localisation ON localisation_id = localisation.id""" TABLE = {'00': 'national', '01': 'region', '02': 'department', '03': 'epci', '04': 'city'} G_OVERHEAD = f"""QUERY, VAL, - LEVEL, - AREA""" + PERIM, + LEVEL""" STAT_NB_PDC = f"""stat_nb_pdc AS ( SELECT count(station_id) AS nb_pdc, localisation_id FROM pointdecharge - LEFT JOIN station ON station.id = station_id + INNER JOIN station ON station.id = station_id GROUP BY station_id, localisation_id @@ -62,8 +64,9 @@ # URL_POP = 'https://unpkg.com/@etalab/decoupage-administratif@4.0.0/data/communes.json' # POP = None -def to_indicator(engine, indicator, simple=True, histo=False, format='pandas', histo_timest=None, json_orient='split', - table_name=None, table_option="replace", query_gen=False): +def to_indicator(engine, indicator, simple=True, histo=False, format='pandas', histo_timest=None, histo_period=None, + json_orient='split', table_name=None, table_option="replace", table_dtype=None, query_gen=False, + test=None): """create data for an indicator Parameters @@ -86,13 +89,19 @@ def to_indicator(engine, indicator, simple=True, histo=False, format='pandas', h Json structure (see 'orient' option for 'DataFrame.to_json'). histo_timest: string (used if histo=True), default None Value of timestamp. If None the timestamp is the execution query timestamp. + histo_period: string (used if histo=True), default 'm' + Value of initial periodicity ('h', 'd', 'm', 'w', 'y') table_name: string (used if format='table'), default None Name of the table to create (format='table'). If None the name is the indicator name. table_option: string (used if format='table'), default 'replace' Option if table exists ('replace' or 'append') + table_dtype: dict (used if format='table'), default None + Postgree dtype for each field query_gen: boolean (default False) If True, the query is generic (with variables) else the query is specific (with values) - + test: string, default None + choice of historization solution + Returns ------- String or Dataframe @@ -101,8 +110,10 @@ def to_indicator(engine, indicator, simple=True, histo=False, format='pandas', h indic = indicator + '-00' simple = False if histo else simple query = getattr(create_query, 'query_' + indic.split('-')[0])(*indic.split('-')[1:], simple=simple, gen=query_gen) + table_dtype = table_dtype if table_dtype else {'value': types.FLOAT, 'category': types.TEXT, 'code_z': types.TEXT, 'query': types.TEXT, 'perimeter': types.TEXT, 'code_p': types.TEXT, 'zoning': types.TEXT, + 'timestamp': types.TIMESTAMP, 'extras': dialects.postgresql.JSONB} if histo: - query = create_query.query_histo(query, timestamp=histo_timest) + query = create_query.query_histo(query, timestamp=histo_timest, histo_period=histo_period) if format == 'query': return query with engine.connect() as conn: @@ -112,10 +123,9 @@ def to_indicator(engine, indicator, simple=True, histo=False, format='pandas', h if format == 'json': return '{"' + indicator + '": ' + data_pd.to_json(index=False, orient=json_orient) + "}" if format == 'table': - table_name = table_name if table_name else indicator - return indic_to_table(data_pd, table_name, engine, table_option=table_option) + return indic_to_table(data_pd, table_name, engine, table_option=table_option, table_dtype=table_dtype, histo=histo, test=test) -def indic_to_table(pd_df, table_name, engine, table_option="replace"): +def indic_to_table(pd_df, table_name, engine, table_option="replace", table_dtype=None, histo=None, test=None): """ Load a DataFrame in a Table Parameters @@ -128,81 +138,144 @@ def indic_to_table(pd_df, table_name, engine, table_option="replace"): Name of the table to create. table_option: string (used if format='table'), default 'replace' Option if table exists 'replace' or 'append' + table_dtype: dict (used if format='table'), default None + Postgree dtype for each field + histo: boolean, default False + If True, timestamp additional column is added (with others additional columns) + histo_period: string (used if histo=True), default 'm' + Value of initial periodicity ('h', 'd', 'm', 'w', 'y') + test: string ('0', '1', '1bis'), default None + Choice of historization solution (used only for tests) Returns ------- Dataframe Table creation confirmation with the number of lines created. """ - pd_df.to_sql(table_name, engine, if_exists=table_option, index=False) - return pd.read_sql_query('SELECT COUNT(*) AS count FROM "' + table_name + '"', engine) - -def query_histo(query, timestamp=None): + from datetime import datetime + if histo: + if 'code' not in pd_df.columns: + pd_df.insert(len(pd_df.columns)-6, 'code', [""]*len(pd_df)) + if len(pd_df.columns) == 8: + pd_df.insert(1, 'category', [""]*len(pd_df)) + pd_df.insert(0, 'quantity', [1]*len(pd_df)) + pd_df.insert(2, 'last', pd_df[pd_df.columns[1]]) + cols = pd_df.columns + pd_df.rename(columns={cols[1]: 'value', cols[3]: 'category'}, inplace = True) + del pd_df['val'] + del pd_df['perim'] + pd_df = pd_df.astype({'quantity': 'int', 'last': 'float', 'value': 'float', + 'query': 'string', 'level': 'string', 'period': 'string'}) + pd_df.rename(columns={'code': 'target', 'query': 'code'}, inplace = True) + if not test: + #pd_df['extras'] = pd.Series([{}]*len(pd_df)) + pd_df['extras'] = pd.Series([{'quantity': quantity, 'last': last} + for quantity, last in zip(pd_df['quantity'], pd_df['last'])]) + del pd_df['last'] + del pd_df['quantity'] + elif test == '1bis': + pd_df['all_value'] = pd.Series([{'quantity': quantity, 'value': value, 'last': last} + for quantity, value, last in zip(pd_df['quantity'], pd_df['value'], pd_df['last'])]) + del pd_df['last'] + del pd_df['quantity'] + del pd_df['value'] + if table_name: + dtype = table_dtype if table_dtype else {} + pd_df.to_sql(table_name, engine, if_exists=table_option, index=False, dtype=dtype) + return pd.read_sql_query('SELECT COUNT(*) AS count FROM "' + table_name + '"', engine) + return pd_df + +def query_histo(query, histo_period, timestamp=None): if timestamp: - datation = "datation(timest) AS (VALUES ('" + timestamp + "'::timestamp)) " + datation = "datation(timestamp) AS (VALUES ('" + timestamp + "'::timestamp))" else: - datation = "datation(timest) AS (VALUES (CURRENT_TIMESTAMP)) " + datation = "datation(timestamp) AS (VALUES (CURRENT_TIMESTAMP))" + return f"""WITH + query AS ({query}), + {datation}, + periodicity(period) as (VALUES ('{histo_period}')) + SELECT * FROM query, datation, periodicity""" - return " WITH query AS (" + query + "), " + datation + " SELECT * FROM query, datation " +def historicize(periodicity, period): + return -def init_param_txx(simple, gen, indic, *param): - '''parameters initialization for 'query_ixx' functions ''' +def init_param_ixx(simple, gen, indic, *param): + '''parameters initialization for 'query_ixx' and 'query_txx' functions ''' - perim, val, zone = (param + ('00', '00', '00'))[:3] + perim, val, level = (param + ('00', '00', '00'))[:3] perim = perim.rjust(2, '0') val = val.rjust(2, '0') - zone = zone.rjust(2, '0') - + level = level.rjust(2, '0') g_overhead = "" if simple else f"{G_OVERHEAD}," s_overhead = "" if simple else f"""'{indic}' AS QUERY, - '{perim}' AS LEVEL, + '{perim}' AS PERIM, '{val}' AS VAL, - '{zone}' AS AREA""" - table_perim_code = "" if perim == '00' else f"{TABLE[perim]}.code" + '{level}' AS LEVEL""" where_isin_perim = "" if perim == '00' else f"""WHERE - {table_perim_code} = '{val}'""" - + {TABLE[perim]}.code = '{val}'""" + from_perim = """FROM + region""" if perim == '00' else f"""FROM + {TABLE[perim]}""" + table_level = "" if level == '00' else f"{TABLE[level]}" + table_level_code = "" if level == '00' else f"{TABLE[level]}.code" + table_level_pop = "" if level == '00' else f"{TABLE[level]}.population * 100000" + table_level_area = "" if level == '00' else f"{TABLE[level]}.area::float * 100000000" + coma = "" if f"{s_overhead}" == "" else "," + if gen: s_overhead = "" if simple else f"""'{{indic}}' AS QUERY, - '{{perim}}' AS LEVEL, + '{{perim}}' AS PERIM, '{{val}}' AS VAL, - '{{zone}}' AS AREA""" - table_perim_code = "" if perim == '00' else f"{{TABLE[perim]}}.code" + '{{level}}' AS LEVEL""" where_isin_perim = "" if perim == '00' else f"""WHERE - {table_perim_code} = '{{val}}'""" - - return (perim, table_perim_code, g_overhead, s_overhead, where_isin_perim) + {{TABLE[perim]}}.code = '{{val}}'""" + from_perim = """FROM + region""" if perim == '00' else f"""FROM + {TABLE[perim]}""" + table_level = "" if level == '00' else f"{{TABLE[level]}}" + table_level_code = "" if level == '00' else f"{{TABLE[level]}}.code" + table_level_pop = "" if level == '00' else f"{{TABLE[level]}}.population * 100000" + table_level_area = "" if level == '00' else f"{{TABLE[level]}}.area::float * 100000000" + + coma1 = "" if f"{table_level_code}{s_overhead}" == "" else "," + coma2 = "" if f"{table_level_code}" == "" else "," + coma3 = "" if f"{s_overhead}" == "" or f"{table_level_code}" == "" else "," + group_by = "" if f"{table_level_code}{g_overhead}" == "" else f"""GROUP BY + {g_overhead} + {table_level_code}""" + code = "" if level == '00' else "code" + + return {'perim': perim, 'level': level, 'coma': coma, 'coma1': coma1, 'coma2': coma2, 'coma3': coma3, + 'code': code, 'group_by': group_by, 'g_overhead': g_overhead, 's_overhead': s_overhead, + 'where_isin_perim': where_isin_perim, 'from_perim': from_perim, + 'table_level': table_level, 'table_level_code': table_level_code, + 'table_level_pop': table_level_pop, 'table_level_area': table_level_area} def query_t1(*param, simple=True, gen=False): '''Create SQL query for 't1' indicators (see parameters in module docstring)''' indic = 't1' - (perim, table_perim_code, g_overhead, s_overhead, where_isin_perim - ) = init_param_txx(simple, gen, indic, *param) - - coma1 = "" if f"{table_perim_code}{s_overhead}" == "" else "," - coma2 = "" if f"{table_perim_code}" == "" else "," - coma3 = "" if f"{s_overhead}" == "" or f"{table_perim_code}" == "" else "," + prm = init_param_ixx(simple, gen, indic, *param) return f""" WITH {P_TAB} SELECT count(id_pdc_itinerance) AS nb_pdc, - p_range{coma1} - {table_perim_code}{coma3} - {s_overhead} + p_range{prm['coma1']} + {prm['table_level_code']}{prm['coma3']} + {prm['s_overhead']} FROM {PDC_ALL} {COG_ALL} {JOIN_P} -{where_isin_perim} +{prm['where_isin_perim']} GROUP BY - {g_overhead} - p_range{coma2} - {table_perim_code} + {prm['g_overhead']} + p_range{prm['coma2']} + {prm['table_level_code']} ORDER BY nb_pdc DESC""" @@ -210,17 +283,11 @@ def query_t2(*param, simple=True, gen=False): '''Create SQL query for 't2' indicators (see parameters in module docstring)''' indic = 't2' - (perim, table_perim_code, g_overhead, s_overhead, where_isin_perim - ) = init_param_txx(simple, gen, indic, *param) - - code = "" if perim == '00' else "code" - coma1 = "" if f"{code}{s_overhead}" == "" else "," - # coma3 = "" if s_overhead == "" else "," - coma3 = "" if f"{s_overhead}" == "" or f"{code}" == "" else "," + prm = init_param_ixx(simple, gen, indic, *param) return f"""WITH t1 AS ( - {query_t1(*param, simple=simple, gen=gen)} + {query_t1(*param, simple=True, gen=gen)} ) SELECT nb_pdc / ( @@ -229,9 +296,9 @@ def query_t2(*param, simple=True, gen=False): FROM t1 ) * 100 AS pct_nb_pdc, - p_range{coma1} - {code}{coma3} - {s_overhead} + p_range{prm['coma1']} + {prm['code']}{prm['coma3']} + {prm['s_overhead']} FROM t1""" @@ -239,30 +306,25 @@ def query_t3(*param, simple=True, gen=False): '''Create SQL query for 't3' indicators (see parameters in module docstring)''' indic = 't3' - (perim, table_perim_code, g_overhead, s_overhead, where_isin_perim - ) = init_param_txx(simple, gen, indic, *param) - - coma1 = "" if f"{table_perim_code}{s_overhead}" == "" else "," - coma2 = "" if f"{table_perim_code}" == "" else "," - coma3 = "" if f"{s_overhead}" == "" or f"{table_perim_code}" == "" else "," + prm = init_param_ixx(simple, gen, indic, *param) return f""" WITH {STAT_NB_PDC} SELECT count(nb_pdc) AS nb_stations, - nb_pdc{coma1} - {table_perim_code}{coma3} - {s_overhead} + nb_pdc{prm['coma1']} + {prm['table_level_code']}{prm['coma3']} + {prm['s_overhead']} FROM stat_nb_pdc - LEFT JOIN localisation ON localisation_id = localisation.id + INNER JOIN localisation ON localisation_id = localisation.id {COG_ALL} -{where_isin_perim} +{prm['where_isin_perim']} GROUP BY - {g_overhead} - nb_pdc{coma2} - {table_perim_code} + {prm['g_overhead']} + nb_pdc{prm['coma2']} + {prm['table_level_code']} ORDER BY nb_stations DESC""" @@ -270,15 +332,11 @@ def query_t4(*param, simple=True, gen=False): '''Create SQL query for 't4' indicators (see parameters in module docstring)''' indic = 't4' - (perim, table_perim_code, g_overhead, s_overhead, where_isin_perim - ) = init_param_txx(simple, gen, indic, *param) - code = "" if perim == '00' else "code" - coma1 = "" if f"{code}{s_overhead}" == "" else "," - coma3 = "" if f"{s_overhead}" == "" or f"{code}" == "" else "," + prm = init_param_ixx(simple, gen, indic, *param) return f"""WITH t3 AS ( - {query_t3(*param, simple=simple, gen=gen)} + {query_t3(*param, simple=True, gen=gen)} ) SELECT nb_stations / ( @@ -287,9 +345,9 @@ def query_t4(*param, simple=True, gen=False): FROM t3 ) * 100 AS pct_nb_stations, - nb_pdc{coma1} - {code}{coma3} - {s_overhead} + nb_pdc{prm['coma1']} + {prm['code']}{prm['coma3']} + {prm['s_overhead']} FROM t3""" @@ -297,27 +355,22 @@ def query_t5(*param, simple=True, gen=False): '''Create SQL query for 't5' indicators (see parameters in module docstring)''' indic = 't5' - (perim, table_perim_code, g_overhead, s_overhead, where_isin_perim - ) = init_param_txx(simple, gen, indic, *param) - - coma1 = "" if f"{table_perim_code}{s_overhead}" == "" else "," - coma2 = "" if f"{table_perim_code}" == "" else "," - coma3 = "" if f"{s_overhead}" == "" or f"{table_perim_code}" == "" else "," + prm = init_param_ixx(simple, gen, indic, *param) return f""" SELECT count(id_station_itinerance) AS nb_stations, - implantation_station{coma1} - {table_perim_code}{coma3} - {s_overhead} + implantation_station{prm['coma1']} + {prm['table_level_code']}{prm['coma3']} + {prm['s_overhead']} FROM {STAT_ALL} {COG_ALL} -{where_isin_perim} +{prm['where_isin_perim']} GROUP BY - {g_overhead} - implantation_station{coma2} - {table_perim_code} + {prm['g_overhead']} + implantation_station{prm['coma2']} + {prm['table_level_code']} ORDER BY nb_stations DESC""" @@ -325,15 +378,11 @@ def query_t6(*param, simple=True, gen=False): '''Create SQL query for 't6' indicators (see parameters in module docstring)''' indic = 't6' - (perim, table_perim_code, g_overhead, s_overhead, where_isin_perim - ) = init_param_txx(simple, gen, indic, *param) - code = "" if perim == '00' else "code" - coma1 = "" if f"{code}{s_overhead}" == "" else "," - coma3 = "" if f"{s_overhead}" == "" or f"{code}" == "" else "," + prm = init_param_ixx(simple, gen, indic, *param) return f"""WITH t5 AS ( - {query_t5(*param, simple=simple, gen=gen)} + {query_t5(*param, simple=True, gen=gen)} ) SELECT nb_stations / ( @@ -342,165 +391,340 @@ def query_t6(*param, simple=True, gen=False): FROM t5 ) * 100 AS pct_nb_stations, - implantation_station{coma1} - {code}{coma3} - {s_overhead} + implantation_station{prm['coma1']} + {prm['code']}{prm['coma3']} + {prm['s_overhead']} FROM t5""" -def init_param_ixx(simple, gen, indic, *param): - '''parameters initialization for 'query_ixx' functions ''' +def query_t8(*param, simple=True, gen=False): + '''Create SQL query for 't8' indicators (see parameters in module docstring)''' - perim, val, zone = (param + ('00', '00', '00'))[:3] - perim = perim.rjust(2, '0') - val = val.rjust(2, '0') - zone = zone.rjust(2, '0') + indic = 't8' + prm = init_param_ixx(simple, gen, indic, *param) - zone = perim if zone == '00' else zone + return f""" +SELECT + count(id_station_itinerance) AS nb_stations, + nom_operateur{prm['coma1']} + {prm['table_level_code']}{prm['coma3']} + {prm['s_overhead']} +FROM + {STAT_ALL} + {COG_ALL} + INNER JOIN operateur ON operateur_id = operateur.id +{prm['where_isin_perim']} +GROUP BY + {prm['g_overhead']} + nom_operateur{prm['coma2']} + {prm['table_level_code']} +ORDER BY + nb_stations DESC""" - coma = "" if simple else "," - g_overhead = "" if simple else f"{G_OVERHEAD}," - s_overhead = "" if simple else f"""'{indic}' AS QUERY, - '{perim}' AS LEVEL, - '{val}' AS VAL, - '{zone}' AS AREA""" - where_isin_perim = "" if perim == '00' else f"""WHERE - {TABLE[perim]}.code = '{val}'""" - table_zone = f"{TABLE[zone]}" - - if gen: - s_overhead = "" if simple else f"""'{{indic}}' AS QUERY, - '{{perim}}' AS LEVEL, - '{{val}}' AS VAL, - '{{zone}}' AS AREA""" - where_isin_perim = "" if perim == '00' else f"""WHERE - {{TABLE[perim]}}.code = '{{val}}'""" - table_zone = f"{{TABLE[zone]}}" +def query_t9(*param, simple=True, gen=False): + '''Create SQL query for 't9' indicators (see parameters in module docstring)''' + + indic = 't9' + prm = init_param_ixx(simple, gen, indic, *param) - return (perim, zone, coma, g_overhead, s_overhead, where_isin_perim, table_zone) + return f"""WITH + t8 AS ( + {query_t8(*param, simple=True, gen=gen)} + ) +SELECT + nb_stations / ( + SELECT + sum(nb_stations) + FROM + t8 + ) * 100 AS pct_nb_stations, + nom_operateur{prm['coma1']} + {prm['code']}{prm['coma3']} + {prm['s_overhead']} +FROM + t8""" def query_i1(*param, simple=True, gen=False): '''Create SQL query for 'i1' indicators (see parameters in module docstring)''' indic = 'i1' - (perim, zone, coma, g_overhead, s_overhead, where_isin_perim, table_zone - ) = init_param_ixx(simple, gen, indic, *param) + param = init_param_ixx(simple, gen, indic, *param) - if perim == zone == '00': + if param['perim'] == param['level'] == '00': return f""" SELECT - count(id_pdc_itinerance) AS nb_pdc{coma} - {s_overhead} + count(id_pdc_itinerance) AS nb_pdc{param['coma']} + {param['s_overhead']} FROM pointdecharge""" return f""" SELECT - count(id_pdc_itinerance) AS nb_pdc, - {table_zone}.code{coma} - {s_overhead} + count(id_pdc_itinerance) AS nb_pdc{param['coma1']} + {param['table_level_code']}{param['coma3']} + {param['s_overhead']} FROM {PDC_ALL} {COG_ALL} -{where_isin_perim} -GROUP BY - {g_overhead} - {table_zone}.code +{param['where_isin_perim']} +{param['group_by']} ORDER BY nb_pdc DESC""" +def query_i2(*param, simple=True, gen=False): + '''Create SQL query for 'i2' indicators (see parameters in module docstring)''' + + indic = 'i2' + prm = init_param_ixx(simple, gen, indic, *param) + + if prm['level'] == '00': + return f""" +SELECT + ( + {query_i1(*param, simple=True, gen=gen)} + ) / ( + SELECT + sum(population) + {prm['from_perim']} + {prm['where_isin_perim']} + ) * 100000 AS nb_pdc_pop{prm['coma']} + {prm['s_overhead']}""" + + return f""" +WITH + i1 AS ( + {query_i1(*param, simple=True, gen=gen)} + ) +SELECT + i1.nb_pdc::float / {prm['table_level_pop']} AS nb_pdc_pop, + {prm['table_level_code']}{prm['coma3']} + {prm['s_overhead']} +FROM + i1 + INNER JOIN {prm['table_level']} on i1.code = {prm['table_level_code']} +ORDER by + nb_pdc_pop DESC""" + +def query_i3(*param, simple=True, gen=False): + '''Create SQL query for 'i3' indicators (see parameters in module docstring)''' + + indic = 'i3' + prm = init_param_ixx(simple, gen, indic, *param) + + if prm['level'] == '00': + return f""" +SELECT + ( + {query_i1(*param, simple=True, gen=gen)} + ) / ( + SELECT + sum(area::float) + {prm['from_perim']} + {prm['where_isin_perim']} + ) * 100000000 AS nb_pdc_area{prm['coma']} + {prm['s_overhead']}""" + + return f""" +WITH + i1 AS ( + {query_i1(*param, simple=True, gen=gen)} + ) +SELECT + i1.nb_pdc::float / {prm['table_level_area']} AS nb_pdc_area, + {prm['table_level_code']}{prm['coma3']} + {prm['s_overhead']} +FROM + i1 + INNER JOIN {prm['table_level']} on i1.code = {prm['table_level_code']} +ORDER by + nb_pdc_area DESC""" + def query_i4(*param, simple=True, gen=False): '''Create SQL query for 'i4' indicators (see parameters in module docstring)''' indic = 'i4' - (perim, zone, coma, g_overhead, s_overhead, where_isin_perim, table_zone - ) = init_param_ixx(simple, gen, indic, *param) + param = init_param_ixx(simple, gen, indic, *param) - if perim == zone == '00': + if param['perim'] == param['level'] == '00': return f""" SELECT - count(id_station_itinerance) AS nb_stat{coma} - {s_overhead} + count(id_station_itinerance) AS nb_stat{param['coma']} + {param['s_overhead']} FROM station""" return f""" SELECT - count(id_station_itinerance) AS nb_stat, - {table_zone}.code{coma} - {s_overhead} + count(id_station_itinerance) AS nb_stat{param['coma1']} + {param['table_level_code']}{param['coma3']} + {param['s_overhead']} FROM {STAT_ALL} {COG_ALL} -{where_isin_perim} -GROUP BY - {g_overhead} - {table_zone}.code +{param['where_isin_perim']} +{param['group_by']} ORDER BY nb_stat DESC""" +def query_i5(*param, simple=True, gen=False): + '''Create SQL query for 'i5' indicators (see parameters in module docstring)''' + + indic = 'i5' + prm = init_param_ixx(simple, gen, indic, *param) + + if prm['level'] == '00': + return f""" +SELECT + ( + {query_i4(*param, simple=True, gen=gen)} + ) / ( + SELECT + sum(population) + {prm['from_perim']} + {prm['where_isin_perim']} + ) * 100000 AS nb_stat_pop{prm['coma']} + {prm['s_overhead']}""" + + return f""" +WITH + i4 AS ( + {query_i4(*param, simple=True, gen=gen)} + ) +SELECT + i4.nb_stat::float / {prm['table_level_pop']} AS nb_stat_pop, + {prm['table_level_code']}{prm['coma3']} + {prm['s_overhead']} +FROM + i4 + LEFT JOIN {prm['table_level']} on i4.code = {prm['table_level_code']} +ORDER by + nb_stat_pop DESC""" + +def query_i6(*param, simple=True, gen=False): + '''Create SQL query for 'i6' indicators (see parameters in module docstring)''' + + indic = 'i6' + prm = init_param_ixx(simple, gen, indic, *param) + + if prm['level'] == '00': + return f""" +SELECT + ( + {query_i4(*param, simple=True, gen=gen)} + ) / ( + SELECT + sum(area::float) + {prm['from_perim']} + {prm['where_isin_perim']} + ) * 100000000 AS nb_stat_area{prm['coma']} + {prm['s_overhead']}""" + + return f""" +WITH + i4 AS ( + {query_i4(*param, simple=True, gen=gen)} + ) +SELECT + i4.nb_stat::float / {prm['table_level_area']} AS nb_stat_area, + {prm['table_level_code']}{prm['coma3']} + {prm['s_overhead']} +FROM + i4 + INNER JOIN {prm['table_level']} on i4.code = {prm['table_level_code']} +ORDER by + nb_stat_area DESC""" + def query_i7(*param, simple=True, gen=False): '''Create SQL query for 'i7' indicators (see parameters in module docstring)''' indic = 'i7' - (perim, zone, coma, g_overhead, s_overhead, where_isin_perim, table_zone - ) = init_param_ixx(simple, gen, indic, *param) + param = init_param_ixx(simple, gen, indic, *param) - if perim == zone == '00': + if param['perim'] == param['level'] == '00': return f""" SELECT - sum(puissance_nominale) AS p_nom{coma} - {s_overhead} + sum(puissance_nominale) AS p_nom{param['coma']} + {param['s_overhead']} FROM pointdecharge""" return f""" SELECT - sum(puissance_nominale) AS p_nom, - {table_zone}.code{coma} - {s_overhead} + sum(puissance_nominale) AS p_nom{param['coma1']} + {param['table_level_code']}{param['coma3']} + {param['s_overhead']} FROM {PDC_ALL} {COG_ALL} -{where_isin_perim} -GROUP BY - {g_overhead} - {table_zone}.code +{param['where_isin_perim']} +{param['group_by']} ORDER BY p_nom DESC""" -"""def create_table_pop(engine): - '''create temporay table with population''' - pop = pd.read_json(URL_POP).loc[:,['code', 'population']] - pop.rename(columns={'code': 'p_code'}, inplace=True) - indic_to_table(pop, 'tmp_pop', engine, table_option="replace") +def query_i8(*param, simple=True, gen=False): + '''Create SQL query for 'i8' indicators (see parameters in module docstring)''' -def query_i2(*param, simple=True, gen=False): - '''Create SQL query for 't2' indicators (see parameters in module docstring)''' + indic = 'i8' + prm = init_param_ixx(simple, gen, indic, *param) - perim, val, zone = (param + ('00', '00', '00'))[:3] - perim = perim.rjust(2, '0') - val = val.rjust(2, '0') - zone = zone.rjust(2, '0') -""" -''' - pdc_cog_pop = f""" - {CITY_COG}, - pdc_all AS (SELECT * from {PDC_ALL}), - pdc_cog_pop AS (SELECT * from pdc_all LEFT JOIN city_cog ON {ISIN_GEOM } LEFT JOIN temp_pop ON c_code) - """ + if prm['level'] == '00': + return f""" +SELECT + ( + {query_i7(*param, simple=True, gen=gen)} + ) / ( + SELECT + sum(population) + {prm['from_perim']} + {prm['where_isin_perim']} + ) * 100000 AS p_nom_pop{prm['coma']} + {prm['s_overhead']}""" + + return f""" +WITH + i7 AS ( + {query_i7(*param, simple=True, gen=gen)} + ) +SELECT + i7.p_nom::float / {prm['table_level_pop']} AS p_nom_pop, + {prm['table_level_code']}{prm['coma3']} + {prm['s_overhead']} +FROM + i7 + INNER JOIN {prm['table_level']} on i7.code = {prm['table_level_code']} +ORDER by + p_nom_pop DESC""" - FIELD = {'00': 'all_data', '01': 'r_code', '02': 'd_code', '03': 'e_code', '04': 'c_code'} - zone = perim if zone == '00' else zone +def query_i9(*param, simple=True, gen=False): + '''Create SQL query for 'i9' indicators (see parameters in module docstring)''' + + indic = 'i9' + prm = init_param_ixx(simple, gen, indic, *param) + + if prm['level'] == '00': + return f""" +SELECT + ( + {query_i7(*param, simple=True, gen=gen)} + ) / ( + SELECT + sum(area::float) + {prm['from_perim']} + {prm['where_isin_perim']} + ) * 100000000 AS p_nom_area{prm['coma']} + {prm['s_overhead']}""" return f""" - WITH {pdc_cog_pop}, - perimeter(level, all_data) AS (VALUES ('{zone}', '00')), - tot_pop AS ( - SELECT count(id_pdc_itinerance) AS nb_pdc, sum(population) AS nb_pop, level, {FIELD[zone]} AS x_code - FROM perimeter, pdc_cog_pop - WHERE {FIELD[perim]} = '{val}' - GROUP BY level, x_code ORDER BY nb_pdc DESC) - SELECT nb_pdc / nb_pop * 100000 AS ratio_nb_pdc_per_pop, p_cat, p_range, level, code - FROM tot_pop""" -''' +WITH + i7 AS ( + {query_i7(*param, simple=True, gen=gen)} + ) +SELECT + i7.p_nom::float / {prm['table_level_area']} AS p_nom_area, + {prm['table_level_code']}{prm['coma3']} + {prm['s_overhead']} +FROM + i7 + INNER JOIN {prm['table_level']} on i7.code = {prm['table_level_code']} +ORDER by + p_nom_area DESC"""