<jupyter_start><jupyter_text>2040 le cap des 100% de voitures électriques *Etude data - Projet 8 - @Nalron (août 2020)*\*Traitement des données sur Jupyter Notebook (Distribution Anaconda)*\*Etude réalisée en langage Python*Visualisation des Tableaux de bord: [Tableau Public](https://public.tableau.com/profile/nalron!/vizhome/ElectricCarsFrance2040/Vuedensemble) ---  Rappel des missions [Mission 1 : Positionnement de la voiture électrique en France](https://github.com/nalron/project_electric_cars_france2040/blob/french_version/p8_notebook01.ipynb)Évolution du parc automobile électrique à 2 ans.Identification et classification des inégalités locales des voitures électriques.Autonomie et consommation moyenne d'une voiture électrique. [Mission 2 : Besoin des déploiements en IRVE](https://github.com/nalron/project_electric_cars_france2040/blob/french_version/p8_notebook02.ipynb)Évolution du nombre de points de recharge disponibles ouverts au public.Analyse de la répartition par borne de recharge, type de prise et catégorie d’aménageur.Utilisation des ratios pour le dimensionnement d'un maillage de taille optimale.Prévision du nombre de PDC à horizon 2025. [Mission 3 : Appel de charge au réseau électrique](https://github.com/nalron/project_electric_cars_france2040/blob/french_version/p8_notebook03.ipynb)Analyse de la consommation d'électricité en France et des filières de production.Profiler un pic d’utilisation des bornes de recharge.Courbe de charge réseau électrique pour répondre aux nouveaux modes de consommation. ---<jupyter_code>#Import des principales librairies Python
import pandas as pd
import plotly.figure_factory as ff
import requests
import seaborn as sns
%pylab inline<jupyter_output>Populating the interactive namespace from numpy and matplotlib<jupyter_text>Mission 3 : Appel de charge au réseau électrique __`Traitement des données du parc de production d'énergie par typologie`__<jupyter_code>#Chargement du jeu de données "parc-des-installations-de-production-raccordees-par-departement"
parc = pd.read_csv('p8_data/parc-des-installations-de-production-raccordees-par-departement.csv', sep=';')
parc
#Liste des colonnes du jeu de données 
parc.columns
#Liste des types d'injection exprimés dans l'échantillon
parc['Type Injection'].unique()
#Analyse des types de variables
parc.dtypes
#Analyse des valeurs manquantes par variable
parc.isna().sum()
#Suppression des variables 'Geo Shape' et 'Geo Point' (inutiles dans le contexte traité)
parc.drop(columns=['Geo Shape', 'Geo Point'], inplace=True)
#Quels sont les types de production exploitables dans cet échantillon?
parc['Type Production'].unique()
#Agrégation des données selon de Type de Production
parc.groupby(by='Type Production')['Nombre Installations', 'Puissance MW'].sum().reset_index()
#Agrégation des données selon le département d'installation
parc.groupby(by=['Nom Département'])['Nombre Installations', 'Puissance MW'].sum()\
.sort_values('Puissance MW', ascending=False).reset_index()
#Agrégation des données selon la Région d'installation
parc.groupby(by=['Région'])['Nombre Installations', 'Puissance MW'].sum()\
.sort_values('Puissance MW', ascending=False).reset_index()
#Sauvegarde 
parc_production = parc.copy()
parc_production.to_csv('p8_datatable/parc_production.csv')<jupyter_output><empty_output><jupyter_text>__`Traitement des données sur la consommation / filières de production 2014 à 2018`__<jupyter_code>#Chargement des 4 fichiers rte-puissances-*.csv
import dask.dataframe as dd
rte_puissances = dd.read_csv('p8_data/rte-puissances-*.csv', sep=';', 
                             dtype='float64', parse_dates=[['Date', 'Heures']], encoding='utf-8').compute()
#Aperçu du jeu de données  
rte_puissances
#Changement en Serie temporelle de la variable 'Date_Heures'
rte_puissances['Date_Heures'] = pd.to_datetime(rte_puissances['Date_Heures'])
#Liste des colonnes du jeu de données 
rte_puissances.columns
#Suppression des lignes dont la consommation est manquante
#Une ligne sur deux car l'enregistrement temps réel d’électricité est réalisé au pas 30 minutes
rte_puissances.dropna(subset=['Consommation'], axis=0, inplace=True)
rte_puissances.reset_index(drop=True, inplace=True)
display(rte_puissances.shape)
display(rte_puissances.head())
#Suppression de la dernière colonne 'Unnamed: 29'
rte_puissances.drop(columns='Unnamed: 29', inplace=True)
#Analyse du type de variables 
rte_puissances.dtypes
#Groupement des colonnes par grand type de Puissance
rte_puissances['Fioul'] = rte_puissances['Fioul']\
                        + rte_puissances['Fioul - TAC']\
                        + rte_puissances['Fioul - Cogén.']\
                        + rte_puissances['Fioul - Autres']

rte_puissances['Gaz'] = rte_puissances['Gaz']\
                        + rte_puissances['Gaz - TAC']\
                        + rte_puissances['Gaz - Cogén.']\
                        + rte_puissances['Gaz - CCG']\
                        + rte_puissances['Gaz - Autres']

rte_puissances['Hydraulique'] = rte_puissances['Hydraulique']\
                        + rte_puissances['Hydraulique - Fil de l?eau + éclusée']\
                        + rte_puissances['Hydraulique - Lacs']\
                        + rte_puissances['Hydraulique - STEP turbinage']

rte_puissances['Bioénergies'] = rte_puissances['Bioénergies']\
                        + rte_puissances['Bioénergies - Déchets']\
                        + rte_puissances['Bioénergies - Biomasse']\
                        + rte_puissances['Bioénergies - Biogaz']

#Suppression des colonnes
rte_puissances.drop(columns=['Fioul - TAC', 'Fioul - Cogén.', 'Fioul - Autres', 'Gaz - TAC', 'Gaz - Cogén.', 
                             'Gaz - CCG', 'Gaz - Autres','Hydraulique - Fil de l?eau + éclusée',
                             'Hydraulique - Lacs', 'Hydraulique - STEP turbinage', 'Bioénergies - Déchets', 
                             'Bioénergies - Biomasse', 'Bioénergies - Biogaz', 'Pompage'], inplace=True)
#Analyse des valeurs manquantes
rte_puissances.isna().any()
#Analyse des valeurs doublons
rte_puissances.duplicated().any()
#Description rapide avec quelques statistiques descriptives
rte_puissances.describe().T
rte_puissances
#Sauvegarde 
rte_puissances.to_csv('p8_datatable/rte_puissances.csv')<jupyter_output><empty_output><jupyter_text>Calcul de la Puissance appelée pendant un Pic de consommationL'objectif fixé est de pouvoir estimer un Pic Théorique de Charge, c'est-à-dire dans une mise en situation extrême où l'ensemble du parc électrique et hybride serait en recharge simultanément à la même heure, par exemple en fin de journée à 19h. Quelle serait la charge théorique? Le réseau Enedis pourrait-il tenir ses engagements?<jupyter_code>### Création d'un dataframe pour estimer la Puissance appelée pendant un Pic de consommation
pdc_puiss = pd.DataFrame({
    'Année': [2019, 2021, 2030, 2035, 2040],
    'Connecteur_puiss_kW': [22, 22, 22, 22, 22], #Voir l'analyse des puissances, 22kW représente 50% des connecteurs installés
    'nbre_ve': [immat_motor_annee['Electricité'].max(), ve2021, 10*1e6, 15*1e6, 20*1e6], #Immat. Max (Cumul jusqu'à fin 2019)
    'nbre_vh': [immat_motor_annee['Hybride'].max(), vh2021, 0, 0, 0],     #Immat. Max (Cumul jusqu'à fin 2019)
    'fréquence_utilisation': [1, 1, 1, 1, 1] #Une seule charge, l'hypothèse d'une charge globale à 19H par exemple
})

pdc_puiss['Puissance_kW'] = pdc_puiss['Connecteur_puiss_kW'] * (pdc_puiss['nbre_ve'] + pdc_puiss['nbre_vh'])
pdc_puiss['Puissance_MW'] = pdc_puiss['Puissance_kW']/1e3
pdc_puiss['Puissance_GW'] = pdc_puiss['Puissance_kW']/1e6
pdc_puiss
#Sauvegarde
pdc_puiss.to_csv('p8_datatable/pdc_puiss.csv')<jupyter_output><empty_output><jupyter_text>A fin de 2019, l'ensemble des électriques + hybrides en recharge à la même heure nécessiteraient un appel de charge d'une Puissance approximative de 15,7 GW, et un pic de 23,3 GW à fin 2021. A titre de comparaison, le plus grand Pic de consommation enregistré entre 2014 et 2018 (voir stat. descriptives ci-dessus) était de 96272 MW, soit 96 GW. Notons, que dans le futur, la consommation globale de notre Pays devrait baisser. Le chauffage sera optimisé par des pompes, des éclairages LED seront davantage généralisés, de plus en plus de toits photovoltaïques, le poids des véhicules et les frottements seront réduits, etc… Tout cela contribuera à abaisser la consommation. Reste à savoir combien de véhicules électriques circuleront en 2040 pour évaluer les besoins en électricité. Là aussi, des facteurs technologiques, des décisions politiques, des changements dans nos modes de vie, etc… rendent la question complexe. Mais restons sur nos modes de vie connus à ce jour pour estimer globalement la consommation moyenne sur une année complète.  Calcul de la consommation annuelle moyenne des Véhicules propresActuellement, une voiture électrique consomme en moyenne 20 kWh pour 100 Km (voir calcul fin Mission 1). Selon l’INSEE, les voitures particulières ont parcouru 13 274 km en moyenne en 2016. En supposant que nous resterions à ce niveau de kilométrage, une voiture électrique consommerait ainsi 2 650 kWh par an en moyenne.<jupyter_code>### Création d'un dataframe pour estimer la consommation moyenne / an
conso_an = pd.DataFrame({
    'Année': [2019, 2021, 2030, 2035, 2040],
    'nbre_ve': [(immat_motor_annee['Electricité'].max() + immat_motor_annee['Hybride'].max()), 
                (ve2021+vh2021), 10*1e6, 15*1e6, 20*1e6],
    'conso_kWh/km':[20, 20, 20, 20, 20],
    'distance_km/an':[13274, 13274, 13274*.9, 13274*.8, 13274*.8]
})

conso_an['conso_moy_kWh'] = conso_an['nbre_ve'] * conso_an['conso_kWh/km']/100 * conso_an['distance_km/an']
conso_an['conso_moy_TWh'] = round(conso_an['conso_moy_kWh']*1e-9, 2)
    
conso_an    
#Sauvegarde
conso_an.to_csv('p8_datatable/conso_an.csv')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09931889803801972, 'fraction_numerical': 0.028972247636474536, 'mean_word_length': 4.706496519721577, 'pattern_counts': {'":': 0, '<': 20, '<?xml version=': 0, '>': 20, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '645283', 'license': 'MIT', 'n_tokens_mistral': 3734, 'n_tokens_neox': 3484, 'n_words': 926, 'path': 'p8_notebook03.ipynb', 'repo_name': 'nalron/project_electric_cars_france2040', 'size': '9837'}