{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Objectif : référencer quelques sites internets fournissant des jeux de données \"datasets\" sur les véhicules autonomes\n", "\n", "- [x] Extraire un résumé, des informations vers un fichier CSV (datasets.csv)\n", "- [x] Lire et afficher les données du fichier CSV pour vérification\n", "- [x] Extraire des mots-clés, des étiquettes décrivant ces datasets (colonne tags)\n", "- [x] Créer quelques statistiques de base de ces datasets\n", "- [x] Créer une représentation graphique de ces datasets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Lire et afficher les données du fichier CSV" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
namedescriptionwebsite
0KITTI Vision Benchmark SuiteWe take advantage of our autonomous driving pl...http://www.cvlibs.net/datasets/kitti/
1Audi Autonomous Driving DatasetWe have published the Audi Autonomous Driving ...https://www.a2d2.audi/a2d2/en.html
2ApolloScape DatasetTrajectory dataset, 3D Perception Lidar Object...http://apolloscape.auto/
3Velodyne SLAMHere, you can find two challenging datasets re...http://www.mrt.kit.edu/z/publ/download/velodyn...
4Daimler Urban Segmentation DatasetThe Daimler Urban Segmentation Dataset consist...http://www.6d-vision.com/scene-labeling
5nuScenes datasetThe nuScenes dataset is a public large-scale d...https://www.nuscenes.org/
\n", "
" ], "text/plain": [ " name \\\n", "0 KITTI Vision Benchmark Suite \n", "1 Audi Autonomous Driving Dataset \n", "2 ApolloScape Dataset \n", "3 Velodyne SLAM \n", "4 Daimler Urban Segmentation Dataset \n", "5 nuScenes dataset \n", "\n", " description \\\n", "0 We take advantage of our autonomous driving pl... \n", "1 We have published the Audi Autonomous Driving ... \n", "2 Trajectory dataset, 3D Perception Lidar Object... \n", "3 Here, you can find two challenging datasets re... \n", "4 The Daimler Urban Segmentation Dataset consist... \n", "5 The nuScenes dataset is a public large-scale d... \n", "\n", " website \n", "0 http://www.cvlibs.net/datasets/kitti/ \n", "1 https://www.a2d2.audi/a2d2/en.html \n", "2 http://apolloscape.auto/ \n", "3 http://www.mrt.kit.edu/z/publ/download/velodyn... \n", "4 http://www.6d-vision.com/scene-labeling \n", "5 https://www.nuscenes.org/ " ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Le fichier datasets.csv est dans le dossier module2/exo4/datasets.csv\n", "# Structure de l'entête/données : name;description;website;tags (avec des points virgules pour les champs)\n", "\n", "# https://pandas.pydata.org\n", "# Version 0.22.0 (December 29, 2017) sur ce Jupyter !\n", "import pandas as pd\n", "\n", "# print(pd.__version__) \n", "# pd.show_versions() # Toutes les extensions installées\n", "\n", "# Afficher les colonnes principales\n", "datasets = pd.read_csv('datasets.csv', delimiter = ';', usecols=[0,1,2])\n", "datasets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Extraire des mots-clés, des étiquettes décrivant ces datasets" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tags
0stereo,flow,odometry,tracking,detection,road,m...
1semantic,cloud,segmentation,detection,road,map...
2stereo,flow,semantic,cloud,segmentation,detect...
3detection,images,city
4stereo,labelling,detection,road,maps,city
5labelling,detection,road,maps,city
\n", "
" ], "text/plain": [ " tags\n", "0 stereo,flow,odometry,tracking,detection,road,m...\n", "1 semantic,cloud,segmentation,detection,road,map...\n", "2 stereo,flow,semantic,cloud,segmentation,detect...\n", "3 detection,images,city\n", "4 stereo,labelling,detection,road,maps,city\n", "5 labelling,detection,road,maps,city" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "# Afficher uniquement les mots-clés \n", "tags = pd.read_csv('datasets.csv', delimiter = ';', usecols=[3])\n", "tags" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Créer quelques statistiques de base de ces datasets" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tags
count6
unique6
toplabelling,detection,road,maps,city
freq1
\n", "
" ], "text/plain": [ " tags\n", "count 6\n", "unique 6\n", "top labelling,detection,road,maps,city\n", "freq 1" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "# Afficher les mots-clés avec .describe()\n", "tags = pd.read_csv('datasets.csv', delimiter = ';', usecols=[3])\n", "tags.describe()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "city : 6 \n", "cloud : 2 \n", "detection : 6 \n", "flow : 2 \n", "images : 1 \n", "labelling : 2 \n", "maps : 5 \n", "odometry : 1 \n", "road : 5 \n", "segmentation : 2 \n", "semantic : 2 \n", "stereo : 3 \n", "tracking : 1 \n" ] } ], "source": [ "import pandas as pd\n", "# https://docs.python.org/3/library/re.html\n", "# https://www.w3schools.com/python/python_regex.asp\n", "import re\n", "\n", "all_tags = {}\n", "# Extraire les mots-clés\n", "tags = pd.read_csv('datasets.csv', delimiter = ';', usecols=[3])\n", "\n", "for t in tags.values:\n", " # t = numpy.ndarray par défaut\n", " split = re.split(',',str(t[0]).lower())\n", " # Comptage des mots-clés\n", " for s in split:\n", " if all_tags.get(s):\n", " all_tags[s] = all_tags[s] + 1\n", " else:\n", " all_tags[s] = 1\n", "\n", "# Classement par le nom via un dictionnaire\n", "sorted_all_tags = {key: value for key, value in sorted(all_tags.items(), key=lambda item: item[0])}\n", "\n", "# Affichage formaté\n", "for sat in sorted_all_tags:\n", " print(\"{:<15} : {:<5}\".format(sat, sorted_all_tags[sat]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Créer une représentation graphique de ces datasets" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# https://matplotlib.org/api/pyplot_api.html\n", "# Version 2.2.3 sur ce Jupyter !\n", "import matplotlib.pyplot as plt\n", "\n", "# Personnalisation du graphique\n", "# https://www.tutorialgateway.org/python-matplotlib-bar-chart/\n", "# https://python-graph-gallery.com/\n", "# https://www.tutorialspoint.com/matplotlib/matplotlib_bar_plot.htm\n", "plt.style.use('seaborn-whitegrid')\n", "plt.suptitle('All tags from the datasets CSV file', fontsize=14)\n", "plt.title('Feel free to add new tags...')\n", "plt.xlabel('Tag names')\n", "plt.ylabel('Tag numbers')\n", "\n", "plt.bar(range(len(sorted_all_tags)), sorted_all_tags.values(), width=0.8)\n", "plt.xticks(range(len(sorted_all_tags)), list(sorted_all_tags.keys()))\n", "plt.xticks(rotation = 45, horizontalalignment = 'right')\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }