# Atelier narration de données Ce TP est articulé autour de la **réutilisation des données**. A l'image du désormais célèbre [CovidTracker](https://covidtracker.fr/), le but est d'utiliser des données en accès libre pour créer des visualisations permettant une meilleure lisibilité ou compréhension de l'information. ## Objectif Vous devrez réaliser un [Colab](https://colab.research.google.com/), ou équivalent, décrivant un jeu de données et présentant ces données (ou données retravaillées et/ou enrichies) sous forme de visualisations. Vous avez la possibilité d'exporter ces données et de réaliser ces visualisations en JavaScript, sur Tableau, sur Excel, etc. si vous le souhaitez. ## Jeu de données Pour réaliser les travaux pratiques, il est nécessaire de trouver un (ou plusieurs) jeu(x) de données permettant de réaliser des moyennes, d'aggréger selon des catégories, etc. Vous êtes libres de trouver un sujet qui vous plaît. - [data.gouv.fr](https://www.data.gouv.fr/fr/) - [data.europa.eu](https://data.europa.eu/en) - [Google Dataset Search](https://datasetsearch.research.google.com/) Une fois le(s) jeu(x) de données sélectionné(s), vous pouvez essayer de trouver d'autres jeux de données analogues permettant d'enrichir, comparer, etc. l'information par la suite. L'important est de s'approprier les données (format, description, etc.). Quelques pistes : énergie (évolution des prix, consommation, bornes de recharge pour les VE), etc. ## Traitement ### Traitement à la main Pour traiter un jeu de données sans utiliser de librairie spécifique. Il suffit de lire les données en respectant le format dans lesquelles elles sont livrées. #### CSV ```python= import csv with open("fichier.csv", 'r') as f: csvreader = csv.reader(f, delimiter=';') for row in csvreader: print(row) # traitement... ``` ```python= import csv with open("fichier.csv", 'r') as f: csvreader = csv.DictReader(f, delimiter=';') for row in csvreader: print(row) # traitement... ``` Avec une petite nuance ligne n°4 où on précise à l'interpréteur de lire le fichier CSV comme un dictionnaire, c'est-à-dire qu'on ne va pas accéder à la colonne par son numéro de colonne mais par son appelation précisée dans l'entête du fichier CSV. #### JSON ```python import json with open('fichier.json', 'r') as f: data = json.load(f) # traitement... ``` Mais il existe d'autres moyens plus appropriés ! ### Traitement avec des outils adaptés La librairie Python ```Pandas``` permet d'effectuer rapidement des traitements d'un ensemble de données. Pour l'utiliser, il faut installer la librairie comme présenté ci-dessous. ``` !pip install pandas ``` #### CSV ```python import pandas as pd df = pd.read_csv('fichier.csv') # traitement... ``` #### JSON ```python import pandas as pd df = pd.read_json('fichier.json') # traitement... ``` #### Quelques exemples de traitements ##### Afficher des informations sur le *dataframe* ```python # affiche la taille du df print(df.shape) # affiche les x premières lignes print(df.head(x)) # affiche le nombre de lignes correspondantes à des valeurs identiques print(df['column'].value_counts()) # affiche les types des colonnes print(df.dtypes) ``` ##### Supprimer des lignes en fonction de valeurs données ```python df = df[df.column != "value"] # ou encore df.drop(df.index[data['column'] < 123], inplace=True) ``` ##### Créer des sous *dataframes* ```python sub_df = df[df.column == "value"] # ou encore sub_df = df[df["column"].str.contains("value").fillna(False)] ``` ```python sub_dfs = df.groupby("column") sub_df1 = sub_dfs.get_group(1) ``` ##### Effectuer des opérations sur un ensemble de cellules ayant des valeurs identiques Les opérations disponibles sont listées sur la [documentation officielle](https://pandas.pydata.org/docs/user_guide/basics.html#:~:text=Here%20is%20a%20quick%20reference%20summary%20table%20of%20common%20functions.%20Each%20also%20takes%20an%20optional%20level%20parameter%20which%20applies%20only%20if%20the%20object%20has%20a%20hierarchical%20index.). ```python # grouper des données en fonction de la valeur d'une cellule sub_df = df.groupby('column', as_index=False).count() sub_df = df.groupby('column', as_index=False).mean() sub_df = df.groupby('column', as_index=False).sum() # ... ``` ##### Trier un *dataframe* ```python df.sort_values('column') ``` ##### Fusionner des *dataframes* ```python dfxdf = pd.merge(df1[["col1", "col2"]], df2[["col1", "col1"]], on="col1", how="left") ``` ##### Renommer une colonne ```python df.rename(columns={'column': 'col1'}, inplace=True) ``` ## Création de visualisations Pour créer des visualisations, divers outils sont disponibles. Les visualisations Python, basées sur les librairies matplotlib, plotly ou encore seaborn, sont plus proches du code mais parfois moins interactives que celles développées en JS (D3.js) ou Vega. Le mieux est de choisir un exemple qui se rapproche le plus de la visualisation voulue, d'y intégrer ses données et de la modifier par la suite. Vous avez plusieurs sites proposant une multitude de visualisations ci-dessous. À noter que les visualisations Vega peuvent s'intégrer à Kibana. ### Python (matplotlib, plotly, seaborn, bokeh ?) - [Python-graph-gallery](https://www.python-graph-gallery.com/) - [Bokeh](https://docs.bokeh.org/en/latest/docs/gallery.html) - [Altair](https://altair-viz.github.io/gallery/index.html) (qui fait le lien avec Vega) #### Example de visualisation rapide d'un *dataframe* ```python import matplotlib.pyplot as plt import seaborn as sns # pd.set_option('display.max_rows', None) sns.set() # un histogramme plt.figure() p = sns.histplot(data['col1'], kde=True, stat="density", linewidth=0) plt.show() # un graphique linéaire sns.lineplot(x='col1', y='col2', data=df) ``` ### JS - [Vizhub](https://vizhub.com/) - [D3-grap-gallery](https://d3-graph-gallery.com/) - [Chart.js](https://www.chartjs.org/docs/latest/samples/information.html) - [Google Charts](https://developers.google.com/chart/interactive/docs) - [Observable](https://observablehq.com/) (mais en mode notebook...) ### Vega - [Vega](https://vega.github.io/vega/examples/)