From 30dc6b79d2cb2bc239c991fc4bb336771cd9a062 Mon Sep 17 00:00:00 2001
From: vinotha-kumar <63650306+vinotha-kumar@users.noreply.github.com>
Date: Wed, 15 Apr 2020 17:17:42 +0530
Subject: [PATCH] Add files via upload
---
...G1-04-15-kumar-enviroCar_PY_Notebook.ipynb | 871 ++++++++++++++++++
1 file changed, 871 insertions(+)
create mode 100644 examples/G1-04-15-kumar-enviroCar_PY_Notebook.ipynb
diff --git a/examples/G1-04-15-kumar-enviroCar_PY_Notebook.ipynb b/examples/G1-04-15-kumar-enviroCar_PY_Notebook.ipynb
new file mode 100644
index 0000000..7829832
--- /dev/null
+++ b/examples/G1-04-15-kumar-enviroCar_PY_Notebook.ipynb
@@ -0,0 +1,871 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Package loading and basic configurations"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "The autoreload extension is already loaded. To reload it, use:\n",
+ " %reload_ext autoreload\n"
+ ]
+ }
+ ],
+ "source": [
+ "%load_ext autoreload\n",
+ "%autoreload 2\n",
+ "\n",
+ "# load dependencies'\n",
+ "import pandas as pd\n",
+ "import geopandas as gpd\n",
+ "import matplotlib.pyplot as plt \n",
+ "\n",
+ "from envirocar import TrackAPI, DownloadClient, BboxSelector, ECConfig\n",
+ "\n",
+ "# create an initial but optional config and an api client\n",
+ "config = ECConfig()\n",
+ "track_api = TrackAPI(api_client=DownloadClient(config=config))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Querying enviroCar Tracks"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The following cell queries tracks from the enviroCar API. It defines a bbox for the area of \"dortmund\" (Germany) and requests 50 tracks. The result is a GeoDataFrame, which is a geo-extended Pandas dataframe from the GeoPandas library. It contains all information of the track in a flat dataframe format including a specific geometry column.\n",
+ "\n",
+ "### Changes:\n",
+ "Bounding box are taken for Dortmund."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 33,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " id | \n",
+ " time | \n",
+ " geometry | \n",
+ " Rpm.value | \n",
+ " Rpm.unit | \n",
+ " Speed.value | \n",
+ " Speed.unit | \n",
+ " GPS Accuracy.value | \n",
+ " GPS Accuracy.unit | \n",
+ " GPS Altitude.value | \n",
+ " ... | \n",
+ " sensor.engineDisplacement | \n",
+ " sensor.model | \n",
+ " sensor.id | \n",
+ " sensor.fuelType | \n",
+ " sensor.constructionYear | \n",
+ " sensor.manufacturer | \n",
+ " O2 Lambda Current.value | \n",
+ " O2 Lambda Current.unit | \n",
+ " O2 Lambda Current ER.value | \n",
+ " O2 Lambda Current ER.unit | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " 5778dd84e4b0ea2464335ce2 | \n",
+ " 2016-06-28T20:23:19 | \n",
+ " POINT (7.46679 51.51764) | \n",
+ " 688.115800 | \n",
+ " u/min | \n",
+ " 0.000000 | \n",
+ " km/h | \n",
+ " 8.627219 | \n",
+ " % | \n",
+ " 137.000000 | \n",
+ " ... | \n",
+ " 1398 | \n",
+ " Corsa | \n",
+ " 54ce231ee4b0887704ef7335 | \n",
+ " gasoline | \n",
+ " 2013 | \n",
+ " Opel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " 5778dd84e4b0ea2464335ce4 | \n",
+ " 2016-06-28T20:23:24 | \n",
+ " POINT (7.46674 51.51767) | \n",
+ " 680.632932 | \n",
+ " u/min | \n",
+ " 0.000000 | \n",
+ " km/h | \n",
+ " 10.000000 | \n",
+ " % | \n",
+ " 135.000004 | \n",
+ " ... | \n",
+ " 1398 | \n",
+ " Corsa | \n",
+ " 54ce231ee4b0887704ef7335 | \n",
+ " gasoline | \n",
+ " 2013 | \n",
+ " Opel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " 5778dd84e4b0ea2464335ce5 | \n",
+ " 2016-06-28T20:23:29 | \n",
+ " POINT (7.46685 51.51763) | \n",
+ " 1415.100766 | \n",
+ " u/min | \n",
+ " 15.692829 | \n",
+ " km/h | \n",
+ " 10.574426 | \n",
+ " % | \n",
+ " 131.148851 | \n",
+ " ... | \n",
+ " 1398 | \n",
+ " Corsa | \n",
+ " 54ce231ee4b0887704ef7335 | \n",
+ " gasoline | \n",
+ " 2013 | \n",
+ " Opel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " 5778dd84e4b0ea2464335ce6 | \n",
+ " 2016-06-28T20:23:34 | \n",
+ " POINT (7.46736 51.51746) | \n",
+ " 1536.539431 | \n",
+ " u/min | \n",
+ " 30.760125 | \n",
+ " km/h | \n",
+ " 5.501984 | \n",
+ " % | \n",
+ " 129.498016 | \n",
+ " ... | \n",
+ " 1398 | \n",
+ " Corsa | \n",
+ " 54ce231ee4b0887704ef7335 | \n",
+ " gasoline | \n",
+ " 2013 | \n",
+ " Opel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " 5778dd84e4b0ea2464335ce7 | \n",
+ " 2016-06-28T20:23:40 | \n",
+ " POINT (7.46785 51.51726) | \n",
+ " 1280.871960 | \n",
+ " u/min | \n",
+ " 25.000000 | \n",
+ " km/h | \n",
+ " 7.000000 | \n",
+ " % | \n",
+ " 128.000004 | \n",
+ " ... | \n",
+ " 1398 | \n",
+ " Corsa | \n",
+ " 54ce231ee4b0887704ef7335 | \n",
+ " gasoline | \n",
+ " 2013 | \n",
+ " Opel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \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",
+ " 940 | \n",
+ " 5778dd70e4b0ea2464335576 | \n",
+ " 2016-06-28T17:03:10 | \n",
+ " POINT (7.46739 51.51724) | \n",
+ " 794.846166 | \n",
+ " u/min | \n",
+ " 2.785820 | \n",
+ " km/h | \n",
+ " 5.000000 | \n",
+ " % | \n",
+ " 134.478392 | \n",
+ " ... | \n",
+ " 1398 | \n",
+ " Corsa | \n",
+ " 54ce231ee4b0887704ef7335 | \n",
+ " gasoline | \n",
+ " 2013 | \n",
+ " Opel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 941 | \n",
+ " 5778dd70e4b0ea2464335577 | \n",
+ " 2016-06-28T17:03:15 | \n",
+ " POINT (7.46742 51.51724) | \n",
+ " 788.837674 | \n",
+ " u/min | \n",
+ " 3.000000 | \n",
+ " km/h | \n",
+ " 5.536853 | \n",
+ " % | \n",
+ " 136.000000 | \n",
+ " ... | \n",
+ " 1398 | \n",
+ " Corsa | \n",
+ " 54ce231ee4b0887704ef7335 | \n",
+ " gasoline | \n",
+ " 2013 | \n",
+ " Opel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 942 | \n",
+ " 5778dd70e4b0ea2464335578 | \n",
+ " 2016-06-28T17:03:20 | \n",
+ " POINT (7.46744 51.51727) | \n",
+ " 710.400021 | \n",
+ " u/min | \n",
+ " 0.000000 | \n",
+ " km/h | \n",
+ " 10.736527 | \n",
+ " % | \n",
+ " 131.842319 | \n",
+ " ... | \n",
+ " 1398 | \n",
+ " Corsa | \n",
+ " 54ce231ee4b0887704ef7335 | \n",
+ " gasoline | \n",
+ " 2013 | \n",
+ " Opel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 943 | \n",
+ " 5778dd70e4b0ea2464335579 | \n",
+ " 2016-06-28T17:03:25 | \n",
+ " POINT (7.46745 51.51730) | \n",
+ " 806.395580 | \n",
+ " u/min | \n",
+ " 3.000000 | \n",
+ " km/h | \n",
+ " 21.087649 | \n",
+ " % | \n",
+ " 129.999996 | \n",
+ " ... | \n",
+ " 1398 | \n",
+ " Corsa | \n",
+ " 54ce231ee4b0887704ef7335 | \n",
+ " gasoline | \n",
+ " 2013 | \n",
+ " Opel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ " 944 | \n",
+ " 5778dd70e4b0ea246433557a | \n",
+ " 2016-06-28T17:03:30 | \n",
+ " POINT (7.46748 51.51729) | \n",
+ " 804.028967 | \n",
+ " u/min | \n",
+ " 1.460432 | \n",
+ " km/h | \n",
+ " 35.147410 | \n",
+ " % | \n",
+ " 130.000000 | \n",
+ " ... | \n",
+ " 1398 | \n",
+ " Corsa | \n",
+ " 54ce231ee4b0887704ef7335 | \n",
+ " gasoline | \n",
+ " 2013 | \n",
+ " Opel | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ " NaN | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
2964 rows × 50 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " id time geometry \\\n",
+ "0 5778dd84e4b0ea2464335ce2 2016-06-28T20:23:19 POINT (7.46679 51.51764) \n",
+ "1 5778dd84e4b0ea2464335ce4 2016-06-28T20:23:24 POINT (7.46674 51.51767) \n",
+ "2 5778dd84e4b0ea2464335ce5 2016-06-28T20:23:29 POINT (7.46685 51.51763) \n",
+ "3 5778dd84e4b0ea2464335ce6 2016-06-28T20:23:34 POINT (7.46736 51.51746) \n",
+ "4 5778dd84e4b0ea2464335ce7 2016-06-28T20:23:40 POINT (7.46785 51.51726) \n",
+ ".. ... ... ... \n",
+ "940 5778dd70e4b0ea2464335576 2016-06-28T17:03:10 POINT (7.46739 51.51724) \n",
+ "941 5778dd70e4b0ea2464335577 2016-06-28T17:03:15 POINT (7.46742 51.51724) \n",
+ "942 5778dd70e4b0ea2464335578 2016-06-28T17:03:20 POINT (7.46744 51.51727) \n",
+ "943 5778dd70e4b0ea2464335579 2016-06-28T17:03:25 POINT (7.46745 51.51730) \n",
+ "944 5778dd70e4b0ea246433557a 2016-06-28T17:03:30 POINT (7.46748 51.51729) \n",
+ "\n",
+ " Rpm.value Rpm.unit Speed.value Speed.unit GPS Accuracy.value \\\n",
+ "0 688.115800 u/min 0.000000 km/h 8.627219 \n",
+ "1 680.632932 u/min 0.000000 km/h 10.000000 \n",
+ "2 1415.100766 u/min 15.692829 km/h 10.574426 \n",
+ "3 1536.539431 u/min 30.760125 km/h 5.501984 \n",
+ "4 1280.871960 u/min 25.000000 km/h 7.000000 \n",
+ ".. ... ... ... ... ... \n",
+ "940 794.846166 u/min 2.785820 km/h 5.000000 \n",
+ "941 788.837674 u/min 3.000000 km/h 5.536853 \n",
+ "942 710.400021 u/min 0.000000 km/h 10.736527 \n",
+ "943 806.395580 u/min 3.000000 km/h 21.087649 \n",
+ "944 804.028967 u/min 1.460432 km/h 35.147410 \n",
+ "\n",
+ " GPS Accuracy.unit GPS Altitude.value ... sensor.engineDisplacement \\\n",
+ "0 % 137.000000 ... 1398 \n",
+ "1 % 135.000004 ... 1398 \n",
+ "2 % 131.148851 ... 1398 \n",
+ "3 % 129.498016 ... 1398 \n",
+ "4 % 128.000004 ... 1398 \n",
+ ".. ... ... ... ... \n",
+ "940 % 134.478392 ... 1398 \n",
+ "941 % 136.000000 ... 1398 \n",
+ "942 % 131.842319 ... 1398 \n",
+ "943 % 129.999996 ... 1398 \n",
+ "944 % 130.000000 ... 1398 \n",
+ "\n",
+ " sensor.model sensor.id sensor.fuelType \\\n",
+ "0 Corsa 54ce231ee4b0887704ef7335 gasoline \n",
+ "1 Corsa 54ce231ee4b0887704ef7335 gasoline \n",
+ "2 Corsa 54ce231ee4b0887704ef7335 gasoline \n",
+ "3 Corsa 54ce231ee4b0887704ef7335 gasoline \n",
+ "4 Corsa 54ce231ee4b0887704ef7335 gasoline \n",
+ ".. ... ... ... \n",
+ "940 Corsa 54ce231ee4b0887704ef7335 gasoline \n",
+ "941 Corsa 54ce231ee4b0887704ef7335 gasoline \n",
+ "942 Corsa 54ce231ee4b0887704ef7335 gasoline \n",
+ "943 Corsa 54ce231ee4b0887704ef7335 gasoline \n",
+ "944 Corsa 54ce231ee4b0887704ef7335 gasoline \n",
+ "\n",
+ " sensor.constructionYear sensor.manufacturer O2 Lambda Current.value \\\n",
+ "0 2013 Opel NaN \n",
+ "1 2013 Opel NaN \n",
+ "2 2013 Opel NaN \n",
+ "3 2013 Opel NaN \n",
+ "4 2013 Opel NaN \n",
+ ".. ... ... ... \n",
+ "940 2013 Opel NaN \n",
+ "941 2013 Opel NaN \n",
+ "942 2013 Opel NaN \n",
+ "943 2013 Opel NaN \n",
+ "944 2013 Opel NaN \n",
+ "\n",
+ " O2 Lambda Current.unit O2 Lambda Current ER.value \\\n",
+ "0 NaN NaN \n",
+ "1 NaN NaN \n",
+ "2 NaN NaN \n",
+ "3 NaN NaN \n",
+ "4 NaN NaN \n",
+ ".. ... ... \n",
+ "940 NaN NaN \n",
+ "941 NaN NaN \n",
+ "942 NaN NaN \n",
+ "943 NaN NaN \n",
+ "944 NaN NaN \n",
+ "\n",
+ " O2 Lambda Current ER.unit \n",
+ "0 NaN \n",
+ "1 NaN \n",
+ "2 NaN \n",
+ "3 NaN \n",
+ "4 NaN \n",
+ ".. ... \n",
+ "940 NaN \n",
+ "941 NaN \n",
+ "942 NaN \n",
+ "943 NaN \n",
+ "944 NaN \n",
+ "\n",
+ "[2964 rows x 50 columns]"
+ ]
+ },
+ "execution_count": 33,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "bbox = BboxSelector([7.438173,\n",
+ " 51.505323,\n",
+ " 7.496066,\n",
+ " 51.522016\n",
+ "])\n",
+ "\n",
+ "# issue a query\n",
+ "track_df = track_api.get_tracks(bbox=bbox, num_results=50) # requesting 50 tracks inside the bbox\n",
+ "track_df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 34,
+ "metadata": {
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 34,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ "