From d7b2535fba3d9b138f6170d2a6637adcb5427715 Mon Sep 17 00:00:00 2001 From: Nacho Rus Date: Mon, 29 Mar 2021 16:40:03 +0200 Subject: [PATCH 01/18] gitignore --- .gitignore | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..76b9408 --- /dev/null +++ b/.gitignore @@ -0,0 +1,48 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/jupyternotebooks,macos +# Edit at https://www.toptal.com/developers/gitignore?templates=jupyternotebooks,macos + +### JupyterNotebooks ### +# gitignore template for Jupyter Notebooks +# website: http://jupyter.org/ + +.ipynb_checkpoints +*/.ipynb_checkpoints/* + +# IPython +profile_default/ +ipython_config.py + +# Remove previous ipynb_checkpoints +# git rm -r .ipynb_checkpoints/ + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# End of https://www.toptal.com/developers/gitignore/api/jupyternotebooks,macos \ No newline at end of file From f9ab563eb1f7bd45018fd22a3fb66830c3f53a5f Mon Sep 17 00:00:00 2001 From: Nacho Rus Date: Tue, 30 Mar 2021 17:57:01 +0200 Subject: [PATCH 02/18] start --- your-project/AirQuality-Lisa.ipynb | 252 ++++++++++++++++++++++ your-project/AirQuality-Nacho.ipynb | 252 ++++++++++++++++++++++ your-project/AirQuality-Tsvetelina.ipynb | 252 ++++++++++++++++++++++ your-project/AirQuality.ipynb | 260 +++++++++++++++++++++++ 4 files changed, 1016 insertions(+) create mode 100644 your-project/AirQuality-Lisa.ipynb create mode 100644 your-project/AirQuality-Nacho.ipynb create mode 100644 your-project/AirQuality-Tsvetelina.ipynb create mode 100644 your-project/AirQuality.ipynb diff --git a/your-project/AirQuality-Lisa.ipynb b/your-project/AirQuality-Lisa.ipynb new file mode 100644 index 0000000..9af8e26 --- /dev/null +++ b/your-project/AirQuality-Lisa.ipynb @@ -0,0 +1,252 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "facial-portfolio", + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-30T15:53:34.467216Z", + "start_time": "2021-03-30T15:53:34.316194Z" + } + }, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StationAir QualityLongitudeLatitudeO3 HourO3 QualityO3 ValueNO2 HourNO2 QualityNO2 ValuePM10 HourPM10 QualityPM10 ValueGeneratedDate Time
0Barcelona - SantsGood2.133141.3788NaNNaNNaN0hGood84.0NaNNaNNaN01/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hGood1.00hModerate113.00hGood36.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood10.00hGood73.0NaNNaNNaN01/11/2018 0:001541027104
3Barcelona - CiutadellaGood2.187441.38640hGood2.00hGood86.0NaNNaNNaN01/11/2018 0:001541027104
4Barcelona - Vall HebronGood2.148041.42610hGood7.00hGood69.0NaNNaNNaN01/11/2018 0:001541027104
\n", + "
" + ], + "text/plain": [ + " Station Air Quality Longitude Latitude O3 Hour \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 NaN \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", + "3 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", + "4 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", + "\n", + " O3 Quality O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour PM10 Quality \\\n", + "0 NaN NaN 0h Good 84.0 NaN NaN \n", + "1 Good 1.0 0h Moderate 113.0 0h Good \n", + "2 Good 10.0 0h Good 73.0 NaN NaN \n", + "3 Good 2.0 0h Good 86.0 NaN NaN \n", + "4 Good 7.0 0h Good 69.0 NaN NaN \n", + "\n", + " PM10 Value Generated Date Time \n", + "0 NaN 01/11/2018 0:00 1541027104 \n", + "1 36.0 01/11/2018 0:00 1541027104 \n", + "2 NaN 01/11/2018 0:00 1541027104 \n", + "3 NaN 01/11/2018 0:00 1541027104 \n", + "4 NaN 01/11/2018 0:00 1541027104 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "data = pd.read_csv('../datasets/2.-Urban-Environment/air-quality-nov-2017.csv')\n", + "\n", + "data.head()" + ] + } + ], + "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.8.2" + }, + "latex_envs": { + "LaTeX_envs_menu_present": true, + "autoclose": false, + "autocomplete": true, + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 1, + "hotkeys": { + "equation": "Ctrl-E", + "itemize": "Ctrl-I" + }, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false + }, + "varInspector": { + "cols": { + "lenName": 16, + "lenType": 16, + "lenVar": 40 + }, + "kernels_config": { + "python": { + "delete_cmd_postfix": "", + "delete_cmd_prefix": "del ", + "library": "var_list.py", + "varRefreshCmd": "print(var_dic_list())" + }, + "r": { + "delete_cmd_postfix": ") ", + "delete_cmd_prefix": "rm(", + "library": "var_list.r", + "varRefreshCmd": "cat(var_dic_list()) " + } + }, + "types_to_exclude": [ + "module", + "function", + "builtin_function_or_method", + "instance", + "_Feature" + ], + "window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/your-project/AirQuality-Nacho.ipynb b/your-project/AirQuality-Nacho.ipynb new file mode 100644 index 0000000..9af8e26 --- /dev/null +++ b/your-project/AirQuality-Nacho.ipynb @@ -0,0 +1,252 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "facial-portfolio", + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-30T15:53:34.467216Z", + "start_time": "2021-03-30T15:53:34.316194Z" + } + }, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StationAir QualityLongitudeLatitudeO3 HourO3 QualityO3 ValueNO2 HourNO2 QualityNO2 ValuePM10 HourPM10 QualityPM10 ValueGeneratedDate Time
0Barcelona - SantsGood2.133141.3788NaNNaNNaN0hGood84.0NaNNaNNaN01/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hGood1.00hModerate113.00hGood36.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood10.00hGood73.0NaNNaNNaN01/11/2018 0:001541027104
3Barcelona - CiutadellaGood2.187441.38640hGood2.00hGood86.0NaNNaNNaN01/11/2018 0:001541027104
4Barcelona - Vall HebronGood2.148041.42610hGood7.00hGood69.0NaNNaNNaN01/11/2018 0:001541027104
\n", + "
" + ], + "text/plain": [ + " Station Air Quality Longitude Latitude O3 Hour \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 NaN \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", + "3 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", + "4 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", + "\n", + " O3 Quality O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour PM10 Quality \\\n", + "0 NaN NaN 0h Good 84.0 NaN NaN \n", + "1 Good 1.0 0h Moderate 113.0 0h Good \n", + "2 Good 10.0 0h Good 73.0 NaN NaN \n", + "3 Good 2.0 0h Good 86.0 NaN NaN \n", + "4 Good 7.0 0h Good 69.0 NaN NaN \n", + "\n", + " PM10 Value Generated Date Time \n", + "0 NaN 01/11/2018 0:00 1541027104 \n", + "1 36.0 01/11/2018 0:00 1541027104 \n", + "2 NaN 01/11/2018 0:00 1541027104 \n", + "3 NaN 01/11/2018 0:00 1541027104 \n", + "4 NaN 01/11/2018 0:00 1541027104 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "data = pd.read_csv('../datasets/2.-Urban-Environment/air-quality-nov-2017.csv')\n", + "\n", + "data.head()" + ] + } + ], + "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.8.2" + }, + "latex_envs": { + "LaTeX_envs_menu_present": true, + "autoclose": false, + "autocomplete": true, + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 1, + "hotkeys": { + "equation": "Ctrl-E", + "itemize": "Ctrl-I" + }, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false + }, + "varInspector": { + "cols": { + "lenName": 16, + "lenType": 16, + "lenVar": 40 + }, + "kernels_config": { + "python": { + "delete_cmd_postfix": "", + "delete_cmd_prefix": "del ", + "library": "var_list.py", + "varRefreshCmd": "print(var_dic_list())" + }, + "r": { + "delete_cmd_postfix": ") ", + "delete_cmd_prefix": "rm(", + "library": "var_list.r", + "varRefreshCmd": "cat(var_dic_list()) " + } + }, + "types_to_exclude": [ + "module", + "function", + "builtin_function_or_method", + "instance", + "_Feature" + ], + "window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/your-project/AirQuality-Tsvetelina.ipynb b/your-project/AirQuality-Tsvetelina.ipynb new file mode 100644 index 0000000..9af8e26 --- /dev/null +++ b/your-project/AirQuality-Tsvetelina.ipynb @@ -0,0 +1,252 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "facial-portfolio", + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-30T15:53:34.467216Z", + "start_time": "2021-03-30T15:53:34.316194Z" + } + }, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StationAir QualityLongitudeLatitudeO3 HourO3 QualityO3 ValueNO2 HourNO2 QualityNO2 ValuePM10 HourPM10 QualityPM10 ValueGeneratedDate Time
0Barcelona - SantsGood2.133141.3788NaNNaNNaN0hGood84.0NaNNaNNaN01/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hGood1.00hModerate113.00hGood36.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood10.00hGood73.0NaNNaNNaN01/11/2018 0:001541027104
3Barcelona - CiutadellaGood2.187441.38640hGood2.00hGood86.0NaNNaNNaN01/11/2018 0:001541027104
4Barcelona - Vall HebronGood2.148041.42610hGood7.00hGood69.0NaNNaNNaN01/11/2018 0:001541027104
\n", + "
" + ], + "text/plain": [ + " Station Air Quality Longitude Latitude O3 Hour \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 NaN \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", + "3 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", + "4 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", + "\n", + " O3 Quality O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour PM10 Quality \\\n", + "0 NaN NaN 0h Good 84.0 NaN NaN \n", + "1 Good 1.0 0h Moderate 113.0 0h Good \n", + "2 Good 10.0 0h Good 73.0 NaN NaN \n", + "3 Good 2.0 0h Good 86.0 NaN NaN \n", + "4 Good 7.0 0h Good 69.0 NaN NaN \n", + "\n", + " PM10 Value Generated Date Time \n", + "0 NaN 01/11/2018 0:00 1541027104 \n", + "1 36.0 01/11/2018 0:00 1541027104 \n", + "2 NaN 01/11/2018 0:00 1541027104 \n", + "3 NaN 01/11/2018 0:00 1541027104 \n", + "4 NaN 01/11/2018 0:00 1541027104 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "data = pd.read_csv('../datasets/2.-Urban-Environment/air-quality-nov-2017.csv')\n", + "\n", + "data.head()" + ] + } + ], + "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.8.2" + }, + "latex_envs": { + "LaTeX_envs_menu_present": true, + "autoclose": false, + "autocomplete": true, + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 1, + "hotkeys": { + "equation": "Ctrl-E", + "itemize": "Ctrl-I" + }, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false + }, + "varInspector": { + "cols": { + "lenName": 16, + "lenType": 16, + "lenVar": 40 + }, + "kernels_config": { + "python": { + "delete_cmd_postfix": "", + "delete_cmd_prefix": "del ", + "library": "var_list.py", + "varRefreshCmd": "print(var_dic_list())" + }, + "r": { + "delete_cmd_postfix": ") ", + "delete_cmd_prefix": "rm(", + "library": "var_list.r", + "varRefreshCmd": "cat(var_dic_list()) " + } + }, + "types_to_exclude": [ + "module", + "function", + "builtin_function_or_method", + "instance", + "_Feature" + ], + "window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/your-project/AirQuality.ipynb b/your-project/AirQuality.ipynb new file mode 100644 index 0000000..de4fa91 --- /dev/null +++ b/your-project/AirQuality.ipynb @@ -0,0 +1,260 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "id": "sexual-ridge", + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-30T15:53:34.467216Z", + "start_time": "2021-03-30T15:53:34.316194Z" + } + }, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StationAir QualityLongitudeLatitudeO3 HourO3 QualityO3 ValueNO2 HourNO2 QualityNO2 ValuePM10 HourPM10 QualityPM10 ValueGeneratedDate Time
0Barcelona - SantsGood2.133141.3788NaNNaNNaN0hGood84.0NaNNaNNaN01/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hGood1.00hModerate113.00hGood36.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood10.00hGood73.0NaNNaNNaN01/11/2018 0:001541027104
3Barcelona - CiutadellaGood2.187441.38640hGood2.00hGood86.0NaNNaNNaN01/11/2018 0:001541027104
4Barcelona - Vall HebronGood2.148041.42610hGood7.00hGood69.0NaNNaNNaN01/11/2018 0:001541027104
\n", + "
" + ], + "text/plain": [ + " Station Air Quality Longitude Latitude O3 Hour \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 NaN \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", + "3 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", + "4 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", + "\n", + " O3 Quality O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour PM10 Quality \\\n", + "0 NaN NaN 0h Good 84.0 NaN NaN \n", + "1 Good 1.0 0h Moderate 113.0 0h Good \n", + "2 Good 10.0 0h Good 73.0 NaN NaN \n", + "3 Good 2.0 0h Good 86.0 NaN NaN \n", + "4 Good 7.0 0h Good 69.0 NaN NaN \n", + "\n", + " PM10 Value Generated Date Time \n", + "0 NaN 01/11/2018 0:00 1541027104 \n", + "1 36.0 01/11/2018 0:00 1541027104 \n", + "2 NaN 01/11/2018 0:00 1541027104 \n", + "3 NaN 01/11/2018 0:00 1541027104 \n", + "4 NaN 01/11/2018 0:00 1541027104 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "data = pd.read_csv('../datasets/2.-Urban-Environment/air-quality-nov-2017.csv')\n", + "\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "spare-result", + "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.8.2" + }, + "latex_envs": { + "LaTeX_envs_menu_present": true, + "autoclose": false, + "autocomplete": true, + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 1, + "hotkeys": { + "equation": "Ctrl-E", + "itemize": "Ctrl-I" + }, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false + }, + "varInspector": { + "cols": { + "lenName": 16, + "lenType": 16, + "lenVar": 40 + }, + "kernels_config": { + "python": { + "delete_cmd_postfix": "", + "delete_cmd_prefix": "del ", + "library": "var_list.py", + "varRefreshCmd": "print(var_dic_list())" + }, + "r": { + "delete_cmd_postfix": ") ", + "delete_cmd_prefix": "rm(", + "library": "var_list.r", + "varRefreshCmd": "cat(var_dic_list()) " + } + }, + "types_to_exclude": [ + "module", + "function", + "builtin_function_or_method", + "instance", + "_Feature" + ], + "window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 9e51f92d402f35495c4e7683904e5d36f50d6e4f Mon Sep 17 00:00:00 2001 From: Nacho Rus Date: Tue, 30 Mar 2021 18:06:44 +0200 Subject: [PATCH 03/18] Trial --- your-project/AirQuality-Nacho.ipynb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/your-project/AirQuality-Nacho.ipynb b/your-project/AirQuality-Nacho.ipynb index 9af8e26..896b789 100644 --- a/your-project/AirQuality-Nacho.ipynb +++ b/your-project/AirQuality-Nacho.ipynb @@ -179,6 +179,30 @@ "\n", "data.head()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "italic-franklin", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "collaborative-laser", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "muslim-kingdom", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 9a902c044c0f687e3391d86121635e3624ea707b Mon Sep 17 00:00:00 2001 From: lisasaundersgit Date: Thu, 1 Apr 2021 11:46:21 +0200 Subject: [PATCH 04/18] update code --- your-project/AirQuality-Lisa.ipynb | 3029 +++++++++++++++++++++++++++- 1 file changed, 2991 insertions(+), 38 deletions(-) diff --git a/your-project/AirQuality-Lisa.ipynb b/your-project/AirQuality-Lisa.ipynb index 9af8e26..4b5bfeb 100644 --- a/your-project/AirQuality-Lisa.ipynb +++ b/your-project/AirQuality-Lisa.ipynb @@ -2,8 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, - "id": "facial-portfolio", + "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2021-03-30T15:53:34.467216Z", @@ -104,18 +103,249 @@ " 01/11/2018 0:00\n", " 1541027104\n", " \n", + " \n", + "\n", + "" + ], + "text/plain": [ + " Station Air Quality Longitude Latitude O3 Hour O3 Quality \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 NaN NaN \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h Good \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h Good \n", + "\n", + " O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour PM10 Quality \\\n", + "0 NaN 0h Good 84.0 NaN NaN \n", + "1 1.0 0h Moderate 113.0 0h Good \n", + "2 10.0 0h Good 73.0 NaN NaN \n", + "\n", + " PM10 Value Generated Date Time \n", + "0 NaN 01/11/2018 0:00 1541027104 \n", + "1 36.0 01/11/2018 0:00 1541027104 \n", + "2 NaN 01/11/2018 0:00 1541027104 " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "\n", + "data = pd.read_csv('../datasets/2.-Urban-Environment/air-quality-nov-2017.csv')\n", + "\n", + "data.head(3)" + ] + }, + { + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
LongitudeLatitudeO3 ValueNO2 ValuePM10 ValueDate Time
3Barcelona - CiutadellaGood2.187441.38640hcount5744.000005744.0000004101.0000005460.0000003647.0000005.744000e+03
mean2.1524013877.82771434.08290735.74029316.5900741.542323e+09
std0.0285974410.80316822.96068722.3572628.0654247.483961e+05
min2.1151041.3788001.0000001.0000002.0000001.541027e+09
25%2.1308041.38640014.00000017.00000010.0000001.541675e+09
50%2.1507041.39870034.00000033.00000015.0000001.542325e+09
75%2.1622041.41830052.00000052.00000022.0000001.542971e+09
max2.20450414261.000000100.000000117.00000044.0000001.543616e+09
\n", + "
" + ], + "text/plain": [ + " Longitude Latitude O3 Value NO2 Value PM10 Value \\\n", + "count 5744.00000 5744.000000 4101.000000 5460.000000 3647.000000 \n", + "mean 2.15240 13877.827714 34.082907 35.740293 16.590074 \n", + "std 0.02859 74410.803168 22.960687 22.357262 8.065424 \n", + "min 2.11510 41.378800 1.000000 1.000000 2.000000 \n", + "25% 2.13080 41.386400 14.000000 17.000000 10.000000 \n", + "50% 2.15070 41.398700 34.000000 33.000000 15.000000 \n", + "75% 2.16220 41.418300 52.000000 52.000000 22.000000 \n", + "max 2.20450 414261.000000 100.000000 117.000000 44.000000 \n", + "\n", + " Date Time \n", + "count 5.744000e+03 \n", + "mean 1.542323e+09 \n", + "std 7.483961e+05 \n", + "min 1.541027e+09 \n", + "25% 1.541675e+09 \n", + "50% 1.542325e+09 \n", + "75% 1.542971e+09 \n", + "max 1.543616e+09 " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.describe()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pm.groupby('Station')" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "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", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -123,17 +353,35 @@ " \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", @@ -145,40 +393,2745 @@ "" ], "text/plain": [ - " Station Air Quality Longitude Latitude O3 Hour \\\n", - "0 Barcelona - Sants Good 2.1331 41.3788 NaN \n", - "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", - "2 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", - "3 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", - "4 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", + " Station Air Quality Longitude Latitude O3 Hour O3 Quality \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 NaN NaN \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h Good \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h Good \n", "\n", - " O3 Quality O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour PM10 Quality \\\n", - "0 NaN NaN 0h Good 84.0 NaN NaN \n", - "1 Good 1.0 0h Moderate 113.0 0h Good \n", - "2 Good 10.0 0h Good 73.0 NaN NaN \n", - "3 Good 2.0 0h Good 86.0 NaN NaN \n", - "4 Good 7.0 0h Good 69.0 NaN NaN \n", + " O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour PM10 Quality \\\n", + "0 NaN 0h Good 84.0 NaN NaN \n", + "1 1.0 0h Moderate 113.0 0h Good \n", + "2 10.0 0h Good 73.0 NaN NaN \n", "\n", " PM10 Value Generated Date Time \n", "0 NaN 01/11/2018 0:00 1541027104 \n", "1 36.0 01/11/2018 0:00 1541027104 \n", - "2 NaN 01/11/2018 0:00 1541027104 \n", - "3 NaN 01/11/2018 0:00 1541027104 \n", - "4 NaN 01/11/2018 0:00 1541027104 " + "2 NaN 01/11/2018 0:00 1541027104 " ] }, - "execution_count": 3, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "import pandas as pd\n", - "\n", - "data = pd.read_csv('../datasets/2.-Urban-Environment/air-quality-nov-2017.csv')\n", - "\n", - "data.head()" + "df = pd.DataFrame(data)\n", + "df.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "df_no2 = df[['Station', 'Air Quality', 'Longitude', 'Latitude', 'NO2 Hour', 'NO2 Quality', 'NO2 Value', 'Generated', 'Date Time']].copy()" ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "
StationAir QualityLongitudeLatitudeO3 HourO3 QualityO3 ValueNO2 HourNO2 QualityNO2 ValuePM10 HourPM10 QualityPM10 ValueGeneratedDate Time
0Barcelona - SantsGood2.02.133141.3788NaNNaNNaN0hGood86.084.0NaNNaNNaN1541027104
4Barcelona - Vall Hebron1Barcelona - EixampleModerate2.153841.38530hGood2.148041.42611.00hModerate113.00hGood7.036.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood69.010.00hGood73.0NaNNaNNaN
\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", + " \n", + " \n", + " \n", + " \n", + "
StationAir QualityLongitudeLatitudeNO2 HourNO2 QualityNO2 ValueGeneratedDate Time
5741Barcelona - Palau ReialGood2.115141.387522hGood20.030/11/2018 23:001543615502
5742Barcelona - PoblenouGood2.204541.403922hGood70.030/11/2018 23:001543615502
5743Barcelona - Observ FabraGood2.123941.418322hGood21.030/11/2018 23:001543615502
\n", + "
" + ], + "text/plain": [ + " Station Air Quality Longitude Latitude NO2 Hour \\\n", + "5741 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", + "5742 Barcelona - Poblenou Good 2.2045 41.4039 22h \n", + "5743 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", + "\n", + " NO2 Quality NO2 Value Generated Date Time \n", + "5741 Good 20.0 30/11/2018 23:00 1543615502 \n", + "5742 Good 70.0 30/11/2018 23:00 1543615502 \n", + "5743 Good 21.0 30/11/2018 23:00 1543615502 " + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no2.tail(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "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", + " \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", + "
StationAir QualityLongitudeLatitudeNO2 HourNO2 QualityNO2 ValueGeneratedDate Time
0Barcelona - SantsGood2.133141.37880hGood84.001/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hModerate113.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood73.001/11/2018 0:001541027104
\n", + "
" + ], + "text/plain": [ + " Station Air Quality Longitude Latitude NO2 Hour NO2 Quality \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 0h Good \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h Moderate \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h Good \n", + "\n", + " NO2 Value Generated Date Time \n", + "0 84.0 01/11/2018 0:00 1541027104 \n", + "1 113.0 01/11/2018 0:00 1541027104 \n", + "2 73.0 01/11/2018 0:00 1541027104 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no2.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "df_no2.columns = ['station', 'air_quality', 'longitude', 'latitude', 'no2_hour', 'no2_quality', 'no2_value', 'date', 'date_time']" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "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", + " \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", + "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
0Barcelona - SantsGood2.133141.37880hGood84.001/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hModerate113.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood73.001/11/2018 0:001541027104
\n", + "
" + ], + "text/plain": [ + " station air_quality longitude latitude no2_hour no2_quality \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 0h Good \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h Moderate \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h Good \n", + "\n", + " no2_value date date_time \n", + "0 84.0 01/11/2018 0:00 1541027104 \n", + "1 113.0 01/11/2018 0:00 1541027104 \n", + "2 73.0 01/11/2018 0:00 1541027104 " + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no2.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
minmaxmeanmedian
no2_hour
0h2.0113.042.85489042.0
10h1.0117.043.71966545.0
11h1.0109.038.46666735.0
12h2.080.030.61233526.0
13h1.083.027.26141122.0
14h2.071.028.05339823.5
15h2.088.028.34272323.0
16h3.084.028.91071424.5
17h3.080.032.72811129.0
18h6.089.042.25321940.0
19h6.0101.049.32000049.0
1h2.096.035.71428635.0
20h4.0105.050.50450552.0
21h4.097.048.50672650.0
22h3.097.044.53296745.5
23h3.088.039.03973538.0
2h2.086.030.23580826.0
3h1.077.026.77292623.0
4h1.065.024.64444421.0
5h1.067.023.29870119.0
6h1.064.024.31489421.0
7h1.080.030.37229427.0
8h1.0103.040.00423742.0
9h1.0116.046.26890849.0
\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "no2_hour \n", + "0h 2.0 113.0 42.854890 42.0\n", + "10h 1.0 117.0 43.719665 45.0\n", + "11h 1.0 109.0 38.466667 35.0\n", + "12h 2.0 80.0 30.612335 26.0\n", + "13h 1.0 83.0 27.261411 22.0\n", + "14h 2.0 71.0 28.053398 23.5\n", + "15h 2.0 88.0 28.342723 23.0\n", + "16h 3.0 84.0 28.910714 24.5\n", + "17h 3.0 80.0 32.728111 29.0\n", + "18h 6.0 89.0 42.253219 40.0\n", + "19h 6.0 101.0 49.320000 49.0\n", + "1h 2.0 96.0 35.714286 35.0\n", + "20h 4.0 105.0 50.504505 52.0\n", + "21h 4.0 97.0 48.506726 50.0\n", + "22h 3.0 97.0 44.532967 45.5\n", + "23h 3.0 88.0 39.039735 38.0\n", + "2h 2.0 86.0 30.235808 26.0\n", + "3h 1.0 77.0 26.772926 23.0\n", + "4h 1.0 65.0 24.644444 21.0\n", + "5h 1.0 67.0 23.298701 19.0\n", + "6h 1.0 64.0 24.314894 21.0\n", + "7h 1.0 80.0 30.372294 27.0\n", + "8h 1.0 103.0 40.004237 42.0\n", + "9h 1.0 116.0 46.268908 49.0" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no2.groupby('no2_hour').no2_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "mean_stations = df_no2.groupby('station').mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
no2_value_mean
station
Barcelona - Ciutadella39.855920
Barcelona - Eixample56.240683
Barcelona - Gràcia44.574534
Barcelona - Observ Fabra11.449213
Barcelona - Palau Reial27.974322
Barcelona - Poblenou41.161103
Barcelona - Sants36.359165
Barcelona - Vall Hebron30.812940
\n", + "
" + ], + "text/plain": [ + " no2_value_mean\n", + "station \n", + "Barcelona - Ciutadella 39.855920\n", + "Barcelona - Eixample 56.240683\n", + "Barcelona - Gràcia 44.574534\n", + "Barcelona - Observ Fabra 11.449213\n", + "Barcelona - Palau Reial 27.974322\n", + "Barcelona - Poblenou 41.161103\n", + "Barcelona - Sants 36.359165\n", + "Barcelona - Vall Hebron 30.812940" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_mean_stations = mean_stations.drop(columns = ['longitude','latitude', 'date_time'])\n", + "df_mean_stations.columns = ['no2_value_mean']\n", + "df_mean_stations" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "median_stations = df_no2.groupby('station').median()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "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", + " \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", + " \n", + "
minmaxmeanmedian
station
Barcelona - Ciutadella5.088.039.85592040.0
Barcelona - Eixample17.0113.056.24068354.0
Barcelona - Gràcia6.0117.044.57453442.0
Barcelona - Observ Fabra1.071.011.4492139.0
Barcelona - Palau Reial1.099.027.97432222.0
Barcelona - Poblenou5.0105.041.16110341.0
Barcelona - Sants7.089.036.35916533.0
Barcelona - Vall Hebron6.091.030.81294026.0
\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "station \n", + "Barcelona - Ciutadella 5.0 88.0 39.855920 40.0\n", + "Barcelona - Eixample 17.0 113.0 56.240683 54.0\n", + "Barcelona - Gràcia 6.0 117.0 44.574534 42.0\n", + "Barcelona - Observ Fabra 1.0 71.0 11.449213 9.0\n", + "Barcelona - Palau Reial 1.0 99.0 27.974322 22.0\n", + "Barcelona - Poblenou 5.0 105.0 41.161103 41.0\n", + "Barcelona - Sants 7.0 89.0 36.359165 33.0\n", + "Barcelona - Vall Hebron 6.0 91.0 30.812940 26.0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no2.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "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", + " \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", + " \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", + "
minmaxmeanmedian
stationno2_hour
Barcelona - Ciutadella0h5.086.048.15789548.5
10h21.081.053.10000058.5
11h16.086.045.04878043.0
12h12.070.036.45833333.0
13h11.065.031.15384627.5
..................
Barcelona - Vall Hebron5h6.053.019.70000012.0
6h8.047.022.74193520.0
7h8.080.032.48275927.0
8h8.077.038.30000037.5
9h8.088.038.65517233.0
\n", + "

192 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "station no2_hour \n", + "Barcelona - Ciutadella 0h 5.0 86.0 48.157895 48.5\n", + " 10h 21.0 81.0 53.100000 58.5\n", + " 11h 16.0 86.0 45.048780 43.0\n", + " 12h 12.0 70.0 36.458333 33.0\n", + " 13h 11.0 65.0 31.153846 27.5\n", + "... ... ... ... ...\n", + "Barcelona - Vall Hebron 5h 6.0 53.0 19.700000 12.0\n", + " 6h 8.0 47.0 22.741935 20.0\n", + " 7h 8.0 80.0 32.482759 27.0\n", + " 8h 8.0 77.0 38.300000 37.5\n", + " 9h 8.0 88.0 38.655172 33.0\n", + "\n", + "[192 rows x 4 columns]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no2.groupby(['station', 'no2_hour']).no2_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "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", + " \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", + " \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", + " \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", + "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
0Barcelona - SantsGood2.133141.37880hGood84.001/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hModerate113.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood73.001/11/2018 0:001541027104
3Barcelona - CiutadellaGood2.187441.38640hGood86.001/11/2018 0:001541027104
4Barcelona - Vall HebronGood2.148041.42610hGood69.001/11/2018 0:001541027104
..............................
5739Barcelona - CiutadellaGood2.187441.386422hGood57.030/11/2018 23:001543615502
5740Barcelona - Vall HebronGood2.148041.426122hGood31.030/11/2018 23:001543615502
5741Barcelona - Palau ReialGood2.115141.387522hGood20.030/11/2018 23:001543615502
5742Barcelona - PoblenouGood2.204541.403922hGood70.030/11/2018 23:001543615502
5743Barcelona - Observ FabraGood2.123941.418322hGood21.030/11/2018 23:001543615502
\n", + "

5720 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " station air_quality longitude latitude no2_hour \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 0h \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", + "3 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", + "4 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", + "... ... ... ... ... ... \n", + "5739 Barcelona - Ciutadella Good 2.1874 41.3864 22h \n", + "5740 Barcelona - Vall Hebron Good 2.1480 41.4261 22h \n", + "5741 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", + "5742 Barcelona - Poblenou Good 2.2045 41.4039 22h \n", + "5743 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", + "\n", + " no2_quality no2_value date date_time \n", + "0 Good 84.0 01/11/2018 0:00 1541027104 \n", + "1 Moderate 113.0 01/11/2018 0:00 1541027104 \n", + "2 Good 73.0 01/11/2018 0:00 1541027104 \n", + "3 Good 86.0 01/11/2018 0:00 1541027104 \n", + "4 Good 69.0 01/11/2018 0:00 1541027104 \n", + "... ... ... ... ... \n", + "5739 Good 57.0 30/11/2018 23:00 1543615502 \n", + "5740 Good 31.0 30/11/2018 23:00 1543615502 \n", + "5741 Good 20.0 30/11/2018 23:00 1543615502 \n", + "5742 Good 70.0 30/11/2018 23:00 1543615502 \n", + "5743 Good 21.0 30/11/2018 23:00 1543615502 \n", + "\n", + "[5720 rows x 9 columns]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_nov = df_no2[df_no2['date'].str.contains('\\d{2}/11/2018')].groupby(['date'])\n", + "df_nov.head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "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", + " \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", + " \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", + " \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", + "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
576Barcelona - SantsGood2.133141.37880hGood31.004/11/2018 0:001541286304
577Barcelona - EixampleGood2.153841.38530hGood41.004/11/2018 0:001541286304
578Barcelona - GràciaGood2.153441.39870hGood58.004/11/2018 0:001541286304
579Barcelona - CiutadellaGood2.187441.38640hGood48.004/11/2018 0:001541286304
580Barcelona - Vall HebronGood2.148041.42610hGood26.004/11/2018 0:001541286304
..............................
4779Barcelona - CiutadellaGood2.187441.386422hGood51.025/11/2018 23:001543183501
4780Barcelona - Vall HebronGood2.148041.426122hGood46.025/11/2018 23:001543183501
4781Barcelona - Palau ReialGood2.115141.387522hGood41.025/11/2018 23:001543183501
4782Barcelona - PoblenouGood2.204541.403922hGood52.025/11/2018 23:001543183501
4783Barcelona - Observ FabraGood2.123941.418322hGood7.025/11/2018 23:001543183501
\n", + "

760 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " station air_quality longitude latitude no2_hour \\\n", + "576 Barcelona - Sants Good 2.1331 41.3788 0h \n", + "577 Barcelona - Eixample Good 2.1538 41.3853 0h \n", + "578 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", + "579 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", + "580 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", + "... ... ... ... ... ... \n", + "4779 Barcelona - Ciutadella Good 2.1874 41.3864 22h \n", + "4780 Barcelona - Vall Hebron Good 2.1480 41.4261 22h \n", + "4781 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", + "4782 Barcelona - Poblenou Good 2.2045 41.4039 22h \n", + "4783 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", + "\n", + " no2_quality no2_value date date_time \n", + "576 Good 31.0 04/11/2018 0:00 1541286304 \n", + "577 Good 41.0 04/11/2018 0:00 1541286304 \n", + "578 Good 58.0 04/11/2018 0:00 1541286304 \n", + "579 Good 48.0 04/11/2018 0:00 1541286304 \n", + "580 Good 26.0 04/11/2018 0:00 1541286304 \n", + "... ... ... ... ... \n", + "4779 Good 51.0 25/11/2018 23:00 1543183501 \n", + "4780 Good 46.0 25/11/2018 23:00 1543183501 \n", + "4781 Good 41.0 25/11/2018 23:00 1543183501 \n", + "4782 Good 52.0 25/11/2018 23:00 1543183501 \n", + "4783 Good 7.0 25/11/2018 23:00 1543183501 \n", + "\n", + "[760 rows x 9 columns]" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_mon = df_no2[df_no2['date'].str.contains('04/11/2018|11/11/2018|18/11/2018|25/11/2018')].groupby(['date'])\n", + "df_mon.head(10) #make dates more neat" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "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", + " \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", + " \n", + "
minmaxmeanmedian
station
Barcelona - Ciutadella5.072.034.76595735.0
Barcelona - Eixample18.099.044.01149442.0
Barcelona - Gràcia6.083.030.60227326.5
Barcelona - Observ Fabra1.024.07.8526327.0
Barcelona - Palau Reial2.080.016.80851112.5
Barcelona - Poblenou6.086.030.64893626.5
Barcelona - Sants9.083.024.92941222.0
Barcelona - Vall Hebron7.082.017.67021313.5
\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "station \n", + "Barcelona - Ciutadella 5.0 72.0 34.765957 35.0\n", + "Barcelona - Eixample 18.0 99.0 44.011494 42.0\n", + "Barcelona - Gràcia 6.0 83.0 30.602273 26.5\n", + "Barcelona - Observ Fabra 1.0 24.0 7.852632 7.0\n", + "Barcelona - Palau Reial 2.0 80.0 16.808511 12.5\n", + "Barcelona - Poblenou 6.0 86.0 30.648936 26.5\n", + "Barcelona - Sants 9.0 83.0 24.929412 22.0\n", + "Barcelona - Vall Hebron 7.0 82.0 17.670213 13.5" + ] + }, + "execution_count": 105, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_sun = df_no2[df_no2['date'].str.contains('04/11/2018|11/11/2018|18/11/2018|25/11/2018')]\n", + "df_sun.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "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", + " \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", + " \n", + "
minmaxmeanmedian
station
Barcelona - Ciutadella11.083.047.03260945.5
Barcelona - Eixample32.0112.061.72413860.0
Barcelona - Gràcia16.097.049.35135146.0
Barcelona - Observ Fabra2.024.010.85263210.0
Barcelona - Palau Reial3.078.029.18947423.0
Barcelona - Poblenou12.088.047.35106444.5
Barcelona - Sants9.078.038.27058837.0
Barcelona - Vall Hebron9.080.030.81720428.0
\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "station \n", + "Barcelona - Ciutadella 11.0 83.0 47.032609 45.5\n", + "Barcelona - Eixample 32.0 112.0 61.724138 60.0\n", + "Barcelona - Gràcia 16.0 97.0 49.351351 46.0\n", + "Barcelona - Observ Fabra 2.0 24.0 10.852632 10.0\n", + "Barcelona - Palau Reial 3.0 78.0 29.189474 23.0\n", + "Barcelona - Poblenou 12.0 88.0 47.351064 44.5\n", + "Barcelona - Sants 9.0 78.0 38.270588 37.0\n", + "Barcelona - Vall Hebron 9.0 80.0 30.817204 28.0" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_wed = df_no2[df_no2['date'].str.contains('07/11/2018|14/11/2018|21/11/2018|28/11/2018')]\n", + "df_wed.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "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", + " \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", + " \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", + " \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", + "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
48Barcelona - Sants--2.133141.37884h--NaN01/11/2018 6:001541048703
49Barcelona - EixampleGood2.153841.38535hGood31.001/11/2018 6:001541048703
50Barcelona - GràciaGood2.153441.39875hGood19.001/11/2018 6:001541048703
51Barcelona - CiutadellaGood2.187441.38645hGood18.001/11/2018 6:001541048703
52Barcelona - Vall HebronGood2.148041.42615hGood8.001/11/2018 6:001541048703
..............................
5707Barcelona - CiutadellaGood2.187441.386418hGood58.030/11/2018 19:001543601102
5708Barcelona - Vall HebronGood2.148041.426118hGood40.030/11/2018 19:001543601102
5709Barcelona - Palau ReialGood2.115141.387518hGood53.030/11/2018 19:001543601102
5710Barcelona - PoblenouGood2.204541.403918hGood57.030/11/2018 19:001543601102
5711Barcelona - Observ FabraGood2.123941.418318hGood18.030/11/2018 19:001543601102
\n", + "

3352 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " station air_quality longitude latitude no2_hour \\\n", + "48 Barcelona - Sants -- 2.1331 41.3788 4h \n", + "49 Barcelona - Eixample Good 2.1538 41.3853 5h \n", + "50 Barcelona - Gràcia Good 2.1534 41.3987 5h \n", + "51 Barcelona - Ciutadella Good 2.1874 41.3864 5h \n", + "52 Barcelona - Vall Hebron Good 2.1480 41.4261 5h \n", + "... ... ... ... ... ... \n", + "5707 Barcelona - Ciutadella Good 2.1874 41.3864 18h \n", + "5708 Barcelona - Vall Hebron Good 2.1480 41.4261 18h \n", + "5709 Barcelona - Palau Reial Good 2.1151 41.3875 18h \n", + "5710 Barcelona - Poblenou Good 2.2045 41.4039 18h \n", + "5711 Barcelona - Observ Fabra Good 2.1239 41.4183 18h \n", + "\n", + " no2_quality no2_value date date_time \n", + "48 -- NaN 01/11/2018 6:00 1541048703 \n", + "49 Good 31.0 01/11/2018 6:00 1541048703 \n", + "50 Good 19.0 01/11/2018 6:00 1541048703 \n", + "51 Good 18.0 01/11/2018 6:00 1541048703 \n", + "52 Good 8.0 01/11/2018 6:00 1541048703 \n", + "... ... ... ... ... \n", + "5707 Good 58.0 30/11/2018 19:00 1543601102 \n", + "5708 Good 40.0 30/11/2018 19:00 1543601102 \n", + "5709 Good 53.0 30/11/2018 19:00 1543601102 \n", + "5710 Good 57.0 30/11/2018 19:00 1543601102 \n", + "5711 Good 18.0 30/11/2018 19:00 1543601102 \n", + "\n", + "[3352 rows x 9 columns]" + ] + }, + "execution_count": 114, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_day = df_no2[df_no2['date'].str.contains(r'\\b[6-9]:\\d*|\\b1\\d:\\d*')]\n", + "df_day" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "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", + " \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", + " \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", + " \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", + "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
8Barcelona - SantsGood2.133141.37880hGood62.001/11/2018 1:001541030725
9Barcelona - EixampleGood2.153841.38530hGood80.001/11/2018 1:001541030725
10Barcelona - GràciaGood2.153441.39870hGood59.001/11/2018 1:001541030725
11Barcelona - CiutadellaGood2.187441.38640hGood78.001/11/2018 1:001541030725
12Barcelona - Vall HebronGood2.148041.42610hGood45.001/11/2018 1:001541030725
..............................
5739Barcelona - CiutadellaGood2.187441.386422hGood57.030/11/2018 23:001543615502
5740Barcelona - Vall HebronGood2.148041.426122hGood31.030/11/2018 23:001543615502
5741Barcelona - Palau ReialGood2.115141.387522hGood20.030/11/2018 23:001543615502
5742Barcelona - PoblenouGood2.204541.403922hGood70.030/11/2018 23:001543615502
5743Barcelona - Observ FabraGood2.123941.418322hGood21.030/11/2018 23:001543615502
\n", + "

2160 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " station air_quality longitude latitude no2_hour \\\n", + "8 Barcelona - Sants Good 2.1331 41.3788 0h \n", + "9 Barcelona - Eixample Good 2.1538 41.3853 0h \n", + "10 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", + "11 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", + "12 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", + "... ... ... ... ... ... \n", + "5739 Barcelona - Ciutadella Good 2.1874 41.3864 22h \n", + "5740 Barcelona - Vall Hebron Good 2.1480 41.4261 22h \n", + "5741 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", + "5742 Barcelona - Poblenou Good 2.2045 41.4039 22h \n", + "5743 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", + "\n", + " no2_quality no2_value date date_time \n", + "8 Good 62.0 01/11/2018 1:00 1541030725 \n", + "9 Good 80.0 01/11/2018 1:00 1541030725 \n", + "10 Good 59.0 01/11/2018 1:00 1541030725 \n", + "11 Good 78.0 01/11/2018 1:00 1541030725 \n", + "12 Good 45.0 01/11/2018 1:00 1541030725 \n", + "... ... ... ... ... \n", + "5739 Good 57.0 30/11/2018 23:00 1543615502 \n", + "5740 Good 31.0 30/11/2018 23:00 1543615502 \n", + "5741 Good 20.0 30/11/2018 23:00 1543615502 \n", + "5742 Good 70.0 30/11/2018 23:00 1543615502 \n", + "5743 Good 21.0 30/11/2018 23:00 1543615502 \n", + "\n", + "[2160 rows x 9 columns]" + ] + }, + "execution_count": 116, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_night = df_no2[df_no2['date'].str.contains(r'\\b2\\d:\\d+|\\b[1-5]:\\d+')]\n", + "df_night" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "date\n", + "02/11/2018 12:00 16\n", + "15/11/2018 12:00 16\n", + "15/11/2018 14:00 16\n", + "15/11/2018 18:00 16\n", + "30/11/2018 9:00 8\n", + " ..\n", + "20/11/2018 9:00 8\n", + "20/11/2018 8:00 8\n", + "20/11/2018 7:00 8\n", + "20/11/2018 6:00 8\n", + "01/11/2018 0:00 8\n", + "Length: 714, dtype: int64" + ] + }, + "execution_count": 118, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no2.value_counts('date')" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "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", + " \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", + "
minmaxmeanmedian
station
Barcelona - Ciutadella6.086.037.73849937.0
Barcelona - Eixample17.0112.054.38069752.0
Barcelona - Gràcia6.0117.042.31151839.5
Barcelona - Observ Fabra1.071.011.0145289.0
Barcelona - Palau Reial1.099.025.98543720.0
Barcelona - Poblenou6.089.037.61576438.0
Barcelona - Sants7.079.032.12030128.0
Barcelona - Vall Hebron6.088.028.06220124.0
\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "station \n", + "Barcelona - Ciutadella 6.0 86.0 37.738499 37.0\n", + "Barcelona - Eixample 17.0 112.0 54.380697 52.0\n", + "Barcelona - Gràcia 6.0 117.0 42.311518 39.5\n", + "Barcelona - Observ Fabra 1.0 71.0 11.014528 9.0\n", + "Barcelona - Palau Reial 1.0 99.0 25.985437 20.0\n", + "Barcelona - Poblenou 6.0 89.0 37.615764 38.0\n", + "Barcelona - Sants 7.0 79.0 32.120301 28.0\n", + "Barcelona - Vall Hebron 6.0 88.0 28.062201 24.0" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_day.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "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", + " \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", + " \n", + "
minmaxmeanmedian
station
Barcelona - Ciutadella5.088.042.42857144.0
Barcelona - Eixample17.0104.058.58367358.0
Barcelona - Gràcia8.0103.047.32916745.5
Barcelona - Observ Fabra1.062.012.3333339.5
Barcelona - Palau Reial2.080.030.38461525.0
Barcelona - Poblenou6.0105.045.85098044.0
Barcelona - Sants8.089.041.99591840.0
Barcelona - Vall Hebron6.091.034.15530330.0
\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "station \n", + "Barcelona - Ciutadella 5.0 88.0 42.428571 44.0\n", + "Barcelona - Eixample 17.0 104.0 58.583673 58.0\n", + "Barcelona - Gràcia 8.0 103.0 47.329167 45.5\n", + "Barcelona - Observ Fabra 1.0 62.0 12.333333 9.5\n", + "Barcelona - Palau Reial 2.0 80.0 30.384615 25.0\n", + "Barcelona - Poblenou 6.0 105.0 45.850980 44.0\n", + "Barcelona - Sants 8.0 89.0 41.995918 40.0\n", + "Barcelona - Vall Hebron 6.0 91.0 34.155303 30.0" + ] + }, + "execution_count": 120, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_night.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "station Barcelona - Gràcia\n", + "air_quality Moderate\n", + "longitude 2.1534\n", + "latitude 41.3987\n", + "no2_hour 10h\n", + "no2_quality Moderate\n", + "no2_value 117\n", + "date 22/11/2018 11:00\n", + "date_time 1542881102\n", + "Name: 4106, dtype: object" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no2.loc[df_no2['no2_value'].idxmax()]" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "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", + " \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", + " \n", + " \n", + " \n", + "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
4106Barcelona - GràciaModerate2.153441.398710hModerate117.022/11/2018 11:001542881102
5442Barcelona - GràciaModerate2.153441.39879hModerate116.029/11/2018 10:001543482302
4098Barcelona - GràciaModerate2.153441.39879hModerate115.022/11/2018 10:001542877501
1Barcelona - EixampleModerate2.153841.38530hModerate113.001/11/2018 0:001541027104
1225Barcelona - EixampleModerate2.153841.38539hModerate112.007/11/2018 10:001541581503
\n", + "
" + ], + "text/plain": [ + " station air_quality longitude latitude no2_hour \\\n", + "4106 Barcelona - Gràcia Moderate 2.1534 41.3987 10h \n", + "5442 Barcelona - Gràcia Moderate 2.1534 41.3987 9h \n", + "4098 Barcelona - Gràcia Moderate 2.1534 41.3987 9h \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", + "1225 Barcelona - Eixample Moderate 2.1538 41.3853 9h \n", + "\n", + " no2_quality no2_value date date_time \n", + "4106 Moderate 117.0 22/11/2018 11:00 1542881102 \n", + "5442 Moderate 116.0 29/11/2018 10:00 1543482302 \n", + "4098 Moderate 115.0 22/11/2018 10:00 1542877501 \n", + "1 Moderate 113.0 01/11/2018 0:00 1541027104 \n", + "1225 Moderate 112.0 07/11/2018 10:00 1541581503 " + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no2.nlargest(columns='no2_value', n = 5)" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "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", + " \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", + " \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", + " \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", + "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
4106Barcelona - GràciaModerate2.153441.398710hModerate117.022/11/2018 11:001542881102
5442Barcelona - GràciaModerate2.153441.39879hModerate116.029/11/2018 10:001543482302
4098Barcelona - GràciaModerate2.153441.39879hModerate115.022/11/2018 10:001542877501
1Barcelona - EixampleModerate2.153841.38530hModerate113.001/11/2018 0:001541027104
1225Barcelona - EixampleModerate2.153841.38539hModerate112.007/11/2018 10:001541581503
..............................
5503Barcelona - Observ FabraGood2.123941.418314h--NaN29/11/2018 17:001543507502
5511Barcelona - Observ FabraGood2.123941.418315h--NaN29/11/2018 18:001543511102
5553Barcelona - EixampleModerate2.153841.3853NaNNaNNaN30/11/2018 0:001543532702
5729Barcelona - EixampleModerate2.153841.385319h--NaN30/11/2018 22:001543611902
5737Barcelona - EixampleModerate2.153841.385320h--NaN30/11/2018 23:001543615502
\n", + "

5744 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " station air_quality longitude latitude no2_hour \\\n", + "4106 Barcelona - Gràcia Moderate 2.1534 41.3987 10h \n", + "5442 Barcelona - Gràcia Moderate 2.1534 41.3987 9h \n", + "4098 Barcelona - Gràcia Moderate 2.1534 41.3987 9h \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", + "1225 Barcelona - Eixample Moderate 2.1538 41.3853 9h \n", + "... ... ... ... ... ... \n", + "5503 Barcelona - Observ Fabra Good 2.1239 41.4183 14h \n", + "5511 Barcelona - Observ Fabra Good 2.1239 41.4183 15h \n", + "5553 Barcelona - Eixample Moderate 2.1538 41.3853 NaN \n", + "5729 Barcelona - Eixample Moderate 2.1538 41.3853 19h \n", + "5737 Barcelona - Eixample Moderate 2.1538 41.3853 20h \n", + "\n", + " no2_quality no2_value date date_time \n", + "4106 Moderate 117.0 22/11/2018 11:00 1542881102 \n", + "5442 Moderate 116.0 29/11/2018 10:00 1543482302 \n", + "4098 Moderate 115.0 22/11/2018 10:00 1542877501 \n", + "1 Moderate 113.0 01/11/2018 0:00 1541027104 \n", + "1225 Moderate 112.0 07/11/2018 10:00 1541581503 \n", + "... ... ... ... ... \n", + "5503 -- NaN 29/11/2018 17:00 1543507502 \n", + "5511 -- NaN 29/11/2018 18:00 1543511102 \n", + "5553 NaN NaN 30/11/2018 0:00 1543532702 \n", + "5729 -- NaN 30/11/2018 22:00 1543611902 \n", + "5737 -- NaN 30/11/2018 23:00 1543615502 \n", + "\n", + "[5744 rows x 9 columns]" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_no2.sort_values('no2_value', ascending=False)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -197,7 +3150,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.2" + "version": "3.8.5" }, "latex_envs": { "LaTeX_envs_menu_present": true, From 8edeec1b57c5c25238b3b16670d9aef58bf0b321 Mon Sep 17 00:00:00 2001 From: lisasaundersgit Date: Thu, 1 Apr 2021 14:25:41 +0200 Subject: [PATCH 05/18] code update 2 --- your-project/AirQuality-Lisa.ipynb | 735 +++++------------------------ 1 file changed, 122 insertions(+), 613 deletions(-) diff --git a/your-project/AirQuality-Lisa.ipynb b/your-project/AirQuality-Lisa.ipynb index 4b5bfeb..c23677f 100644 --- a/your-project/AirQuality-Lisa.ipynb +++ b/your-project/AirQuality-Lisa.ipynb @@ -736,7 +736,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 89, "metadata": {}, "outputs": [ { @@ -759,229 +759,168 @@ "\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", - " \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", - " \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", - " \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", " \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", " \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", "
minmaxmeanmedian
no2_hour
0h2.0113.042.85489042.0
10h1.0117.043.71966545.0
11h1.0109.038.46666735.0
12h2.080.030.61233526.0
13h1.083.027.26141122.0
14h2.071.028.05339823.5
15h2.088.028.34272323.0
16h3.084.028.91071424.5
17h3.080.032.72811129.0
18h6.089.042.25321940.0
19h6.0101.049.32000049.0
1h2.096.035.71428635.0...22h23h2h3h4h5h6h7h8h9h
20h4.0105.050.50450552.0min2.000001.0000001.0000002.0000001.0000002.0000002.0000003.0000003.0000006.000000...3.0000003.0000002.0000001.0000001.0000001.0000001.0000001.0000001.0000001.000000
21h4.097.048.50672650.0max113.00000117.000000109.00000080.00000083.00000071.00000088.00000084.00000080.00000089.000000...97.00000088.00000086.00000077.00000065.00000067.00000064.00000080.000000103.000000116.000000
22h3.097.0mean42.8548943.71966538.46666730.61233527.26141128.05339828.34272328.91071432.72811142.253219...44.53296745.5
23h3.088.039.03973538.0
2h2.086.030.23580826.0
3h1.077.026.77292623.0
4h1.065.024.64444421.0
5h1.067.023.29870119.0
6h1.064.024.31489421.0
7h1.080.030.37229427.0
8h1.0103.040.00423742.046.268908
9h1.0116.046.26890849.0median42.0000045.00000035.00000026.00000022.00000023.50000023.00000024.50000029.00000040.000000...45.50000038.00000026.00000023.00000021.00000019.00000021.00000027.00000042.00000049.000000
\n", + "

4 rows × 24 columns

\n", "" ], "text/plain": [ - " min max mean median\n", - "no2_hour \n", - "0h 2.0 113.0 42.854890 42.0\n", - "10h 1.0 117.0 43.719665 45.0\n", - "11h 1.0 109.0 38.466667 35.0\n", - "12h 2.0 80.0 30.612335 26.0\n", - "13h 1.0 83.0 27.261411 22.0\n", - "14h 2.0 71.0 28.053398 23.5\n", - "15h 2.0 88.0 28.342723 23.0\n", - "16h 3.0 84.0 28.910714 24.5\n", - "17h 3.0 80.0 32.728111 29.0\n", - "18h 6.0 89.0 42.253219 40.0\n", - "19h 6.0 101.0 49.320000 49.0\n", - "1h 2.0 96.0 35.714286 35.0\n", - "20h 4.0 105.0 50.504505 52.0\n", - "21h 4.0 97.0 48.506726 50.0\n", - "22h 3.0 97.0 44.532967 45.5\n", - "23h 3.0 88.0 39.039735 38.0\n", - "2h 2.0 86.0 30.235808 26.0\n", - "3h 1.0 77.0 26.772926 23.0\n", - "4h 1.0 65.0 24.644444 21.0\n", - "5h 1.0 67.0 23.298701 19.0\n", - "6h 1.0 64.0 24.314894 21.0\n", - "7h 1.0 80.0 30.372294 27.0\n", - "8h 1.0 103.0 40.004237 42.0\n", - "9h 1.0 116.0 46.268908 49.0" + "no2_hour 0h 10h 11h 12h 13h 14h \\\n", + "min 2.00000 1.000000 1.000000 2.000000 1.000000 2.000000 \n", + "max 113.00000 117.000000 109.000000 80.000000 83.000000 71.000000 \n", + "mean 42.85489 43.719665 38.466667 30.612335 27.261411 28.053398 \n", + "median 42.00000 45.000000 35.000000 26.000000 22.000000 23.500000 \n", + "\n", + "no2_hour 15h 16h 17h 18h ... 22h \\\n", + "min 2.000000 3.000000 3.000000 6.000000 ... 3.000000 \n", + "max 88.000000 84.000000 80.000000 89.000000 ... 97.000000 \n", + "mean 28.342723 28.910714 32.728111 42.253219 ... 44.532967 \n", + "median 23.000000 24.500000 29.000000 40.000000 ... 45.500000 \n", + "\n", + "no2_hour 23h 2h 3h 4h 5h 6h \\\n", + "min 3.000000 2.000000 1.000000 1.000000 1.000000 1.000000 \n", + "max 88.000000 86.000000 77.000000 65.000000 67.000000 64.000000 \n", + "mean 39.039735 30.235808 26.772926 24.644444 23.298701 24.314894 \n", + "median 38.000000 26.000000 23.000000 21.000000 19.000000 21.000000 \n", + "\n", + "no2_hour 7h 8h 9h \n", + "min 1.000000 1.000000 1.000000 \n", + "max 80.000000 103.000000 116.000000 \n", + "mean 30.372294 40.004237 46.268908 \n", + "median 27.000000 42.000000 49.000000 \n", + "\n", + "[4 rows x 24 columns]" ] }, - "execution_count": 11, + "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_no2.groupby('no2_hour').no2_value.agg(['min', 'max', 'mean', 'median'])" + "hourly = df_no2.groupby('no2_hour').no2_value.agg(['min', 'max', 'mean', 'median'])\n", + "hourly.T" ] }, { @@ -1372,436 +1311,6 @@ "df_no2.groupby(['station', 'no2_hour']).no2_value.agg(['min', 'max', 'mean', 'median'])" ] }, - { - "cell_type": "code", - "execution_count": 17, - "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", - " \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", - " \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", - " \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", - "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
0Barcelona - SantsGood2.133141.37880hGood84.001/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hModerate113.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood73.001/11/2018 0:001541027104
3Barcelona - CiutadellaGood2.187441.38640hGood86.001/11/2018 0:001541027104
4Barcelona - Vall HebronGood2.148041.42610hGood69.001/11/2018 0:001541027104
..............................
5739Barcelona - CiutadellaGood2.187441.386422hGood57.030/11/2018 23:001543615502
5740Barcelona - Vall HebronGood2.148041.426122hGood31.030/11/2018 23:001543615502
5741Barcelona - Palau ReialGood2.115141.387522hGood20.030/11/2018 23:001543615502
5742Barcelona - PoblenouGood2.204541.403922hGood70.030/11/2018 23:001543615502
5743Barcelona - Observ FabraGood2.123941.418322hGood21.030/11/2018 23:001543615502
\n", - "

5720 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " station air_quality longitude latitude no2_hour \\\n", - "0 Barcelona - Sants Good 2.1331 41.3788 0h \n", - "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", - "2 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", - "3 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", - "4 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", - "... ... ... ... ... ... \n", - "5739 Barcelona - Ciutadella Good 2.1874 41.3864 22h \n", - "5740 Barcelona - Vall Hebron Good 2.1480 41.4261 22h \n", - "5741 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", - "5742 Barcelona - Poblenou Good 2.2045 41.4039 22h \n", - "5743 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", - "\n", - " no2_quality no2_value date date_time \n", - "0 Good 84.0 01/11/2018 0:00 1541027104 \n", - "1 Moderate 113.0 01/11/2018 0:00 1541027104 \n", - "2 Good 73.0 01/11/2018 0:00 1541027104 \n", - "3 Good 86.0 01/11/2018 0:00 1541027104 \n", - "4 Good 69.0 01/11/2018 0:00 1541027104 \n", - "... ... ... ... ... \n", - "5739 Good 57.0 30/11/2018 23:00 1543615502 \n", - "5740 Good 31.0 30/11/2018 23:00 1543615502 \n", - "5741 Good 20.0 30/11/2018 23:00 1543615502 \n", - "5742 Good 70.0 30/11/2018 23:00 1543615502 \n", - "5743 Good 21.0 30/11/2018 23:00 1543615502 \n", - "\n", - "[5720 rows x 9 columns]" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_nov = df_no2[df_no2['date'].str.contains('\\d{2}/11/2018')].groupby(['date'])\n", - "df_nov.head(10)" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "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", - " \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", - " \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", - " \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", - "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
576Barcelona - SantsGood2.133141.37880hGood31.004/11/2018 0:001541286304
577Barcelona - EixampleGood2.153841.38530hGood41.004/11/2018 0:001541286304
578Barcelona - GràciaGood2.153441.39870hGood58.004/11/2018 0:001541286304
579Barcelona - CiutadellaGood2.187441.38640hGood48.004/11/2018 0:001541286304
580Barcelona - Vall HebronGood2.148041.42610hGood26.004/11/2018 0:001541286304
..............................
4779Barcelona - CiutadellaGood2.187441.386422hGood51.025/11/2018 23:001543183501
4780Barcelona - Vall HebronGood2.148041.426122hGood46.025/11/2018 23:001543183501
4781Barcelona - Palau ReialGood2.115141.387522hGood41.025/11/2018 23:001543183501
4782Barcelona - PoblenouGood2.204541.403922hGood52.025/11/2018 23:001543183501
4783Barcelona - Observ FabraGood2.123941.418322hGood7.025/11/2018 23:001543183501
\n", - "

760 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " station air_quality longitude latitude no2_hour \\\n", - "576 Barcelona - Sants Good 2.1331 41.3788 0h \n", - "577 Barcelona - Eixample Good 2.1538 41.3853 0h \n", - "578 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", - "579 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", - "580 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", - "... ... ... ... ... ... \n", - "4779 Barcelona - Ciutadella Good 2.1874 41.3864 22h \n", - "4780 Barcelona - Vall Hebron Good 2.1480 41.4261 22h \n", - "4781 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", - "4782 Barcelona - Poblenou Good 2.2045 41.4039 22h \n", - "4783 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", - "\n", - " no2_quality no2_value date date_time \n", - "576 Good 31.0 04/11/2018 0:00 1541286304 \n", - "577 Good 41.0 04/11/2018 0:00 1541286304 \n", - "578 Good 58.0 04/11/2018 0:00 1541286304 \n", - "579 Good 48.0 04/11/2018 0:00 1541286304 \n", - "580 Good 26.0 04/11/2018 0:00 1541286304 \n", - "... ... ... ... ... \n", - "4779 Good 51.0 25/11/2018 23:00 1543183501 \n", - "4780 Good 46.0 25/11/2018 23:00 1543183501 \n", - "4781 Good 41.0 25/11/2018 23:00 1543183501 \n", - "4782 Good 52.0 25/11/2018 23:00 1543183501 \n", - "4783 Good 7.0 25/11/2018 23:00 1543183501 \n", - "\n", - "[760 rows x 9 columns]" - ] - }, - "execution_count": 18, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_mon = df_no2[df_no2['date'].str.contains('04/11/2018|11/11/2018|18/11/2018|25/11/2018')].groupby(['date'])\n", - "df_mon.head(10) #make dates more neat" - ] - }, { "cell_type": "code", "execution_count": 105, From 0c5e2e7237f74a1b1ea549c59d5d7d38e7f42e9d Mon Sep 17 00:00:00 2001 From: lisasaundersgit Date: Thu, 1 Apr 2021 14:36:21 +0200 Subject: [PATCH 06/18] lab update 3 --- your-project/AirQuality-Lisa.ipynb | 2828 +++++++--------------------- 1 file changed, 652 insertions(+), 2176 deletions(-) diff --git a/your-project/AirQuality-Lisa.ipynb b/your-project/AirQuality-Lisa.ipynb index c23677f..c7ed93f 100644 --- a/your-project/AirQuality-Lisa.ipynb +++ b/your-project/AirQuality-Lisa.ipynb @@ -1,14 +1,16 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# NO2 Pollution Barcelona" + ] + }, { "cell_type": "code", - "execution_count": 2, - "metadata": { - "ExecuteTime": { - "end_time": "2021-03-30T15:53:34.467216Z", - "start_time": "2021-03-30T15:53:34.316194Z" - } - }, + "execution_count": 4, + "metadata": {}, "outputs": [ { "data": { @@ -124,7 +126,7 @@ "2 NaN 01/11/2018 0:00 1541027104 " ] }, - "execution_count": 2, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -132,14 +134,39 @@ "source": [ "import pandas as pd\n", "\n", - "data = pd.read_csv('../datasets/2.-Urban-Environment/air-quality-nov-2017.csv')\n", + "df = pd.read_csv('../datasets/2.-Urban-Environment/air-quality-nov-2017.csv')\n", "\n", "data.head(3)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Air Quality info: https://www.airnow.gov/sites/default/files/2018-06/no2.pdf" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "#creating no2 df and renaming columns\n", + "df_no2 = df[['Station', 'Air Quality', 'Longitude', 'Latitude', 'NO2 Hour', 'NO2 Quality', 'NO2 Value', 'Generated', 'Date Time']].copy()\n", + "df_no2.columns = ['station', 'air_quality', 'longitude', 'latitude', 'no2_hour', 'no2_quality', 'no2_value', 'generated', 'date_time']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Min, Max, Mean, Median NO2 Value by station:**" + ] + }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -163,137 +190,122 @@ " \n", " \n", " \n", - " Longitude\n", - " Latitude\n", - " O3 Value\n", - " NO2 Value\n", - " PM10 Value\n", - " Date Time\n", + " min\n", + " max\n", + " mean\n", + " median\n", + " \n", + " \n", + " station\n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " count\n", - " 5744.00000\n", - " 5744.000000\n", - " 4101.000000\n", - " 5460.000000\n", - " 3647.000000\n", - " 5.744000e+03\n", + " Barcelona - Ciutadella\n", + " 5.0\n", + " 88.0\n", + " 39.855920\n", + " 40.0\n", " \n", " \n", - " mean\n", - " 2.15240\n", - " 13877.827714\n", - " 34.082907\n", - " 35.740293\n", - " 16.590074\n", - " 1.542323e+09\n", + " Barcelona - Eixample\n", + " 17.0\n", + " 113.0\n", + " 56.240683\n", + " 54.0\n", " \n", " \n", - " std\n", - " 0.02859\n", - " 74410.803168\n", - " 22.960687\n", - " 22.357262\n", - " 8.065424\n", - " 7.483961e+05\n", + " Barcelona - Gràcia\n", + " 6.0\n", + " 117.0\n", + " 44.574534\n", + " 42.0\n", " \n", " \n", - " min\n", - " 2.11510\n", - " 41.378800\n", - " 1.000000\n", - " 1.000000\n", - " 2.000000\n", - " 1.541027e+09\n", + " Barcelona - Observ Fabra\n", + " 1.0\n", + " 71.0\n", + " 11.449213\n", + " 9.0\n", " \n", " \n", - " 25%\n", - " 2.13080\n", - " 41.386400\n", - " 14.000000\n", - " 17.000000\n", - " 10.000000\n", - " 1.541675e+09\n", + " Barcelona - Palau Reial\n", + " 1.0\n", + " 99.0\n", + " 27.974322\n", + " 22.0\n", " \n", " \n", - " 50%\n", - " 2.15070\n", - " 41.398700\n", - " 34.000000\n", - " 33.000000\n", - " 15.000000\n", - " 1.542325e+09\n", + " Barcelona - Poblenou\n", + " 5.0\n", + " 105.0\n", + " 41.161103\n", + " 41.0\n", " \n", " \n", - " 75%\n", - " 2.16220\n", - " 41.418300\n", - " 52.000000\n", - " 52.000000\n", - " 22.000000\n", - " 1.542971e+09\n", + " Barcelona - Sants\n", + " 7.0\n", + " 89.0\n", + " 36.359165\n", + " 33.0\n", " \n", " \n", - " max\n", - " 2.20450\n", - " 414261.000000\n", - " 100.000000\n", - " 117.000000\n", - " 44.000000\n", - " 1.543616e+09\n", + " Barcelona - Vall Hebron\n", + " 6.0\n", + " 91.0\n", + " 30.812940\n", + " 26.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " Longitude Latitude O3 Value NO2 Value PM10 Value \\\n", - "count 5744.00000 5744.000000 4101.000000 5460.000000 3647.000000 \n", - "mean 2.15240 13877.827714 34.082907 35.740293 16.590074 \n", - "std 0.02859 74410.803168 22.960687 22.357262 8.065424 \n", - "min 2.11510 41.378800 1.000000 1.000000 2.000000 \n", - "25% 2.13080 41.386400 14.000000 17.000000 10.000000 \n", - "50% 2.15070 41.398700 34.000000 33.000000 15.000000 \n", - "75% 2.16220 41.418300 52.000000 52.000000 22.000000 \n", - "max 2.20450 414261.000000 100.000000 117.000000 44.000000 \n", - "\n", - " Date Time \n", - "count 5.744000e+03 \n", - "mean 1.542323e+09 \n", - "std 7.483961e+05 \n", - "min 1.541027e+09 \n", - "25% 1.541675e+09 \n", - "50% 1.542325e+09 \n", - "75% 1.542971e+09 \n", - "max 1.543616e+09 " + " min max mean median\n", + "station \n", + "Barcelona - Ciutadella 5.0 88.0 39.855920 40.0\n", + "Barcelona - Eixample 17.0 113.0 56.240683 54.0\n", + "Barcelona - Gràcia 6.0 117.0 44.574534 42.0\n", + "Barcelona - Observ Fabra 1.0 71.0 11.449213 9.0\n", + "Barcelona - Palau Reial 1.0 99.0 27.974322 22.0\n", + "Barcelona - Poblenou 5.0 105.0 41.161103 41.0\n", + "Barcelona - Sants 7.0 89.0 36.359165 33.0\n", + "Barcelona - Vall Hebron 6.0 91.0 30.812940 26.0" ] }, - "execution_count": 3, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "data.describe()" + "df_no2.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**The overall highest values:**" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 77, "metadata": {}, "outputs": [], "source": [ - "pm.groupby('Station')" + "df_no2_short = df_no2[['station', 'no2_hour', 'no2_quality', 'no2_value']].copy()" ] }, { "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, + "execution_count": 78, + "metadata": {}, "outputs": [ { "data": { @@ -316,121 +328,117 @@ " \n", " \n", " \n", - " Station\n", - " Air Quality\n", - " Longitude\n", - " Latitude\n", - " O3 Hour\n", - " O3 Quality\n", - " O3 Value\n", - " NO2 Hour\n", - " NO2 Quality\n", - " NO2 Value\n", - " PM10 Hour\n", - " PM10 Quality\n", - " PM10 Value\n", - " Generated\n", - " Date Time\n", + " no2_hour\n", + " no2_quality\n", + " no2_value\n", + " \n", + " \n", + " station\n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " 0\n", - " Barcelona - Sants\n", - " Good\n", - " 2.1331\n", - " 41.3788\n", - " NaN\n", - " NaN\n", - " NaN\n", - " 0h\n", - " Good\n", - " 84.0\n", - " NaN\n", - " NaN\n", - " NaN\n", - " 01/11/2018 0:00\n", - " 1541027104\n", + " Barcelona - Gràcia\n", + " 10h\n", + " Moderate\n", + " 117.0\n", " \n", " \n", - " 1\n", - " Barcelona - Eixample\n", + " Barcelona - Gràcia\n", + " 9h\n", " Moderate\n", - " 2.1538\n", - " 41.3853\n", - " 0h\n", - " Good\n", - " 1.0\n", + " 116.0\n", + " \n", + " \n", + " Barcelona - Gràcia\n", + " 9h\n", + " Moderate\n", + " 115.0\n", + " \n", + " \n", + " Barcelona - Eixample\n", " 0h\n", " Moderate\n", " 113.0\n", - " 0h\n", - " Good\n", - " 36.0\n", - " 01/11/2018 0:00\n", - " 1541027104\n", " \n", " \n", - " 2\n", - " Barcelona - Gràcia\n", - " Good\n", - " 2.1534\n", - " 41.3987\n", - " 0h\n", - " Good\n", - " 10.0\n", - " 0h\n", - " Good\n", - " 73.0\n", - " NaN\n", - " NaN\n", - " NaN\n", - " 01/11/2018 0:00\n", - " 1541027104\n", + " Barcelona - Eixample\n", + " 9h\n", + " Moderate\n", + " 112.0\n", + " \n", + " \n", + " Barcelona - Eixample\n", + " 11h\n", + " Moderate\n", + " 109.0\n", + " \n", + " \n", + " Barcelona - Eixample\n", + " 10h\n", + " Moderate\n", + " 108.0\n", + " \n", + " \n", + " Barcelona - Gràcia\n", + " 11h\n", + " Moderate\n", + " 107.0\n", + " \n", + " \n", + " Barcelona - Eixample\n", + " 10h\n", + " Moderate\n", + " 105.0\n", + " \n", + " \n", + " Barcelona - Poblenou\n", + " 20h\n", + " Moderate\n", + " 105.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " Station Air Quality Longitude Latitude O3 Hour O3 Quality \\\n", - "0 Barcelona - Sants Good 2.1331 41.3788 NaN NaN \n", - "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h Good \n", - "2 Barcelona - Gràcia Good 2.1534 41.3987 0h Good \n", - "\n", - " O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour PM10 Quality \\\n", - "0 NaN 0h Good 84.0 NaN NaN \n", - "1 1.0 0h Moderate 113.0 0h Good \n", - "2 10.0 0h Good 73.0 NaN NaN \n", - "\n", - " PM10 Value Generated Date Time \n", - "0 NaN 01/11/2018 0:00 1541027104 \n", - "1 36.0 01/11/2018 0:00 1541027104 \n", - "2 NaN 01/11/2018 0:00 1541027104 " + " no2_hour no2_quality no2_value\n", + "station \n", + "Barcelona - Gràcia 10h Moderate 117.0\n", + "Barcelona - Gràcia 9h Moderate 116.0\n", + "Barcelona - Gràcia 9h Moderate 115.0\n", + "Barcelona - Eixample 0h Moderate 113.0\n", + "Barcelona - Eixample 9h Moderate 112.0\n", + "Barcelona - Eixample 11h Moderate 109.0\n", + "Barcelona - Eixample 10h Moderate 108.0\n", + "Barcelona - Gràcia 11h Moderate 107.0\n", + "Barcelona - Eixample 10h Moderate 105.0\n", + "Barcelona - Poblenou 20h Moderate 105.0" ] }, - "execution_count": 4, + "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df = pd.DataFrame(data)\n", - "df.head(3)" + "df_no2_short.set_index('station', inplace=True)\n", + "df_no2_short.nlargest(columns='no2_value', n = 10)" ] }, { - "cell_type": "code", - "execution_count": 5, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "df_no2 = df[['Station', 'Air Quality', 'Longitude', 'Latitude', 'NO2 Hour', 'NO2 Quality', 'NO2 Value', 'Generated', 'Date Time']].copy()" + "**Hourly NO2 data**" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -454,1698 +462,234 @@ " \n", " \n", " \n", - " Station\n", - " Air Quality\n", - " Longitude\n", - " Latitude\n", - " NO2 Hour\n", - " NO2 Quality\n", - " NO2 Value\n", - " Generated\n", - " Date Time\n", - " \n", - " \n", - " \n", - " \n", - " 5741\n", - " Barcelona - Palau Reial\n", - " Good\n", - " 2.1151\n", - " 41.3875\n", - " 22h\n", - " Good\n", - " 20.0\n", - " 30/11/2018 23:00\n", - " 1543615502\n", - " \n", - " \n", - " 5742\n", - " Barcelona - Poblenou\n", - " Good\n", - " 2.2045\n", - " 41.4039\n", - " 22h\n", - " Good\n", - " 70.0\n", - " 30/11/2018 23:00\n", - " 1543615502\n", - " \n", - " \n", - " 5743\n", - " Barcelona - Observ Fabra\n", - " Good\n", - " 2.1239\n", - " 41.4183\n", - " 22h\n", - " Good\n", - " 21.0\n", - " 30/11/2018 23:00\n", - " 1543615502\n", - " \n", - " \n", - "\n", - "" - ], - "text/plain": [ - " Station Air Quality Longitude Latitude NO2 Hour \\\n", - "5741 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", - "5742 Barcelona - Poblenou Good 2.2045 41.4039 22h \n", - "5743 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", - "\n", - " NO2 Quality NO2 Value Generated Date Time \n", - "5741 Good 20.0 30/11/2018 23:00 1543615502 \n", - "5742 Good 70.0 30/11/2018 23:00 1543615502 \n", - "5743 Good 21.0 30/11/2018 23:00 1543615502 " - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_no2.tail(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "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", - " \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", - "
StationAir QualityLongitudeLatitudeNO2 HourNO2 QualityNO2 ValueGeneratedDate Time
0Barcelona - SantsGood2.133141.37880hGood84.001/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hModerate113.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood73.001/11/2018 0:001541027104
\n", - "
" - ], - "text/plain": [ - " Station Air Quality Longitude Latitude NO2 Hour NO2 Quality \\\n", - "0 Barcelona - Sants Good 2.1331 41.3788 0h Good \n", - "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h Moderate \n", - "2 Barcelona - Gràcia Good 2.1534 41.3987 0h Good \n", - "\n", - " NO2 Value Generated Date Time \n", - "0 84.0 01/11/2018 0:00 1541027104 \n", - "1 113.0 01/11/2018 0:00 1541027104 \n", - "2 73.0 01/11/2018 0:00 1541027104 " - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_no2.head(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [], - "source": [ - "df_no2.columns = ['station', 'air_quality', 'longitude', 'latitude', 'no2_hour', 'no2_quality', 'no2_value', 'date', 'date_time']" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "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", - " \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", - "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
0Barcelona - SantsGood2.133141.37880hGood84.001/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hModerate113.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood73.001/11/2018 0:001541027104
\n", - "
" - ], - "text/plain": [ - " station air_quality longitude latitude no2_hour no2_quality \\\n", - "0 Barcelona - Sants Good 2.1331 41.3788 0h Good \n", - "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h Moderate \n", - "2 Barcelona - Gràcia Good 2.1534 41.3987 0h Good \n", - "\n", - " no2_value date date_time \n", - "0 84.0 01/11/2018 0:00 1541027104 \n", - "1 113.0 01/11/2018 0:00 1541027104 \n", - "2 73.0 01/11/2018 0:00 1541027104 " - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_no2.head(3)" - ] - }, - { - "cell_type": "code", - "execution_count": 89, - "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", - " \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", - " \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", - " \n", - " \n", - "
no2_hour0h10h11h12h13h14h15h16h17h18h...22h23h2h3h4h5h6h7h8h9h
min2.000001.0000001.0000002.0000001.0000002.0000002.0000003.0000003.0000006.000000...3.0000003.0000002.0000001.0000001.0000001.0000001.0000001.0000001.0000001.000000
max113.00000117.000000109.00000080.00000083.00000071.00000088.00000084.00000080.00000089.000000...97.00000088.00000086.00000077.00000065.00000067.00000064.00000080.000000103.000000116.000000
mean42.8548943.71966538.46666730.61233527.26141128.05339828.34272328.91071432.72811142.253219...44.53296739.03973530.23580826.77292624.64444423.29870124.31489430.37229440.00423746.268908
median42.0000045.00000035.00000026.00000022.00000023.50000023.00000024.50000029.00000040.000000...45.50000038.00000026.00000023.00000021.00000019.00000021.00000027.00000042.00000049.000000
\n", - "

4 rows × 24 columns

\n", - "
" - ], - "text/plain": [ - "no2_hour 0h 10h 11h 12h 13h 14h \\\n", - "min 2.00000 1.000000 1.000000 2.000000 1.000000 2.000000 \n", - "max 113.00000 117.000000 109.000000 80.000000 83.000000 71.000000 \n", - "mean 42.85489 43.719665 38.466667 30.612335 27.261411 28.053398 \n", - "median 42.00000 45.000000 35.000000 26.000000 22.000000 23.500000 \n", - "\n", - "no2_hour 15h 16h 17h 18h ... 22h \\\n", - "min 2.000000 3.000000 3.000000 6.000000 ... 3.000000 \n", - "max 88.000000 84.000000 80.000000 89.000000 ... 97.000000 \n", - "mean 28.342723 28.910714 32.728111 42.253219 ... 44.532967 \n", - "median 23.000000 24.500000 29.000000 40.000000 ... 45.500000 \n", - "\n", - "no2_hour 23h 2h 3h 4h 5h 6h \\\n", - "min 3.000000 2.000000 1.000000 1.000000 1.000000 1.000000 \n", - "max 88.000000 86.000000 77.000000 65.000000 67.000000 64.000000 \n", - "mean 39.039735 30.235808 26.772926 24.644444 23.298701 24.314894 \n", - "median 38.000000 26.000000 23.000000 21.000000 19.000000 21.000000 \n", - "\n", - "no2_hour 7h 8h 9h \n", - "min 1.000000 1.000000 1.000000 \n", - "max 80.000000 103.000000 116.000000 \n", - "mean 30.372294 40.004237 46.268908 \n", - "median 27.000000 42.000000 49.000000 \n", - "\n", - "[4 rows x 24 columns]" - ] - }, - "execution_count": 89, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hourly = df_no2.groupby('no2_hour').no2_value.agg(['min', 'max', 'mean', 'median'])\n", - "hourly.T" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [], - "source": [ - "mean_stations = df_no2.groupby('station').mean()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
no2_value_mean
station
Barcelona - Ciutadella39.855920
Barcelona - Eixample56.240683
Barcelona - Gràcia44.574534
Barcelona - Observ Fabra11.449213
Barcelona - Palau Reial27.974322
Barcelona - Poblenou41.161103
Barcelona - Sants36.359165
Barcelona - Vall Hebron30.812940
\n", - "
" - ], - "text/plain": [ - " no2_value_mean\n", - "station \n", - "Barcelona - Ciutadella 39.855920\n", - "Barcelona - Eixample 56.240683\n", - "Barcelona - Gràcia 44.574534\n", - "Barcelona - Observ Fabra 11.449213\n", - "Barcelona - Palau Reial 27.974322\n", - "Barcelona - Poblenou 41.161103\n", - "Barcelona - Sants 36.359165\n", - "Barcelona - Vall Hebron 30.812940" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_mean_stations = mean_stations.drop(columns = ['longitude','latitude', 'date_time'])\n", - "df_mean_stations.columns = ['no2_value_mean']\n", - "df_mean_stations" - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [], - "source": [ - "median_stations = df_no2.groupby('station').median()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "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", - " \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", - " \n", - "
minmaxmeanmedian
station
Barcelona - Ciutadella5.088.039.85592040.0
Barcelona - Eixample17.0113.056.24068354.0
Barcelona - Gràcia6.0117.044.57453442.0
Barcelona - Observ Fabra1.071.011.4492139.0
Barcelona - Palau Reial1.099.027.97432222.0
Barcelona - Poblenou5.0105.041.16110341.0
Barcelona - Sants7.089.036.35916533.0
Barcelona - Vall Hebron6.091.030.81294026.0
\n", - "
" - ], - "text/plain": [ - " min max mean median\n", - "station \n", - "Barcelona - Ciutadella 5.0 88.0 39.855920 40.0\n", - "Barcelona - Eixample 17.0 113.0 56.240683 54.0\n", - "Barcelona - Gràcia 6.0 117.0 44.574534 42.0\n", - "Barcelona - Observ Fabra 1.0 71.0 11.449213 9.0\n", - "Barcelona - Palau Reial 1.0 99.0 27.974322 22.0\n", - "Barcelona - Poblenou 5.0 105.0 41.161103 41.0\n", - "Barcelona - Sants 7.0 89.0 36.359165 33.0\n", - "Barcelona - Vall Hebron 6.0 91.0 30.812940 26.0" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_no2.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "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", - " \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", - " \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", - "
minmaxmeanmedian
stationno2_hour
Barcelona - Ciutadella0h5.086.048.15789548.5
10h21.081.053.10000058.5
11h16.086.045.04878043.0
12h12.070.036.45833333.0
13h11.065.031.15384627.5
..................
Barcelona - Vall Hebron5h6.053.019.70000012.0
6h8.047.022.74193520.0
7h8.080.032.48275927.0
8h8.077.038.30000037.5
9h8.088.038.65517233.0
\n", - "

192 rows × 4 columns

\n", - "
" - ], - "text/plain": [ - " min max mean median\n", - "station no2_hour \n", - "Barcelona - Ciutadella 0h 5.0 86.0 48.157895 48.5\n", - " 10h 21.0 81.0 53.100000 58.5\n", - " 11h 16.0 86.0 45.048780 43.0\n", - " 12h 12.0 70.0 36.458333 33.0\n", - " 13h 11.0 65.0 31.153846 27.5\n", - "... ... ... ... ...\n", - "Barcelona - Vall Hebron 5h 6.0 53.0 19.700000 12.0\n", - " 6h 8.0 47.0 22.741935 20.0\n", - " 7h 8.0 80.0 32.482759 27.0\n", - " 8h 8.0 77.0 38.300000 37.5\n", - " 9h 8.0 88.0 38.655172 33.0\n", - "\n", - "[192 rows x 4 columns]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_no2.groupby(['station', 'no2_hour']).no2_value.agg(['min', 'max', 'mean', 'median'])" - ] - }, - { - "cell_type": "code", - "execution_count": 105, - "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", - " \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", - " \n", - "
minmaxmeanmedian
station
Barcelona - Ciutadella5.072.034.76595735.0
Barcelona - Eixample18.099.044.01149442.0
Barcelona - Gràcia6.083.030.60227326.5
Barcelona - Observ Fabra1.024.07.8526327.0
Barcelona - Palau Reial2.080.016.80851112.5
Barcelona - Poblenou6.086.030.64893626.5
Barcelona - Sants9.083.024.92941222.0
Barcelona - Vall Hebron7.082.017.67021313.5
\n", - "
" - ], - "text/plain": [ - " min max mean median\n", - "station \n", - "Barcelona - Ciutadella 5.0 72.0 34.765957 35.0\n", - "Barcelona - Eixample 18.0 99.0 44.011494 42.0\n", - "Barcelona - Gràcia 6.0 83.0 30.602273 26.5\n", - "Barcelona - Observ Fabra 1.0 24.0 7.852632 7.0\n", - "Barcelona - Palau Reial 2.0 80.0 16.808511 12.5\n", - "Barcelona - Poblenou 6.0 86.0 30.648936 26.5\n", - "Barcelona - Sants 9.0 83.0 24.929412 22.0\n", - "Barcelona - Vall Hebron 7.0 82.0 17.670213 13.5" - ] - }, - "execution_count": 105, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_sun = df_no2[df_no2['date'].str.contains('04/11/2018|11/11/2018|18/11/2018|25/11/2018')]\n", - "df_sun.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" - ] - }, - { - "cell_type": "code", - "execution_count": 107, - "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", - " \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", - " \n", - "
minmaxmeanmedian
station
Barcelona - Ciutadella11.083.047.03260945.5
Barcelona - Eixample32.0112.061.72413860.0
Barcelona - Gràcia16.097.049.35135146.0
Barcelona - Observ Fabra2.024.010.85263210.0
Barcelona - Palau Reial3.078.029.18947423.0
Barcelona - Poblenou12.088.047.35106444.5
Barcelona - Sants9.078.038.27058837.0
Barcelona - Vall Hebron9.080.030.81720428.0
\n", - "
" - ], - "text/plain": [ - " min max mean median\n", - "station \n", - "Barcelona - Ciutadella 11.0 83.0 47.032609 45.5\n", - "Barcelona - Eixample 32.0 112.0 61.724138 60.0\n", - "Barcelona - Gràcia 16.0 97.0 49.351351 46.0\n", - "Barcelona - Observ Fabra 2.0 24.0 10.852632 10.0\n", - "Barcelona - Palau Reial 3.0 78.0 29.189474 23.0\n", - "Barcelona - Poblenou 12.0 88.0 47.351064 44.5\n", - "Barcelona - Sants 9.0 78.0 38.270588 37.0\n", - "Barcelona - Vall Hebron 9.0 80.0 30.817204 28.0" - ] - }, - "execution_count": 107, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_wed = df_no2[df_no2['date'].str.contains('07/11/2018|14/11/2018|21/11/2018|28/11/2018')]\n", - "df_wed.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" - ] - }, - { - "cell_type": "code", - "execution_count": 114, - "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", - " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time
48Barcelona - Sants--2.133141.37884h--NaN01/11/2018 6:001541048703
49Barcelona - EixampleGood2.153841.38535hGood31.001/11/2018 6:001541048703
50Barcelona - GràciaGood2.153441.39875hGood19.001/11/2018 6:001541048703minmaxmeanmedian
51Barcelona - CiutadellaGood2.187441.38645hGood18.001/11/2018 6:001541048703no2_hour
52Barcelona - Vall HebronGood2.148041.42615hGood8.001/11/2018 6:0015410487030h2.0113.042.85489042.0
..............................10h1.0117.043.71966545.0
5707Barcelona - CiutadellaGood2.187441.386418hGood58.030/11/2018 19:00154360110211h1.0109.038.46666735.0
5708Barcelona - Vall HebronGood2.148041.426118hGood40.030/11/2018 19:00154360110212h2.080.030.61233526.0
5709Barcelona - Palau ReialGood2.115141.387518hGood53.030/11/2018 19:00154360110213h1.083.027.26141122.0
5710Barcelona - PoblenouGood2.204541.403918hGood57.030/11/2018 19:00154360110214h2.071.028.05339823.5
5711Barcelona - Observ FabraGood2.123941.418318hGood18.030/11/2018 19:001543601102
\n", - "

3352 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " station air_quality longitude latitude no2_hour \\\n", - "48 Barcelona - Sants -- 2.1331 41.3788 4h \n", - "49 Barcelona - Eixample Good 2.1538 41.3853 5h \n", - "50 Barcelona - Gràcia Good 2.1534 41.3987 5h \n", - "51 Barcelona - Ciutadella Good 2.1874 41.3864 5h \n", - "52 Barcelona - Vall Hebron Good 2.1480 41.4261 5h \n", - "... ... ... ... ... ... \n", - "5707 Barcelona - Ciutadella Good 2.1874 41.3864 18h \n", - "5708 Barcelona - Vall Hebron Good 2.1480 41.4261 18h \n", - "5709 Barcelona - Palau Reial Good 2.1151 41.3875 18h \n", - "5710 Barcelona - Poblenou Good 2.2045 41.4039 18h \n", - "5711 Barcelona - Observ Fabra Good 2.1239 41.4183 18h \n", - "\n", - " no2_quality no2_value date date_time \n", - "48 -- NaN 01/11/2018 6:00 1541048703 \n", - "49 Good 31.0 01/11/2018 6:00 1541048703 \n", - "50 Good 19.0 01/11/2018 6:00 1541048703 \n", - "51 Good 18.0 01/11/2018 6:00 1541048703 \n", - "52 Good 8.0 01/11/2018 6:00 1541048703 \n", - "... ... ... ... ... \n", - "5707 Good 58.0 30/11/2018 19:00 1543601102 \n", - "5708 Good 40.0 30/11/2018 19:00 1543601102 \n", - "5709 Good 53.0 30/11/2018 19:00 1543601102 \n", - "5710 Good 57.0 30/11/2018 19:00 1543601102 \n", - "5711 Good 18.0 30/11/2018 19:00 1543601102 \n", - "\n", - "[3352 rows x 9 columns]" - ] - }, - "execution_count": 114, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_day = df_no2[df_no2['date'].str.contains(r'\\b[6-9]:\\d*|\\b1\\d:\\d*')]\n", - "df_day" - ] - }, - { - "cell_type": "code", - "execution_count": 116, - "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", - " \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", - " \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", " \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", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuedatedate_time15h2.088.028.34272323.0
8Barcelona - SantsGood2.133141.37880hGood62.001/11/2018 1:00154103072516h3.084.028.91071424.5
9Barcelona - EixampleGood2.153841.38530hGood17h3.080.001/11/2018 1:001541030725
10Barcelona - GràciaGood2.153441.39870hGood59.001/11/2018 1:001541030725
11Barcelona - CiutadellaGood2.187441.38640hGood78.001/11/2018 1:001541030725
12Barcelona - Vall HebronGood2.148041.42610hGood45.001/11/2018 1:00154103072532.72811129.0
..............................18h6.089.042.25321940.0
5739Barcelona - CiutadellaGood2.187441.386422hGood57.030/11/2018 23:00154361550219h6.0101.049.32000049.0
5740Barcelona - Vall HebronGood2.148041.426122hGood31.030/11/2018 23:0015436155021h2.096.035.71428635.0
5741Barcelona - Palau ReialGood2.115141.387522hGood20.030/11/2018 23:00154361550220h4.0105.050.50450552.0
5742Barcelona - PoblenouGood2.204541.403922hGood70.030/11/2018 23:00154361550221h4.097.048.50672650.0
5743Barcelona - Observ FabraGood2.123941.418322hGood21.030/11/2018 23:001543615502
\n", - "

2160 rows × 9 columns

\n", - "
" - ], - "text/plain": [ - " station air_quality longitude latitude no2_hour \\\n", - "8 Barcelona - Sants Good 2.1331 41.3788 0h \n", - "9 Barcelona - Eixample Good 2.1538 41.3853 0h \n", - "10 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", - "11 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", - "12 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", - "... ... ... ... ... ... \n", - "5739 Barcelona - Ciutadella Good 2.1874 41.3864 22h \n", - "5740 Barcelona - Vall Hebron Good 2.1480 41.4261 22h \n", - "5741 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", - "5742 Barcelona - Poblenou Good 2.2045 41.4039 22h \n", - "5743 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", - "\n", - " no2_quality no2_value date date_time \n", - "8 Good 62.0 01/11/2018 1:00 1541030725 \n", - "9 Good 80.0 01/11/2018 1:00 1541030725 \n", - "10 Good 59.0 01/11/2018 1:00 1541030725 \n", - "11 Good 78.0 01/11/2018 1:00 1541030725 \n", - "12 Good 45.0 01/11/2018 1:00 1541030725 \n", - "... ... ... ... ... \n", - "5739 Good 57.0 30/11/2018 23:00 1543615502 \n", - "5740 Good 31.0 30/11/2018 23:00 1543615502 \n", - "5741 Good 20.0 30/11/2018 23:00 1543615502 \n", - "5742 Good 70.0 30/11/2018 23:00 1543615502 \n", - "5743 Good 21.0 30/11/2018 23:00 1543615502 \n", - "\n", - "[2160 rows x 9 columns]" - ] - }, - "execution_count": 116, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_night = df_no2[df_no2['date'].str.contains(r'\\b2\\d:\\d+|\\b[1-5]:\\d+')]\n", - "df_night" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "date\n", - "02/11/2018 12:00 16\n", - "15/11/2018 12:00 16\n", - "15/11/2018 14:00 16\n", - "15/11/2018 18:00 16\n", - "30/11/2018 9:00 8\n", - " ..\n", - "20/11/2018 9:00 8\n", - "20/11/2018 8:00 8\n", - "20/11/2018 7:00 8\n", - "20/11/2018 6:00 8\n", - "01/11/2018 0:00 8\n", - "Length: 714, dtype: int64" - ] - }, - "execution_count": 118, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df_no2.value_counts('date')" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "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", " \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", + " \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", "
minmaxmeanmedian22h3.097.044.53296745.5
station23h3.088.039.03973538.0
Barcelona - Ciutadella6.02h2.086.037.73849937.030.23580826.0
Barcelona - Eixample17.0112.054.38069752.03h1.077.026.77292623.0
Barcelona - Gràcia6.0117.042.31151839.54h1.065.024.64444421.0
Barcelona - Observ Fabra5h1.071.011.0145289.067.023.29870119.0
Barcelona - Palau Reial6h1.099.025.98543720.064.024.31489421.0
Barcelona - Poblenou6.089.037.61576438.07h1.080.030.37229427.0
Barcelona - Sants7.079.032.12030128.08h1.0103.040.00423742.0
Barcelona - Vall Hebron6.088.028.06220124.09h1.0116.046.26890849.0
\n", "
" ], "text/plain": [ - " min max mean median\n", - "station \n", - "Barcelona - Ciutadella 6.0 86.0 37.738499 37.0\n", - "Barcelona - Eixample 17.0 112.0 54.380697 52.0\n", - "Barcelona - Gràcia 6.0 117.0 42.311518 39.5\n", - "Barcelona - Observ Fabra 1.0 71.0 11.014528 9.0\n", - "Barcelona - Palau Reial 1.0 99.0 25.985437 20.0\n", - "Barcelona - Poblenou 6.0 89.0 37.615764 38.0\n", - "Barcelona - Sants 7.0 79.0 32.120301 28.0\n", - "Barcelona - Vall Hebron 6.0 88.0 28.062201 24.0" + " min max mean median\n", + "no2_hour \n", + "0h 2.0 113.0 42.854890 42.0\n", + "10h 1.0 117.0 43.719665 45.0\n", + "11h 1.0 109.0 38.466667 35.0\n", + "12h 2.0 80.0 30.612335 26.0\n", + "13h 1.0 83.0 27.261411 22.0\n", + "14h 2.0 71.0 28.053398 23.5\n", + "15h 2.0 88.0 28.342723 23.0\n", + "16h 3.0 84.0 28.910714 24.5\n", + "17h 3.0 80.0 32.728111 29.0\n", + "18h 6.0 89.0 42.253219 40.0\n", + "19h 6.0 101.0 49.320000 49.0\n", + "1h 2.0 96.0 35.714286 35.0\n", + "20h 4.0 105.0 50.504505 52.0\n", + "21h 4.0 97.0 48.506726 50.0\n", + "22h 3.0 97.0 44.532967 45.5\n", + "23h 3.0 88.0 39.039735 38.0\n", + "2h 2.0 86.0 30.235808 26.0\n", + "3h 1.0 77.0 26.772926 23.0\n", + "4h 1.0 65.0 24.644444 21.0\n", + "5h 1.0 67.0 23.298701 19.0\n", + "6h 1.0 64.0 24.314894 21.0\n", + "7h 1.0 80.0 30.372294 27.0\n", + "8h 1.0 103.0 40.004237 42.0\n", + "9h 1.0 116.0 46.268908 49.0" ] }, - "execution_count": 119, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_day.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + "hourly = df_no2.groupby('no2_hour').no2_value.agg(['min', 'max', 'mean', 'median'])\n", + "hourly" ] }, { "cell_type": "code", - "execution_count": 120, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -2168,135 +712,194 @@ "\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", - " \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", - " \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", + " \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", "
minmaxmeanmedian
stationno2_hour0h10h11h12h13h14h15h16h17h18h...22h23h2h3h4h5h6h7h8h9h
Barcelona - Ciutadella5.088.042.42857144.0
Barcelona - Eixample17.0104.058.58367358.0
Barcelona - Gràcia8.0103.047.32916745.5
Barcelona - Observ Fabra1.062.012.3333339.5
Barcelona - Palau Reial2.080.030.38461525.0min2.000001.0000001.0000002.0000001.0000002.0000002.0000003.0000003.0000006.000000...3.0000003.0000002.0000001.0000001.0000001.0000001.0000001.0000001.0000001.000000
Barcelona - Poblenou6.0105.045.85098044.0max113.00000117.000000109.00000080.00000083.00000071.00000088.00000084.00000080.00000089.000000...97.00000088.00000086.00000077.00000065.00000067.00000064.00000080.000000103.000000116.000000
Barcelona - Sants8.089.041.99591840.0mean42.8548943.71966538.46666730.61233527.26141128.05339828.34272328.91071432.72811142.253219...44.53296739.03973530.23580826.77292624.64444423.29870124.31489430.37229440.00423746.268908
Barcelona - Vall Hebron6.091.034.15530330.0median42.0000045.00000035.00000026.00000022.00000023.50000023.00000024.50000029.00000040.000000...45.50000038.00000026.00000023.00000021.00000019.00000021.00000027.00000042.00000049.000000
\n", + "

4 rows × 24 columns

\n", "" ], "text/plain": [ - " min max mean median\n", - "station \n", - "Barcelona - Ciutadella 5.0 88.0 42.428571 44.0\n", - "Barcelona - Eixample 17.0 104.0 58.583673 58.0\n", - "Barcelona - Gràcia 8.0 103.0 47.329167 45.5\n", - "Barcelona - Observ Fabra 1.0 62.0 12.333333 9.5\n", - "Barcelona - Palau Reial 2.0 80.0 30.384615 25.0\n", - "Barcelona - Poblenou 6.0 105.0 45.850980 44.0\n", - "Barcelona - Sants 8.0 89.0 41.995918 40.0\n", - "Barcelona - Vall Hebron 6.0 91.0 34.155303 30.0" + "no2_hour 0h 10h 11h 12h 13h 14h \\\n", + "min 2.00000 1.000000 1.000000 2.000000 1.000000 2.000000 \n", + "max 113.00000 117.000000 109.000000 80.000000 83.000000 71.000000 \n", + "mean 42.85489 43.719665 38.466667 30.612335 27.261411 28.053398 \n", + "median 42.00000 45.000000 35.000000 26.000000 22.000000 23.500000 \n", + "\n", + "no2_hour 15h 16h 17h 18h ... 22h \\\n", + "min 2.000000 3.000000 3.000000 6.000000 ... 3.000000 \n", + "max 88.000000 84.000000 80.000000 89.000000 ... 97.000000 \n", + "mean 28.342723 28.910714 32.728111 42.253219 ... 44.532967 \n", + "median 23.000000 24.500000 29.000000 40.000000 ... 45.500000 \n", + "\n", + "no2_hour 23h 2h 3h 4h 5h 6h \\\n", + "min 3.000000 2.000000 1.000000 1.000000 1.000000 1.000000 \n", + "max 88.000000 86.000000 77.000000 65.000000 67.000000 64.000000 \n", + "mean 39.039735 30.235808 26.772926 24.644444 23.298701 24.314894 \n", + "median 38.000000 26.000000 23.000000 21.000000 19.000000 21.000000 \n", + "\n", + "no2_hour 7h 8h 9h \n", + "min 1.000000 1.000000 1.000000 \n", + "max 80.000000 103.000000 116.000000 \n", + "mean 30.372294 40.004237 46.268908 \n", + "median 27.000000 42.000000 49.000000 \n", + "\n", + "[4 rows x 24 columns]" ] }, - "execution_count": 120, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_night.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + "hourly.T" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Data by Weekday:**" ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 36, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "station Barcelona - Gràcia\n", - "air_quality Moderate\n", - "longitude 2.1534\n", - "latitude 41.3987\n", - "no2_hour 10h\n", - "no2_quality Moderate\n", - "no2_value 117\n", - "date 22/11/2018 11:00\n", - "date_time 1542881102\n", - "Name: 4106, dtype: object" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "df_no2.loc[df_no2['no2_value'].idxmax()]" + "df_mon = df_no2[df_no2['generated'].str.contains('05/11/2018|11/11/2018|18/11/2018|25/11/2018')]\n", + "df_tue = df_no2[df_no2['generated'].str.contains('06/11/2018|12/11/2018|19/11/2018|26/11/2018')]\n", + "df_wed = df_no2[df_no2['generated'].str.contains('07/11/2018|14/11/2018|21/11/2018|28/11/2018')]\n", + "df_thu = df_no2[df_no2['generated'].str.contains('01/11/2018|08/11/2018|15/11/2018|22/11/2018|29/11/2018')]\n", + "df_fr = df_no2[df_no2['generated'].str.contains('02/11/2018|09/11/2018|16/11/2018|23/11/2018|30/11/2018')]\n", + "df_sa = df_no2[df_no2['generated'].str.contains('03/11/2018|10/11/2018|17/11/2018|24/11/2018')]\n", + "df_sun = df_no2[df_no2['generated'].str.contains('04/11/2018|11/11/2018|18/11/2018|25/11/2018')]" ] }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -2320,110 +923,157 @@ " \n", " \n", " \n", + " min\n", + " max\n", + " mean\n", + " median\n", + " \n", + " \n", " station\n", - " air_quality\n", - " longitude\n", - " latitude\n", - " no2_hour\n", - " no2_quality\n", - " no2_value\n", - " date\n", - " date_time\n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " 4106\n", - " Barcelona - Gràcia\n", - " Moderate\n", - " 2.1534\n", - " 41.3987\n", - " 10h\n", - " Moderate\n", - " 117.0\n", - " 22/11/2018 11:00\n", - " 1542881102\n", + " Barcelona - Ciutadella\n", + " 5.0\n", + " 72.0\n", + " 34.765957\n", + " 35.0\n", " \n", " \n", - " 5442\n", - " Barcelona - Gràcia\n", - " Moderate\n", - " 2.1534\n", - " 41.3987\n", - " 9h\n", - " Moderate\n", - " 116.0\n", - " 29/11/2018 10:00\n", - " 1543482302\n", + " Barcelona - Eixample\n", + " 18.0\n", + " 99.0\n", + " 44.011494\n", + " 42.0\n", " \n", " \n", - " 4098\n", - " Barcelona - Gràcia\n", - " Moderate\n", - " 2.1534\n", - " 41.3987\n", - " 9h\n", - " Moderate\n", - " 115.0\n", - " 22/11/2018 10:00\n", - " 1542877501\n", + " Barcelona - Gràcia\n", + " 6.0\n", + " 83.0\n", + " 30.602273\n", + " 26.5\n", " \n", " \n", - " 1\n", - " Barcelona - Eixample\n", - " Moderate\n", - " 2.1538\n", - " 41.3853\n", - " 0h\n", - " Moderate\n", - " 113.0\n", - " 01/11/2018 0:00\n", - " 1541027104\n", + " Barcelona - Observ Fabra\n", + " 1.0\n", + " 24.0\n", + " 7.852632\n", + " 7.0\n", " \n", " \n", - " 1225\n", - " Barcelona - Eixample\n", - " Moderate\n", - " 2.1538\n", - " 41.3853\n", - " 9h\n", - " Moderate\n", - " 112.0\n", - " 07/11/2018 10:00\n", - " 1541581503\n", + " Barcelona - Palau Reial\n", + " 2.0\n", + " 80.0\n", + " 16.808511\n", + " 12.5\n", + " \n", + " \n", + " Barcelona - Poblenou\n", + " 6.0\n", + " 86.0\n", + " 30.648936\n", + " 26.5\n", + " \n", + " \n", + " Barcelona - Sants\n", + " 9.0\n", + " 83.0\n", + " 24.929412\n", + " 22.0\n", + " \n", + " \n", + " Barcelona - Vall Hebron\n", + " 7.0\n", + " 82.0\n", + " 17.670213\n", + " 13.5\n", " \n", " \n", "\n", "" ], "text/plain": [ - " station air_quality longitude latitude no2_hour \\\n", - "4106 Barcelona - Gràcia Moderate 2.1534 41.3987 10h \n", - "5442 Barcelona - Gràcia Moderate 2.1534 41.3987 9h \n", - "4098 Barcelona - Gràcia Moderate 2.1534 41.3987 9h \n", - "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", - "1225 Barcelona - Eixample Moderate 2.1538 41.3853 9h \n", - "\n", - " no2_quality no2_value date date_time \n", - "4106 Moderate 117.0 22/11/2018 11:00 1542881102 \n", - "5442 Moderate 116.0 29/11/2018 10:00 1543482302 \n", - "4098 Moderate 115.0 22/11/2018 10:00 1542877501 \n", - "1 Moderate 113.0 01/11/2018 0:00 1541027104 \n", - "1225 Moderate 112.0 07/11/2018 10:00 1541581503 " + " min max mean median\n", + "station \n", + "Barcelona - Ciutadella 5.0 72.0 34.765957 35.0\n", + "Barcelona - Eixample 18.0 99.0 44.011494 42.0\n", + "Barcelona - Gràcia 6.0 83.0 30.602273 26.5\n", + "Barcelona - Observ Fabra 1.0 24.0 7.852632 7.0\n", + "Barcelona - Palau Reial 2.0 80.0 16.808511 12.5\n", + "Barcelona - Poblenou 6.0 86.0 30.648936 26.5\n", + "Barcelona - Sants 9.0 83.0 24.929412 22.0\n", + "Barcelona - Vall Hebron 7.0 82.0 17.670213 13.5" ] }, - "execution_count": 79, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_no2.nlargest(columns='no2_value', n = 5)" + "df_sun.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "#df_week = pd.concat([df_mon, df_tue, df_wed, df_thu, df_fr, df_sa, df_sun], axis=0).reset_index(drop=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "#df_week.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "mon_mean = df_mon['no2_value'].mean()\n", + "tue_mean = df_tue['no2_value'].mean()\n", + "wed_mean = df_wed['no2_value'].mean()\n", + "thu_mean = df_thu['no2_value'].mean()\n", + "fr_mean = df_fr['no2_value'].mean()\n", + "sa_mean = df_sa['no2_value'].mean()\n", + "sun_mean = df_sun['no2_value'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "weekdays_list = [['Monday', mon_mean], ['Tuesday', tue_mean], ['Wednesday', wed_mean], ['Thursday', thu_mean], ['Friday', fr_mean], ['Saturday', sa_mean], ['Sunday', sun_mean]] \n", + "weekdays = pd.DataFrame(weekdays_list, columns = ['Weekday', 'Mean'])" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [], + "source": [ + "weekdays.set_index('Weekday', inplace=True)" ] }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 62, "metadata": {}, "outputs": [ { @@ -2447,192 +1097,65 @@ " \n", " \n", " \n", - " station\n", - " air_quality\n", - " longitude\n", - " latitude\n", - " no2_hour\n", - " no2_quality\n", - " no2_value\n", - " date\n", - " date_time\n", - " \n", - " \n", - " \n", - " \n", - " 4106\n", - " Barcelona - Gràcia\n", - " Moderate\n", - " 2.1534\n", - " 41.3987\n", - " 10h\n", - " Moderate\n", - " 117.0\n", - " 22/11/2018 11:00\n", - " 1542881102\n", - " \n", - " \n", - " 5442\n", - " Barcelona - Gràcia\n", - " Moderate\n", - " 2.1534\n", - " 41.3987\n", - " 9h\n", - " Moderate\n", - " 116.0\n", - " 29/11/2018 10:00\n", - " 1543482302\n", - " \n", - " \n", - " 4098\n", - " Barcelona - Gràcia\n", - " Moderate\n", - " 2.1534\n", - " 41.3987\n", - " 9h\n", - " Moderate\n", - " 115.0\n", - " 22/11/2018 10:00\n", - " 1542877501\n", + " Mean\n", " \n", " \n", - " 1\n", - " Barcelona - Eixample\n", - " Moderate\n", - " 2.1538\n", - " 41.3853\n", - " 0h\n", - " Moderate\n", - " 113.0\n", - " 01/11/2018 0:00\n", - " 1541027104\n", + " Weekday\n", + " \n", " \n", + " \n", + " \n", " \n", - " 1225\n", - " Barcelona - Eixample\n", - " Moderate\n", - " 2.1538\n", - " 41.3853\n", - " 9h\n", - " Moderate\n", - " 112.0\n", - " 07/11/2018 10:00\n", - " 1541581503\n", + " Monday\n", + " 29.031335\n", " \n", " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", + " Tuesday\n", + " 31.291951\n", " \n", " \n", - " 5503\n", - " Barcelona - Observ Fabra\n", - " Good\n", - " 2.1239\n", - " 41.4183\n", - " 14h\n", - " --\n", - " NaN\n", - " 29/11/2018 17:00\n", - " 1543507502\n", + " Wednesday\n", + " 38.773427\n", " \n", " \n", - " 5511\n", - " Barcelona - Observ Fabra\n", - " Good\n", - " 2.1239\n", - " 41.4183\n", - " 15h\n", - " --\n", - " NaN\n", - " 29/11/2018 18:00\n", - " 1543511102\n", + " Thursday\n", + " 45.619699\n", " \n", " \n", - " 5553\n", - " Barcelona - Eixample\n", - " Moderate\n", - " 2.1538\n", - " 41.3853\n", - " NaN\n", - " NaN\n", - " NaN\n", - " 30/11/2018 0:00\n", - " 1543532702\n", + " Friday\n", + " 44.128767\n", " \n", " \n", - " 5729\n", - " Barcelona - Eixample\n", - " Moderate\n", - " 2.1538\n", - " 41.3853\n", - " 19h\n", - " --\n", - " NaN\n", - " 30/11/2018 22:00\n", - " 1543611902\n", + " Saturday\n", + " 29.661664\n", " \n", " \n", - " 5737\n", - " Barcelona - Eixample\n", - " Moderate\n", - " 2.1538\n", - " 41.3853\n", - " 20h\n", - " --\n", - " NaN\n", - " 30/11/2018 23:00\n", - " 1543615502\n", + " Sunday\n", + " 25.686731\n", " \n", " \n", "\n", - "

5744 rows × 9 columns

\n", "" ], "text/plain": [ - " station air_quality longitude latitude no2_hour \\\n", - "4106 Barcelona - Gràcia Moderate 2.1534 41.3987 10h \n", - "5442 Barcelona - Gràcia Moderate 2.1534 41.3987 9h \n", - "4098 Barcelona - Gràcia Moderate 2.1534 41.3987 9h \n", - "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", - "1225 Barcelona - Eixample Moderate 2.1538 41.3853 9h \n", - "... ... ... ... ... ... \n", - "5503 Barcelona - Observ Fabra Good 2.1239 41.4183 14h \n", - "5511 Barcelona - Observ Fabra Good 2.1239 41.4183 15h \n", - "5553 Barcelona - Eixample Moderate 2.1538 41.3853 NaN \n", - "5729 Barcelona - Eixample Moderate 2.1538 41.3853 19h \n", - "5737 Barcelona - Eixample Moderate 2.1538 41.3853 20h \n", - "\n", - " no2_quality no2_value date date_time \n", - "4106 Moderate 117.0 22/11/2018 11:00 1542881102 \n", - "5442 Moderate 116.0 29/11/2018 10:00 1543482302 \n", - "4098 Moderate 115.0 22/11/2018 10:00 1542877501 \n", - "1 Moderate 113.0 01/11/2018 0:00 1541027104 \n", - "1225 Moderate 112.0 07/11/2018 10:00 1541581503 \n", - "... ... ... ... ... \n", - "5503 -- NaN 29/11/2018 17:00 1543507502 \n", - "5511 -- NaN 29/11/2018 18:00 1543511102 \n", - "5553 NaN NaN 30/11/2018 0:00 1543532702 \n", - "5729 -- NaN 30/11/2018 22:00 1543611902 \n", - "5737 -- NaN 30/11/2018 23:00 1543615502 \n", - "\n", - "[5744 rows x 9 columns]" + " Mean\n", + "Weekday \n", + "Monday 29.031335\n", + "Tuesday 31.291951\n", + "Wednesday 38.773427\n", + "Thursday 45.619699\n", + "Friday 44.128767\n", + "Saturday 29.661664\n", + "Sunday 25.686731" ] }, - "execution_count": 88, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_no2.sort_values('no2_value', ascending=False)" + "weekdays" ] }, { @@ -2660,55 +1183,8 @@ "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" - }, - "latex_envs": { - "LaTeX_envs_menu_present": true, - "autoclose": false, - "autocomplete": true, - "bibliofile": "biblio.bib", - "cite_by": "apalike", - "current_citInitial": 1, - "eqLabelWithNumbers": true, - "eqNumInitial": 1, - "hotkeys": { - "equation": "Ctrl-E", - "itemize": "Ctrl-I" - }, - "labels_anchors": false, - "latex_user_defs": false, - "report_style_numbering": false, - "user_envs_cfg": false - }, - "varInspector": { - "cols": { - "lenName": 16, - "lenType": 16, - "lenVar": 40 - }, - "kernels_config": { - "python": { - "delete_cmd_postfix": "", - "delete_cmd_prefix": "del ", - "library": "var_list.py", - "varRefreshCmd": "print(var_dic_list())" - }, - "r": { - "delete_cmd_postfix": ") ", - "delete_cmd_prefix": "rm(", - "library": "var_list.r", - "varRefreshCmd": "cat(var_dic_list()) " - } - }, - "types_to_exclude": [ - "module", - "function", - "builtin_function_or_method", - "instance", - "_Feature" - ], - "window_display": false } }, "nbformat": 4, - "nbformat_minor": 5 + "nbformat_minor": 4 } From 62850badba75518520958540b13b3d3587c533a8 Mon Sep 17 00:00:00 2001 From: lisasaundersgit Date: Thu, 1 Apr 2021 16:06:11 +0200 Subject: [PATCH 07/18] updated code 3 or 4 :D --- your-project/AirQuality-Lisa.ipynb | 253 +++++++++++++++++++---------- 1 file changed, 171 insertions(+), 82 deletions(-) diff --git a/your-project/AirQuality-Lisa.ipynb b/your-project/AirQuality-Lisa.ipynb index c7ed93f..f6d18cc 100644 --- a/your-project/AirQuality-Lisa.ipynb +++ b/your-project/AirQuality-Lisa.ipynb @@ -166,7 +166,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 87, "metadata": {}, "outputs": [ { @@ -193,14 +193,12 @@ " min\n", " max\n", " mean\n", - " median\n", " \n", " \n", " station\n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -209,81 +207,73 @@ " 5.0\n", " 88.0\n", " 39.855920\n", - " 40.0\n", " \n", " \n", " Barcelona - Eixample\n", " 17.0\n", " 113.0\n", " 56.240683\n", - " 54.0\n", " \n", " \n", " Barcelona - Gràcia\n", " 6.0\n", " 117.0\n", " 44.574534\n", - " 42.0\n", " \n", " \n", " Barcelona - Observ Fabra\n", " 1.0\n", " 71.0\n", " 11.449213\n", - " 9.0\n", " \n", " \n", " Barcelona - Palau Reial\n", " 1.0\n", " 99.0\n", " 27.974322\n", - " 22.0\n", " \n", " \n", " Barcelona - Poblenou\n", " 5.0\n", " 105.0\n", " 41.161103\n", - " 41.0\n", " \n", " \n", " Barcelona - Sants\n", " 7.0\n", " 89.0\n", " 36.359165\n", - " 33.0\n", " \n", " \n", " Barcelona - Vall Hebron\n", " 6.0\n", " 91.0\n", " 30.812940\n", - " 26.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " min max mean median\n", - "station \n", - "Barcelona - Ciutadella 5.0 88.0 39.855920 40.0\n", - "Barcelona - Eixample 17.0 113.0 56.240683 54.0\n", - "Barcelona - Gràcia 6.0 117.0 44.574534 42.0\n", - "Barcelona - Observ Fabra 1.0 71.0 11.449213 9.0\n", - "Barcelona - Palau Reial 1.0 99.0 27.974322 22.0\n", - "Barcelona - Poblenou 5.0 105.0 41.161103 41.0\n", - "Barcelona - Sants 7.0 89.0 36.359165 33.0\n", - "Barcelona - Vall Hebron 6.0 91.0 30.812940 26.0" + " min max mean\n", + "station \n", + "Barcelona - Ciutadella 5.0 88.0 39.855920\n", + "Barcelona - Eixample 17.0 113.0 56.240683\n", + "Barcelona - Gràcia 6.0 117.0 44.574534\n", + "Barcelona - Observ Fabra 1.0 71.0 11.449213\n", + "Barcelona - Palau Reial 1.0 99.0 27.974322\n", + "Barcelona - Poblenou 5.0 105.0 41.161103\n", + "Barcelona - Sants 7.0 89.0 36.359165\n", + "Barcelona - Vall Hebron 6.0 91.0 30.812940" ] }, - "execution_count": 9, + "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_no2.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" + "df_no2.groupby('station').no2_value.agg(['min', 'max', 'mean'])" ] }, { @@ -438,7 +428,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 86, "metadata": {}, "outputs": [ { @@ -465,14 +455,12 @@ " min\n", " max\n", " mean\n", - " median\n", " \n", " \n", " no2_hour\n", " \n", " \n", " \n", - " \n", " \n", " \n", " \n", @@ -481,209 +469,185 @@ " 2.0\n", " 113.0\n", " 42.854890\n", - " 42.0\n", " \n", " \n", " 10h\n", " 1.0\n", " 117.0\n", " 43.719665\n", - " 45.0\n", " \n", " \n", " 11h\n", " 1.0\n", " 109.0\n", " 38.466667\n", - " 35.0\n", " \n", " \n", " 12h\n", " 2.0\n", " 80.0\n", " 30.612335\n", - " 26.0\n", " \n", " \n", " 13h\n", " 1.0\n", " 83.0\n", " 27.261411\n", - " 22.0\n", " \n", " \n", " 14h\n", " 2.0\n", " 71.0\n", " 28.053398\n", - " 23.5\n", " \n", " \n", " 15h\n", " 2.0\n", " 88.0\n", " 28.342723\n", - " 23.0\n", " \n", " \n", " 16h\n", " 3.0\n", " 84.0\n", " 28.910714\n", - " 24.5\n", " \n", " \n", " 17h\n", " 3.0\n", " 80.0\n", " 32.728111\n", - " 29.0\n", " \n", " \n", " 18h\n", " 6.0\n", " 89.0\n", " 42.253219\n", - " 40.0\n", " \n", " \n", " 19h\n", " 6.0\n", " 101.0\n", " 49.320000\n", - " 49.0\n", " \n", " \n", " 1h\n", " 2.0\n", " 96.0\n", " 35.714286\n", - " 35.0\n", " \n", " \n", " 20h\n", " 4.0\n", " 105.0\n", " 50.504505\n", - " 52.0\n", " \n", " \n", " 21h\n", " 4.0\n", " 97.0\n", " 48.506726\n", - " 50.0\n", " \n", " \n", " 22h\n", " 3.0\n", " 97.0\n", " 44.532967\n", - " 45.5\n", " \n", " \n", " 23h\n", " 3.0\n", " 88.0\n", " 39.039735\n", - " 38.0\n", " \n", " \n", " 2h\n", " 2.0\n", " 86.0\n", " 30.235808\n", - " 26.0\n", " \n", " \n", " 3h\n", " 1.0\n", " 77.0\n", " 26.772926\n", - " 23.0\n", " \n", " \n", " 4h\n", " 1.0\n", " 65.0\n", " 24.644444\n", - " 21.0\n", " \n", " \n", " 5h\n", " 1.0\n", " 67.0\n", " 23.298701\n", - " 19.0\n", " \n", " \n", " 6h\n", " 1.0\n", " 64.0\n", " 24.314894\n", - " 21.0\n", " \n", " \n", " 7h\n", " 1.0\n", " 80.0\n", " 30.372294\n", - " 27.0\n", " \n", " \n", " 8h\n", " 1.0\n", " 103.0\n", " 40.004237\n", - " 42.0\n", " \n", " \n", " 9h\n", " 1.0\n", " 116.0\n", " 46.268908\n", - " 49.0\n", " \n", " \n", "\n", "" ], "text/plain": [ - " min max mean median\n", - "no2_hour \n", - "0h 2.0 113.0 42.854890 42.0\n", - "10h 1.0 117.0 43.719665 45.0\n", - "11h 1.0 109.0 38.466667 35.0\n", - "12h 2.0 80.0 30.612335 26.0\n", - "13h 1.0 83.0 27.261411 22.0\n", - "14h 2.0 71.0 28.053398 23.5\n", - "15h 2.0 88.0 28.342723 23.0\n", - "16h 3.0 84.0 28.910714 24.5\n", - "17h 3.0 80.0 32.728111 29.0\n", - "18h 6.0 89.0 42.253219 40.0\n", - "19h 6.0 101.0 49.320000 49.0\n", - "1h 2.0 96.0 35.714286 35.0\n", - "20h 4.0 105.0 50.504505 52.0\n", - "21h 4.0 97.0 48.506726 50.0\n", - "22h 3.0 97.0 44.532967 45.5\n", - "23h 3.0 88.0 39.039735 38.0\n", - "2h 2.0 86.0 30.235808 26.0\n", - "3h 1.0 77.0 26.772926 23.0\n", - "4h 1.0 65.0 24.644444 21.0\n", - "5h 1.0 67.0 23.298701 19.0\n", - "6h 1.0 64.0 24.314894 21.0\n", - "7h 1.0 80.0 30.372294 27.0\n", - "8h 1.0 103.0 40.004237 42.0\n", - "9h 1.0 116.0 46.268908 49.0" + " min max mean\n", + "no2_hour \n", + "0h 2.0 113.0 42.854890\n", + "10h 1.0 117.0 43.719665\n", + "11h 1.0 109.0 38.466667\n", + "12h 2.0 80.0 30.612335\n", + "13h 1.0 83.0 27.261411\n", + "14h 2.0 71.0 28.053398\n", + "15h 2.0 88.0 28.342723\n", + "16h 3.0 84.0 28.910714\n", + "17h 3.0 80.0 32.728111\n", + "18h 6.0 89.0 42.253219\n", + "19h 6.0 101.0 49.320000\n", + "1h 2.0 96.0 35.714286\n", + "20h 4.0 105.0 50.504505\n", + "21h 4.0 97.0 48.506726\n", + "22h 3.0 97.0 44.532967\n", + "23h 3.0 88.0 39.039735\n", + "2h 2.0 86.0 30.235808\n", + "3h 1.0 77.0 26.772926\n", + "4h 1.0 65.0 24.644444\n", + "5h 1.0 67.0 23.298701\n", + "6h 1.0 64.0 24.314894\n", + "7h 1.0 80.0 30.372294\n", + "8h 1.0 103.0 40.004237\n", + "9h 1.0 116.0 46.268908" ] }, - "execution_count": 13, + "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "hourly = df_no2.groupby('no2_hour').no2_value.agg(['min', 'max', 'mean', 'median'])\n", + "hourly = df_no2.groupby('no2_hour').no2_value.agg(['min', 'max', 'mean'])\n", "hourly" ] }, @@ -888,8 +852,8 @@ "metadata": {}, "outputs": [], "source": [ - "df_mon = df_no2[df_no2['generated'].str.contains('05/11/2018|11/11/2018|18/11/2018|25/11/2018')]\n", - "df_tue = df_no2[df_no2['generated'].str.contains('06/11/2018|12/11/2018|19/11/2018|26/11/2018')]\n", + "df_mon = df_no2[df_no2['generated'].str.contains('05/11/2018|12/11/2018|19/11/2018|26/11/2018')]\n", + "df_tue = df_no2[df_no2['generated'].str.contains('06/11/2018|13/11/2018|20/11/2018|27/11/2018')]\n", "df_wed = df_no2[df_no2['generated'].str.contains('07/11/2018|14/11/2018|21/11/2018|28/11/2018')]\n", "df_thu = df_no2[df_no2['generated'].str.contains('01/11/2018|08/11/2018|15/11/2018|22/11/2018|29/11/2018')]\n", "df_fr = df_no2[df_no2['generated'].str.contains('02/11/2018|09/11/2018|16/11/2018|23/11/2018|30/11/2018')]\n", @@ -1160,10 +1124,135 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 83, + "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", + " \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", + "
no2_hourno2_value
station
Barcelona - Sants0h84.0
Barcelona - Eixample0h113.0
Barcelona - Gràcia0h73.0
Barcelona - Ciutadella0h86.0
Barcelona - Vall Hebron0h69.0
.........
Barcelona - Ciutadella22h57.0
Barcelona - Vall Hebron22h31.0
Barcelona - Palau Reial22h20.0
Barcelona - Poblenou22h70.0
Barcelona - Observ Fabra22h21.0
\n", + "

5744 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " no2_hour no2_value\n", + "station \n", + "Barcelona - Sants 0h 84.0\n", + "Barcelona - Eixample 0h 113.0\n", + "Barcelona - Gràcia 0h 73.0\n", + "Barcelona - Ciutadella 0h 86.0\n", + "Barcelona - Vall Hebron 0h 69.0\n", + "... ... ...\n", + "Barcelona - Ciutadella 22h 57.0\n", + "Barcelona - Vall Hebron 22h 31.0\n", + "Barcelona - Palau Reial 22h 20.0\n", + "Barcelona - Poblenou 22h 70.0\n", + "Barcelona - Observ Fabra 22h 21.0\n", + "\n", + "[5744 rows x 2 columns]" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_corr = df_no2_short[['no2_hour', 'no2_value']]" + ] + }, + { + "cell_type": "code", + "execution_count": 88, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "#df_no2_short.groupby('no2_hour')[['no2_value']].corr()" + ] } ], "metadata": { From 48f51f4457d9c405b746b3b129b8244fcc63fada Mon Sep 17 00:00:00 2001 From: Nacho Rus Date: Thu, 1 Apr 2021 16:41:55 +0200 Subject: [PATCH 08/18] analyzing weeks --- your-project/AirQuality-Nacho.ipynb | 2202 ++++++++++++++++++++++++++- your-project/AirQuality.ipynb | 4 +- 2 files changed, 2160 insertions(+), 46 deletions(-) diff --git a/your-project/AirQuality-Nacho.ipynb b/your-project/AirQuality-Nacho.ipynb index 896b789..d76b4ce 100644 --- a/your-project/AirQuality-Nacho.ipynb +++ b/your-project/AirQuality-Nacho.ipynb @@ -2,13 +2,14 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, + "execution_count": 13, "id": "facial-portfolio", "metadata": { "ExecuteTime": { - "end_time": "2021-03-30T15:53:34.467216Z", - "start_time": "2021-03-30T15:53:34.316194Z" - } + "end_time": "2021-03-31T15:37:05.052039Z", + "start_time": "2021-03-31T15:37:04.915168Z" + }, + "scrolled": false }, "outputs": [ { @@ -140,34 +141,163 @@ " 01/11/2018 0:00\n", " 1541027104\n", " \n", + " \n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " ...\n", + " \n", + " \n", + " 5739\n", + " Barcelona - Ciutadella\n", + " Good\n", + " 2.1874\n", + " 41.3864\n", + " 22h\n", + " Good\n", + " 10.0\n", + " 22h\n", + " Good\n", + " 57.0\n", + " NaN\n", + " NaN\n", + " NaN\n", + " 30/11/2018 23:00\n", + " 1543615502\n", + " \n", + " \n", + " 5740\n", + " Barcelona - Vall Hebron\n", + " Good\n", + " 2.1480\n", + " 41.4261\n", + " 22h\n", + " Good\n", + " 32.0\n", + " 22h\n", + " Good\n", + " 31.0\n", + " 22h\n", + " Good\n", + " 21.0\n", + " 30/11/2018 23:00\n", + " 1543615502\n", + " \n", + " \n", + " 5741\n", + " Barcelona - Palau Reial\n", + " Good\n", + " 2.1151\n", + " 41.3875\n", + " 22h\n", + " Good\n", + " 40.0\n", + " 22h\n", + " Good\n", + " 20.0\n", + " 22h\n", + " Good\n", + " 15.0\n", + " 30/11/2018 23:00\n", + " 1543615502\n", + " \n", + " \n", + " 5742\n", + " Barcelona - Poblenou\n", + " Good\n", + " 2.2045\n", + " 41.4039\n", + " NaN\n", + " NaN\n", + " NaN\n", + " 22h\n", + " Good\n", + " 70.0\n", + " 22h\n", + " Good\n", + " 25.0\n", + " 30/11/2018 23:00\n", + " 1543615502\n", + " \n", + " \n", + " 5743\n", + " Barcelona - Observ Fabra\n", + " Good\n", + " 2.1239\n", + " 41.4183\n", + " 22h\n", + " Good\n", + " 64.0\n", + " 22h\n", + " Good\n", + " 21.0\n", + " 22h\n", + " Good\n", + " 12.0\n", + " 30/11/2018 23:00\n", + " 1543615502\n", + " \n", " \n", "\n", + "

5744 rows × 15 columns

\n", "" ], "text/plain": [ - " Station Air Quality Longitude Latitude O3 Hour \\\n", - "0 Barcelona - Sants Good 2.1331 41.3788 NaN \n", - "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", - "2 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", - "3 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", - "4 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", - "\n", - " O3 Quality O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour PM10 Quality \\\n", - "0 NaN NaN 0h Good 84.0 NaN NaN \n", - "1 Good 1.0 0h Moderate 113.0 0h Good \n", - "2 Good 10.0 0h Good 73.0 NaN NaN \n", - "3 Good 2.0 0h Good 86.0 NaN NaN \n", - "4 Good 7.0 0h Good 69.0 NaN NaN \n", - "\n", - " PM10 Value Generated Date Time \n", - "0 NaN 01/11/2018 0:00 1541027104 \n", - "1 36.0 01/11/2018 0:00 1541027104 \n", - "2 NaN 01/11/2018 0:00 1541027104 \n", - "3 NaN 01/11/2018 0:00 1541027104 \n", - "4 NaN 01/11/2018 0:00 1541027104 " + " Station Air Quality Longitude Latitude O3 Hour \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 NaN \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", + "3 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", + "4 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", + "... ... ... ... ... ... \n", + "5739 Barcelona - Ciutadella Good 2.1874 41.3864 22h \n", + "5740 Barcelona - Vall Hebron Good 2.1480 41.4261 22h \n", + "5741 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", + "5742 Barcelona - Poblenou Good 2.2045 41.4039 NaN \n", + "5743 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", + "\n", + " O3 Quality O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour \\\n", + "0 NaN NaN 0h Good 84.0 NaN \n", + "1 Good 1.0 0h Moderate 113.0 0h \n", + "2 Good 10.0 0h Good 73.0 NaN \n", + "3 Good 2.0 0h Good 86.0 NaN \n", + "4 Good 7.0 0h Good 69.0 NaN \n", + "... ... ... ... ... ... ... \n", + "5739 Good 10.0 22h Good 57.0 NaN \n", + "5740 Good 32.0 22h Good 31.0 22h \n", + "5741 Good 40.0 22h Good 20.0 22h \n", + "5742 NaN NaN 22h Good 70.0 22h \n", + "5743 Good 64.0 22h Good 21.0 22h \n", + "\n", + " PM10 Quality PM10 Value Generated Date Time \n", + "0 NaN NaN 01/11/2018 0:00 1541027104 \n", + "1 Good 36.0 01/11/2018 0:00 1541027104 \n", + "2 NaN NaN 01/11/2018 0:00 1541027104 \n", + "3 NaN NaN 01/11/2018 0:00 1541027104 \n", + "4 NaN NaN 01/11/2018 0:00 1541027104 \n", + "... ... ... ... ... \n", + "5739 NaN NaN 30/11/2018 23:00 1543615502 \n", + "5740 Good 21.0 30/11/2018 23:00 1543615502 \n", + "5741 Good 15.0 30/11/2018 23:00 1543615502 \n", + "5742 Good 25.0 30/11/2018 23:00 1543615502 \n", + "5743 Good 12.0 30/11/2018 23:00 1543615502 \n", + "\n", + "[5744 rows x 15 columns]" ] }, - "execution_count": 3, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -177,32 +307,2016 @@ "\n", "data = pd.read_csv('../datasets/2.-Urban-Environment/air-quality-nov-2017.csv')\n", "\n", - "data.head()" + "data" ] }, { "cell_type": "code", - "execution_count": null, - "id": "italic-franklin", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "collaborative-laser", - "metadata": {}, - "outputs": [], - "source": [] + "execution_count": 226, + "id": "ambient-preliminary", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T13:48:45.965691Z", + "start_time": "2021-04-01T13:48:45.909687Z" + }, + "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", + " \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", + " \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", + "
StationAir QualityPM10 HourPM10 QualityPM10 ValueGenerated
0Barcelona - SantsGoodNaNNaNNaN01/11/2018 0:00
1Barcelona - EixampleModerate0hGood36.001/11/2018 0:00
2Barcelona - GràciaGoodNaNNaNNaN01/11/2018 0:00
3Barcelona - CiutadellaGoodNaNNaNNaN01/11/2018 0:00
4Barcelona - Vall HebronGoodNaNNaNNaN01/11/2018 0:00
.....................
5739Barcelona - CiutadellaGoodNaNNaNNaN30/11/2018 23:00
5740Barcelona - Vall HebronGood22hGood21.030/11/2018 23:00
5741Barcelona - Palau ReialGood22hGood15.030/11/2018 23:00
5742Barcelona - PoblenouGood22hGood25.030/11/2018 23:00
5743Barcelona - Observ FabraGood22hGood12.030/11/2018 23:00
\n", + "

5744 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " Station Air Quality PM10 Hour PM10 Quality PM10 Value \\\n", + "0 Barcelona - Sants Good NaN NaN NaN \n", + "1 Barcelona - Eixample Moderate 0h Good 36.0 \n", + "2 Barcelona - Gràcia Good NaN NaN NaN \n", + "3 Barcelona - Ciutadella Good NaN NaN NaN \n", + "4 Barcelona - Vall Hebron Good NaN NaN NaN \n", + "... ... ... ... ... ... \n", + "5739 Barcelona - Ciutadella Good NaN NaN NaN \n", + "5740 Barcelona - Vall Hebron Good 22h Good 21.0 \n", + "5741 Barcelona - Palau Reial Good 22h Good 15.0 \n", + "5742 Barcelona - Poblenou Good 22h Good 25.0 \n", + "5743 Barcelona - Observ Fabra Good 22h Good 12.0 \n", + "\n", + " Generated \n", + "0 01/11/2018 0:00 \n", + "1 01/11/2018 0:00 \n", + "2 01/11/2018 0:00 \n", + "3 01/11/2018 0:00 \n", + "4 01/11/2018 0:00 \n", + "... ... \n", + "5739 30/11/2018 23:00 \n", + "5740 30/11/2018 23:00 \n", + "5741 30/11/2018 23:00 \n", + "5742 30/11/2018 23:00 \n", + "5743 30/11/2018 23:00 \n", + "\n", + "[5744 rows x 6 columns]" + ] + }, + "execution_count": 226, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#dropping non-PM10-related columns\n", + "\n", + "pm = data.drop(columns=['O3 Hour','O3 Quality','O3 Value','NO2 Hour','NO2 Quality','NO2 Value','Date Time','Longitude','Latitude'])\n", + "\n", + "pm" + ] }, { "cell_type": "code", - "execution_count": null, - "id": "muslim-kingdom", - "metadata": {}, - "outputs": [], - "source": [] + "execution_count": 227, + "id": "ecological-restaurant", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T13:48:49.396335Z", + "start_time": "2021-04-01T13:48:49.318470Z" + } + }, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StationAir QualityPM10 HourPM10 QualityPM10 ValueGenerated
0Barcelona - EixampleModerate0hGood36.001/11/2018 0:00
1Barcelona - Palau ReialGood23hGood23.001/11/2018 0:00
2Barcelona - PoblenouGood23hGood32.001/11/2018 0:00
3Barcelona - Observ FabraGood23hGood25.001/11/2018 0:00
4Barcelona - EixampleGood1hGood35.001/11/2018 1:00
.....................
3642Barcelona - GràciaGood22hGood22.030/11/2018 23:00
3643Barcelona - Vall HebronGood22hGood21.030/11/2018 23:00
3644Barcelona - Palau ReialGood22hGood15.030/11/2018 23:00
3645Barcelona - PoblenouGood22hGood25.030/11/2018 23:00
3646Barcelona - Observ FabraGood22hGood12.030/11/2018 23:00
\n", + "

3647 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " Station Air Quality PM10 Hour PM10 Quality PM10 Value \\\n", + "0 Barcelona - Eixample Moderate 0h Good 36.0 \n", + "1 Barcelona - Palau Reial Good 23h Good 23.0 \n", + "2 Barcelona - Poblenou Good 23h Good 32.0 \n", + "3 Barcelona - Observ Fabra Good 23h Good 25.0 \n", + "4 Barcelona - Eixample Good 1h Good 35.0 \n", + "... ... ... ... ... ... \n", + "3642 Barcelona - Gràcia Good 22h Good 22.0 \n", + "3643 Barcelona - Vall Hebron Good 22h Good 21.0 \n", + "3644 Barcelona - Palau Reial Good 22h Good 15.0 \n", + "3645 Barcelona - Poblenou Good 22h Good 25.0 \n", + "3646 Barcelona - Observ Fabra Good 22h Good 12.0 \n", + "\n", + " Generated \n", + "0 01/11/2018 0:00 \n", + "1 01/11/2018 0:00 \n", + "2 01/11/2018 0:00 \n", + "3 01/11/2018 0:00 \n", + "4 01/11/2018 1:00 \n", + "... ... \n", + "3642 30/11/2018 23:00 \n", + "3643 30/11/2018 23:00 \n", + "3644 30/11/2018 23:00 \n", + "3645 30/11/2018 23:00 \n", + "3646 30/11/2018 23:00 \n", + "\n", + "[3647 rows x 6 columns]" + ] + }, + "execution_count": 227, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Removing NaN rows\n", + "\n", + "nantodrop = pm[pm['PM10 Value'].isna() == True].index.tolist()\n", + "pm2 = pm.drop(nantodrop)\n", + "pm2.reset_index(drop=True,inplace=True)\n", + "\n", + "pm2" + ] + }, + { + "cell_type": "code", + "execution_count": 228, + "id": "wrapped-lawsuit", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T13:48:53.208152Z", + "start_time": "2021-04-01T13:48:53.151069Z" + } + }, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StationAir QualityPM10 QualityPM10 ValueGeneratedTime (h)
0Barcelona - EixampleModerateGood36.001/11/2018 0:000
1Barcelona - Palau ReialGoodGood23.001/11/2018 0:0023
2Barcelona - PoblenouGoodGood32.001/11/2018 0:0023
3Barcelona - Observ FabraGoodGood25.001/11/2018 0:0023
4Barcelona - EixampleGoodGood35.001/11/2018 1:001
.....................
3642Barcelona - GràciaGoodGood22.030/11/2018 23:0022
3643Barcelona - Vall HebronGoodGood21.030/11/2018 23:0022
3644Barcelona - Palau ReialGoodGood15.030/11/2018 23:0022
3645Barcelona - PoblenouGoodGood25.030/11/2018 23:0022
3646Barcelona - Observ FabraGoodGood12.030/11/2018 23:0022
\n", + "

3647 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " Station Air Quality PM10 Quality PM10 Value \\\n", + "0 Barcelona - Eixample Moderate Good 36.0 \n", + "1 Barcelona - Palau Reial Good Good 23.0 \n", + "2 Barcelona - Poblenou Good Good 32.0 \n", + "3 Barcelona - Observ Fabra Good Good 25.0 \n", + "4 Barcelona - Eixample Good Good 35.0 \n", + "... ... ... ... ... \n", + "3642 Barcelona - Gràcia Good Good 22.0 \n", + "3643 Barcelona - Vall Hebron Good Good 21.0 \n", + "3644 Barcelona - Palau Reial Good Good 15.0 \n", + "3645 Barcelona - Poblenou Good Good 25.0 \n", + "3646 Barcelona - Observ Fabra Good Good 12.0 \n", + "\n", + " Generated Time (h) \n", + "0 01/11/2018 0:00 0 \n", + "1 01/11/2018 0:00 23 \n", + "2 01/11/2018 0:00 23 \n", + "3 01/11/2018 0:00 23 \n", + "4 01/11/2018 1:00 1 \n", + "... ... ... \n", + "3642 30/11/2018 23:00 22 \n", + "3643 30/11/2018 23:00 22 \n", + "3644 30/11/2018 23:00 22 \n", + "3645 30/11/2018 23:00 22 \n", + "3646 30/11/2018 23:00 22 \n", + "\n", + "[3647 rows x 6 columns]" + ] + }, + "execution_count": 228, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Removing \"h\" from PM10 Hour column elements in a new column\n", + "\n", + "pm2['time'] = list(map(lambda x: int(re.findall(r\"\\d+\",x)[0]),pm2['PM10 Hour']))\n", + "pm2.rename(columns={'time':'Time (h)'},inplace=True)\n", + "pm2.drop(columns=['PM10 Hour'],inplace=True)\n", + "pm2" + ] + }, + { + "cell_type": "code", + "execution_count": 229, + "id": "laden-attraction", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T13:49:09.614329Z", + "start_time": "2021-04-01T13:49:09.565306Z" + }, + "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", + " \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", + " \n", + "
minmaxmean
Time (h)
02.042.016.07
13.043.017.23
22.039.016.34
32.044.017.23
43.044.016.81
............
193.041.016.73
202.041.016.51
212.041.016.40
223.042.016.58
232.041.016.70
\n", + "

24 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " min max mean\n", + "Time (h) \n", + "0 2.0 42.0 16.07\n", + "1 3.0 43.0 17.23\n", + "2 2.0 39.0 16.34\n", + "3 2.0 44.0 17.23\n", + "4 3.0 44.0 16.81\n", + "... ... ... ...\n", + "19 3.0 41.0 16.73\n", + "20 2.0 41.0 16.51\n", + "21 2.0 41.0 16.40\n", + "22 3.0 42.0 16.58\n", + "23 2.0 41.0 16.70\n", + "\n", + "[24 rows x 3 columns]" + ] + }, + "execution_count": 229, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Analyzing how it changes throughout the day\n", + "\n", + "roun = lambda x: np.round(np.mean(x),decimals=2)\n", + "pm2.groupby('Time (h)')['PM10 Value'].agg(['min','max','mean']).round(2).sort_values('Time (h)')" + ] + }, + { + "cell_type": "code", + "execution_count": 230, + "id": "sought-bouquet", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T13:49:11.691227Z", + "start_time": "2021-04-01T13:49:11.641786Z" + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
minmaxmean
Station
Barcelona - Observ Fabra5.025.010.77
Barcelona - Vall Hebron2.032.013.91
Barcelona - Palau Reial6.029.014.53
Barcelona - Gràcia7.031.016.82
Barcelona - Poblenou7.038.020.54
Barcelona - Eixample11.044.022.78
\n", + "
" + ], + "text/plain": [ + " min max mean\n", + "Station \n", + "Barcelona - Observ Fabra 5.0 25.0 10.77\n", + "Barcelona - Vall Hebron 2.0 32.0 13.91\n", + "Barcelona - Palau Reial 6.0 29.0 14.53\n", + "Barcelona - Gràcia 7.0 31.0 16.82\n", + "Barcelona - Poblenou 7.0 38.0 20.54\n", + "Barcelona - Eixample 11.0 44.0 22.78" + ] + }, + "execution_count": 230, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Analyzing the difference between Stations\n", + "\n", + "pm2.groupby('Station')['PM10 Value'].agg(['min','max','mean']).round(2).sort_values('mean')" + ] + }, + { + "cell_type": "code", + "execution_count": 231, + "id": "secondary-winner", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T13:49:13.625830Z", + "start_time": "2021-04-01T13:49:13.600203Z" + } + }, + "outputs": [], + "source": [ + "# to see full table\n", + "\n", + "pd.set_option('display.max_rows', 10)" + ] + }, + { + "cell_type": "code", + "execution_count": 232, + "id": "senior-rotation", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T13:49:18.004853Z", + "start_time": "2021-04-01T13:49:17.935098Z" + }, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
minmaxmean
StationTime (h)
Barcelona - Eixample012.042.022.43
111.043.022.97
211.039.021.93
311.044.023.70
411.044.023.34
...............
Barcelona - Vall Hebron193.032.014.42
202.025.013.27
212.032.013.82
223.031.015.04
232.031.013.57
\n", + "

144 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " min max mean\n", + "Station Time (h) \n", + "Barcelona - Eixample 0 12.0 42.0 22.43\n", + " 1 11.0 43.0 22.97\n", + " 2 11.0 39.0 21.93\n", + " 3 11.0 44.0 23.70\n", + " 4 11.0 44.0 23.34\n", + "... ... ... ...\n", + "Barcelona - Vall Hebron 19 3.0 32.0 14.42\n", + " 20 2.0 25.0 13.27\n", + " 21 2.0 32.0 13.82\n", + " 22 3.0 31.0 15.04\n", + " 23 2.0 31.0 13.57\n", + "\n", + "[144 rows x 3 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "#Analyzing the hourly change for every station\n", + "\n", + "display(pm2.groupby(['Station','Time (h)'])['PM10 Value'].agg(['min','max','mean']).round(2))" + ] + }, + { + "cell_type": "code", + "execution_count": 233, + "id": "political-victoria", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T13:49:34.668276Z", + "start_time": "2021-04-01T13:49:34.606160Z" + } + }, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StationAir QualityPM10 QualityPM10 ValueGeneratedTime (h)
0Barcelona - EixampleModerateGood36.001/11/2018 0:000
1Barcelona - Palau ReialGoodGood23.001/11/2018 0:0023
2Barcelona - PoblenouGoodGood32.001/11/2018 0:0023
3Barcelona - Observ FabraGoodGood25.001/11/2018 0:0023
4Barcelona - EixampleGoodGood35.001/11/2018 1:001
.....................
3642Barcelona - GràciaGoodGood22.030/11/2018 23:0022
3643Barcelona - Vall HebronGoodGood21.030/11/2018 23:0022
3644Barcelona - Palau ReialGoodGood15.030/11/2018 23:0022
3645Barcelona - PoblenouGoodGood25.030/11/2018 23:0022
3646Barcelona - Observ FabraGoodGood12.030/11/2018 23:0022
\n", + "

3647 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " Station Air Quality PM10 Quality PM10 Value \\\n", + "0 Barcelona - Eixample Moderate Good 36.0 \n", + "1 Barcelona - Palau Reial Good Good 23.0 \n", + "2 Barcelona - Poblenou Good Good 32.0 \n", + "3 Barcelona - Observ Fabra Good Good 25.0 \n", + "4 Barcelona - Eixample Good Good 35.0 \n", + "... ... ... ... ... \n", + "3642 Barcelona - Gràcia Good Good 22.0 \n", + "3643 Barcelona - Vall Hebron Good Good 21.0 \n", + "3644 Barcelona - Palau Reial Good Good 15.0 \n", + "3645 Barcelona - Poblenou Good Good 25.0 \n", + "3646 Barcelona - Observ Fabra Good Good 12.0 \n", + "\n", + " Generated Time (h) \n", + "0 01/11/2018 0:00 0 \n", + "1 01/11/2018 0:00 23 \n", + "2 01/11/2018 0:00 23 \n", + "3 01/11/2018 0:00 23 \n", + "4 01/11/2018 1:00 1 \n", + "... ... ... \n", + "3642 30/11/2018 23:00 22 \n", + "3643 30/11/2018 23:00 22 \n", + "3644 30/11/2018 23:00 22 \n", + "3645 30/11/2018 23:00 22 \n", + "3646 30/11/2018 23:00 22 \n", + "\n", + "[3647 rows x 6 columns]" + ] + }, + "execution_count": 233, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_nov = pm2[pm2['Generated'].str.contains('\\d{2}/11/2018')].groupby(['Generated'])\n", + "df_nov.head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 241, + "id": "falling-college", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T14:06:54.219391Z", + "start_time": "2021-04-01T14:06:54.093525Z" + } + }, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StationAir QualityPM10 QualityPM10 ValueGeneratedTime (h)
425Barcelona - EixampleGoodGood19.005/11/2018 0:000
426Barcelona - Vall HebronGoodGood2.005/11/2018 0:000
427Barcelona - Palau ReialGoodGood16.005/11/2018 0:000
428Barcelona - PoblenouGoodGood19.005/11/2018 0:000
429Barcelona - Observ FabraGoodGood14.005/11/2018 0:000
.....................
3099Barcelona - EixampleGoodGood13.026/11/2018 23:0022
3100Barcelona - GràciaGoodGood13.026/11/2018 23:0022
3101Barcelona - Vall HebronGoodGood10.026/11/2018 23:0022
3102Barcelona - Palau ReialGoodGood10.026/11/2018 23:0023
3103Barcelona - Observ FabraGoodGood7.026/11/2018 23:0022
\n", + "

486 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " Station Air Quality PM10 Quality PM10 Value \\\n", + "425 Barcelona - Eixample Good Good 19.0 \n", + "426 Barcelona - Vall Hebron Good Good 2.0 \n", + "427 Barcelona - Palau Reial Good Good 16.0 \n", + "428 Barcelona - Poblenou Good Good 19.0 \n", + "429 Barcelona - Observ Fabra Good Good 14.0 \n", + "... ... ... ... ... \n", + "3099 Barcelona - Eixample Good Good 13.0 \n", + "3100 Barcelona - Gràcia Good Good 13.0 \n", + "3101 Barcelona - Vall Hebron Good Good 10.0 \n", + "3102 Barcelona - Palau Reial Good Good 10.0 \n", + "3103 Barcelona - Observ Fabra Good Good 7.0 \n", + "\n", + " Generated Time (h) \n", + "425 05/11/2018 0:00 0 \n", + "426 05/11/2018 0:00 0 \n", + "427 05/11/2018 0:00 0 \n", + "428 05/11/2018 0:00 0 \n", + "429 05/11/2018 0:00 0 \n", + "... ... ... \n", + "3099 26/11/2018 23:00 22 \n", + "3100 26/11/2018 23:00 22 \n", + "3101 26/11/2018 23:00 22 \n", + "3102 26/11/2018 23:00 23 \n", + "3103 26/11/2018 23:00 22 \n", + "\n", + "[486 rows x 6 columns]" + ] + }, + "execution_count": 241, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Separate into one dataframe per day of the week\n", + "monday = pm2[pm2['Generated'].str.contains('05/11/2018|12/11/2018|19/11/2018|26/11/2018')]\n", + "tuesday = pm2[pm2['Generated'].str.contains('06/11/2018|13/11/2018|20/11/2018|27/11/2018')]\n", + "wednesday = pm2[pm2['Generated'].str.contains('07/11/2018|14/11/2018|21/11/2018|28/11/2018')]\n", + "thursday = pm2[pm2['Generated'].str.contains('01/11/2018|08/11/2018|15/11/2018|22/11/2018|29/11/2018')]\n", + "friday = pm2[pm2['Generated'].str.contains('02/11/2018|09/11/2018|16/11/2018|23/11/2018|30/11/2018')]\n", + "saturday = pm2[pm2['Generated'].str.contains('03/11/2018|10/11/2018|17/11/2018|24/11/2018')]\n", + "sunday = pm2[pm2['Generated'].str.contains('04/11/2018|11/11/2018|18/11/2018|25/11/2018')]\n", + "\n", + "monday" + ] + }, + { + "cell_type": "code", + "execution_count": 252, + "id": "spiritual-identity", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T14:12:33.048829Z", + "start_time": "2021-04-01T14:12:33.023555Z" + }, + "scrolled": true + }, + "outputs": [], + "source": [ + "#Calculating average contamination per day\n", + "\n", + "mon_mean = monday['PM10 Value'].mean()\n", + "tue_mean = tuesday['PM10 Value'].mean()\n", + "wed_mean = wednesday['PM10 Value'].mean()\n", + "thu_mean = thursday['PM10 Value'].mean()\n", + "fri_mean = friday['PM10 Value'].mean()\n", + "sat_mean = saturday['PM10 Value'].mean()\n", + "sun_mean = sunday['PM10 Value'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 262, + "id": "interim-morgan", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T14:16:13.508968Z", + "start_time": "2021-04-01T14:16:13.457047Z" + }, + "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", + "
PM10 Mean
Weekdays
Monday16.427984
Tuesday17.660338
Wednesday17.319192
Thursday18.869707
Friday19.143590
Saturday14.234818
Sunday11.541082
\n", + "
" + ], + "text/plain": [ + " PM10 Mean\n", + "Weekdays \n", + "Monday 16.427984\n", + "Tuesday 17.660338\n", + "Wednesday 17.319192\n", + "Thursday 18.869707\n", + "Friday 19.143590\n", + "Saturday 14.234818\n", + "Sunday 11.541082" + ] + }, + "execution_count": 262, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# creating DataFrame for weekdays\n", + "weekdays = [['Monday', mon_mean], ['Tuesday', tue_mean], ['Wednesday', wed_mean], ['Thursday', thu_mean], ['Friday', fri_mean], ['Saturday', sat_mean], ['Sunday', sun_mean]]\n", + "\n", + "weekdf = pd.DataFrame(weekdays,columns=['Weekdays','PM10 Mean']).set_index('Weekdays')\n", + "weekdf" + ] + }, + { + "cell_type": "code", + "execution_count": 264, + "id": "interracial-throw", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T14:25:12.716014Z", + "start_time": "2021-04-01T14:25:12.604722Z" + } + }, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StationAir QualityPM10 QualityPM10 ValueGeneratedTime (h)
0Barcelona - EixampleModerateGood36.001/11/2018 0:000
1Barcelona - Palau ReialGoodGood23.001/11/2018 0:0023
2Barcelona - PoblenouGoodGood32.001/11/2018 0:0023
3Barcelona - Observ FabraGoodGood25.001/11/2018 0:0023
4Barcelona - EixampleGoodGood35.001/11/2018 1:001
.....................
757Barcelona - EixampleGoodGood21.007/11/2018 23:0023
758Barcelona - Vall HebronGoodGood9.007/11/2018 23:0023
759Barcelona - Palau ReialGoodGood11.007/11/2018 23:0023
760Barcelona - PoblenouGoodGood19.007/11/2018 23:0023
761Barcelona - Observ FabraGoodGood8.007/11/2018 23:0023
\n", + "

762 rows × 6 columns

\n", + "
" + ], + "text/plain": [ + " Station Air Quality PM10 Quality PM10 Value \\\n", + "0 Barcelona - Eixample Moderate Good 36.0 \n", + "1 Barcelona - Palau Reial Good Good 23.0 \n", + "2 Barcelona - Poblenou Good Good 32.0 \n", + "3 Barcelona - Observ Fabra Good Good 25.0 \n", + "4 Barcelona - Eixample Good Good 35.0 \n", + ".. ... ... ... ... \n", + "757 Barcelona - Eixample Good Good 21.0 \n", + "758 Barcelona - Vall Hebron Good Good 9.0 \n", + "759 Barcelona - Palau Reial Good Good 11.0 \n", + "760 Barcelona - Poblenou Good Good 19.0 \n", + "761 Barcelona - Observ Fabra Good Good 8.0 \n", + "\n", + " Generated Time (h) \n", + "0 01/11/2018 0:00 0 \n", + "1 01/11/2018 0:00 23 \n", + "2 01/11/2018 0:00 23 \n", + "3 01/11/2018 0:00 23 \n", + "4 01/11/2018 1:00 1 \n", + ".. ... ... \n", + "757 07/11/2018 23:00 23 \n", + "758 07/11/2018 23:00 23 \n", + "759 07/11/2018 23:00 23 \n", + "760 07/11/2018 23:00 23 \n", + "761 07/11/2018 23:00 23 \n", + "\n", + "[762 rows x 6 columns]" + ] + }, + "execution_count": 264, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Separate into one dataframe per week\n", + "week_1 = pm2[pm2['Generated'].str.contains('01/11/2018|02/11/2018|03/11/2018|04/11/2018|05/11/2018|06/11/2018|07/11/2018')]\n", + "week_2 = pm2[pm2['Generated'].str.contains('08/11/2018|09/11/2018|10/11/2018|11/11/2018|12/11/2018|13/11/2018|14/11/2018')]\n", + "week_3 = pm2[pm2['Generated'].str.contains('15/11/2018|16/11/2018|17/11/2018|18/11/2018|19/11/2018|20/11/2018|21/11/2018')]\n", + "week_4 = pm2[pm2['Generated'].str.contains('22/11/2018|23/11/2018|24/11/2018|25/11/2018|26/11/2018|27/11/2018|28/11/2018')]\n", + "week_5 = pm2[pm2['Generated'].str.contains('29/11/2018|30/11/2018')]\n", + "week_1" + ] + }, + { + "cell_type": "code", + "execution_count": 270, + "id": "confident-reach", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T14:37:38.529607Z", + "start_time": "2021-04-01T14:37:38.497782Z" + } + }, + "outputs": [], + "source": [ + "#Calculating average contamination per day\n", + "\n", + "w1_mean = week_1['PM10 Value'].mean()\n", + "w2_mean = week_2['PM10 Value'].mean()\n", + "w3_mean = week_3['PM10 Value'].mean()\n", + "w4_mean = week_4['PM10 Value'].mean()\n", + "w5_mean = week_5['PM10 Value'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 271, + "id": "vocal-convenience", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T14:37:39.741788Z", + "start_time": "2021-04-01T14:37:39.690765Z" + } + }, + "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", + "
PM10 Mean
Weeks
Week 113.481627
Week 219.594096
Week 317.355828
Week 413.561404
Week 524.357639
\n", + "
" + ], + "text/plain": [ + " PM10 Mean\n", + "Weeks \n", + "Week 1 13.481627\n", + "Week 2 19.594096\n", + "Week 3 17.355828\n", + "Week 4 13.561404\n", + "Week 5 24.357639" + ] + }, + "execution_count": 271, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# creating DataFrame for weeks\n", + "weeks = [['Week 1', w1_mean], ['Week 2', w2_mean], ['Week 3', w3_mean], ['Week 4', w4_mean], ['Week 5', w5_mean]]\n", + "\n", + "weeksdf = pd.DataFrame(weeks,columns=['Weeks','PM10 Mean']).set_index('Weeks')\n", + "weeksdf" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "structural-filling", + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-31T16:56:51.294593Z", + "start_time": "2021-03-31T16:56:51.279977Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Station PM10 Quality\n", + "Barcelona - Eixample Good 655\n", + " Moderate 63\n", + "Barcelona - Gràcia Good 211\n", + "Barcelona - Observ Fabra Good 693\n", + " -- 21\n", + "Barcelona - Palau Reial Good 696\n", + " -- 22\n", + "Barcelona - Poblenou Good 667\n", + " -- 32\n", + " Moderate 17\n", + "Barcelona - Vall Hebron Good 645\n", + "Name: PM10 Quality, dtype: int64" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pm.groupby('Station')['PM10 Quality'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "electoral-slave", + "metadata": { + "ExecuteTime": { + "end_time": "2021-03-31T16:21:37.794400Z", + "start_time": "2021-03-31T16:21:37.672449Z" + }, + "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", + " \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", + " \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", + "
countmeanstdmin25%50%75%max
Station
Barcelona - Observ Fabra693.010.7734494.7066295.07.09.013.025.0
Barcelona - Vall Hebron645.013.9100786.7959142.09.012.018.032.0
Barcelona - Palau Reial696.014.5272995.5835686.010.013.018.029.0
Barcelona - Gràcia211.016.8151666.0268417.012.017.021.031.0
Barcelona - Poblenou684.020.5409367.8700887.015.019.027.038.0
Barcelona - Eixample718.022.7813378.45487411.016.022.029.044.0
Barcelona - Ciutadella0.0NaNNaNNaNNaNNaNNaNNaN
Barcelona - Sants0.0NaNNaNNaNNaNNaNNaNNaN
\n", + "
" + ], + "text/plain": [ + " count mean std min 25% 50% 75% \\\n", + "Station \n", + "Barcelona - Observ Fabra 693.0 10.773449 4.706629 5.0 7.0 9.0 13.0 \n", + "Barcelona - Vall Hebron 645.0 13.910078 6.795914 2.0 9.0 12.0 18.0 \n", + "Barcelona - Palau Reial 696.0 14.527299 5.583568 6.0 10.0 13.0 18.0 \n", + "Barcelona - Gràcia 211.0 16.815166 6.026841 7.0 12.0 17.0 21.0 \n", + "Barcelona - Poblenou 684.0 20.540936 7.870088 7.0 15.0 19.0 27.0 \n", + "Barcelona - Eixample 718.0 22.781337 8.454874 11.0 16.0 22.0 29.0 \n", + "Barcelona - Ciutadella 0.0 NaN NaN NaN NaN NaN NaN \n", + "Barcelona - Sants 0.0 NaN NaN NaN NaN NaN NaN \n", + "\n", + " max \n", + "Station \n", + "Barcelona - Observ Fabra 25.0 \n", + "Barcelona - Vall Hebron 32.0 \n", + "Barcelona - Palau Reial 29.0 \n", + "Barcelona - Gràcia 31.0 \n", + "Barcelona - Poblenou 38.0 \n", + "Barcelona - Eixample 44.0 \n", + "Barcelona - Ciutadella NaN \n", + "Barcelona - Sants NaN " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pm.groupby('Station')['PM10 Value'].describe().sort_values('mean')\n", + "\n", + "#Observatori Fabra and Vall Hebron are further away from the port\n", + "#Quite some distance\n", + "#Then Palau and closely followed by Gracia\n", + "#Then Sants" + ] } ], "metadata": { diff --git a/your-project/AirQuality.ipynb b/your-project/AirQuality.ipynb index de4fa91..e375af8 100644 --- a/your-project/AirQuality.ipynb +++ b/your-project/AirQuality.ipynb @@ -3,7 +3,7 @@ { "cell_type": "code", "execution_count": 3, - "id": "sexual-ridge", + "id": "streaming-stereo", "metadata": { "ExecuteTime": { "end_time": "2021-03-30T15:53:34.467216Z", @@ -183,7 +183,7 @@ { "cell_type": "code", "execution_count": null, - "id": "spare-result", + "id": "published-restaurant", "metadata": {}, "outputs": [], "source": [] From f6d21f4b2d0f75fea003b9be1b46413d1a7831a2 Mon Sep 17 00:00:00 2001 From: Nacho Rus Date: Thu, 1 Apr 2021 19:11:57 +0200 Subject: [PATCH 09/18] PM10 is ready --- green_vs_polluted_city_311751.jpg | Bin 0 -> 95476 bytes your-project/AirQuality-Nacho.ipynb | 593 +++++++++++++++++----------- 2 files changed, 364 insertions(+), 229 deletions(-) create mode 100644 green_vs_polluted_city_311751.jpg diff --git a/green_vs_polluted_city_311751.jpg b/green_vs_polluted_city_311751.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a936f52e2d3ab82fe0460401267b838b1ddbd0f4 GIT binary patch literal 95476 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 z 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 literal 0 HcmV?d00001 diff --git a/your-project/AirQuality-Nacho.ipynb b/your-project/AirQuality-Nacho.ipynb index d76b4ce..c2ff2c8 100644 --- a/your-project/AirQuality-Nacho.ipynb +++ b/your-project/AirQuality-Nacho.ipynb @@ -2,14 +2,14 @@ "cells": [ { "cell_type": "code", - "execution_count": 13, + "execution_count": 294, "id": "facial-portfolio", "metadata": { "ExecuteTime": { - "end_time": "2021-03-31T15:37:05.052039Z", - "start_time": "2021-03-31T15:37:04.915168Z" + "end_time": "2021-04-01T16:30:48.272071Z", + "start_time": "2021-04-01T16:30:48.062154Z" }, - "scrolled": false + "scrolled": true }, "outputs": [ { @@ -297,7 +297,7 @@ "[5744 rows x 15 columns]" ] }, - "execution_count": 13, + "execution_count": 294, "metadata": {}, "output_type": "execute_result" } @@ -312,12 +312,12 @@ }, { "cell_type": "code", - "execution_count": 226, + "execution_count": 295, "id": "ambient-preliminary", "metadata": { "ExecuteTime": { - "end_time": "2021-04-01T13:48:45.965691Z", - "start_time": "2021-04-01T13:48:45.909687Z" + "end_time": "2021-04-01T16:30:50.724835Z", + "start_time": "2021-04-01T16:30:50.649221Z" }, "scrolled": true }, @@ -486,7 +486,7 @@ "[5744 rows x 6 columns]" ] }, - "execution_count": 226, + "execution_count": 295, "metadata": {}, "output_type": "execute_result" } @@ -501,12 +501,44 @@ }, { "cell_type": "code", - "execution_count": 227, - "id": "ecological-restaurant", + "execution_count": 311, + "id": "miniature-holmes", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T17:10:52.569479Z", + "start_time": "2021-04-01T17:10:52.542809Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "3647" + ] + }, + "execution_count": 311, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Removing NaN rows\n", + "\n", + "nantodrop = pm[pm['PM10 Value'].isna() == True].index.tolist()\n", + "pm2 = pm.drop(nantodrop)\n", + "pm2.reset_index(drop=True,inplace=True)\n", + "\n", + "pm2['PM10 Value'].value_counts().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": 228, + "id": "horizontal-example", "metadata": { "ExecuteTime": { - "end_time": "2021-04-01T13:48:49.396335Z", - "start_time": "2021-04-01T13:48:49.318470Z" + "end_time": "2021-04-01T13:48:53.208152Z", + "start_time": "2021-04-01T13:48:53.151069Z" } }, "outputs": [ @@ -533,10 +565,10 @@ " \n", " Station\n", " Air Quality\n", - " PM10 Hour\n", " PM10 Quality\n", " PM10 Value\n", " Generated\n", + " Time (h)\n", " \n", " \n", " \n", @@ -544,46 +576,46 @@ " 0\n", " Barcelona - Eixample\n", " Moderate\n", - " 0h\n", " Good\n", " 36.0\n", " 01/11/2018 0:00\n", + " 0\n", " \n", " \n", " 1\n", " Barcelona - Palau Reial\n", " Good\n", - " 23h\n", " Good\n", " 23.0\n", " 01/11/2018 0:00\n", + " 23\n", " \n", " \n", " 2\n", " Barcelona - Poblenou\n", " Good\n", - " 23h\n", " Good\n", " 32.0\n", " 01/11/2018 0:00\n", + " 23\n", " \n", " \n", " 3\n", " Barcelona - Observ Fabra\n", " Good\n", - " 23h\n", " Good\n", " 25.0\n", " 01/11/2018 0:00\n", + " 23\n", " \n", " \n", " 4\n", " Barcelona - Eixample\n", " Good\n", - " 1h\n", " Good\n", " 35.0\n", " 01/11/2018 1:00\n", + " 1\n", " \n", " \n", " ...\n", @@ -598,46 +630,46 @@ " 3642\n", " Barcelona - Gràcia\n", " Good\n", - " 22h\n", " Good\n", " 22.0\n", " 30/11/2018 23:00\n", + " 22\n", " \n", " \n", " 3643\n", " Barcelona - Vall Hebron\n", " Good\n", - " 22h\n", " Good\n", " 21.0\n", " 30/11/2018 23:00\n", + " 22\n", " \n", " \n", " 3644\n", " Barcelona - Palau Reial\n", " Good\n", - " 22h\n", " Good\n", " 15.0\n", " 30/11/2018 23:00\n", + " 22\n", " \n", " \n", " 3645\n", " Barcelona - Poblenou\n", " Good\n", - " 22h\n", " Good\n", " 25.0\n", " 30/11/2018 23:00\n", + " 22\n", " \n", " \n", " 3646\n", " Barcelona - Observ Fabra\n", " Good\n", - " 22h\n", " Good\n", " 12.0\n", " 30/11/2018 23:00\n", + " 22\n", " \n", " \n", "\n", @@ -645,59 +677,59 @@ "" ], "text/plain": [ - " Station Air Quality PM10 Hour PM10 Quality PM10 Value \\\n", - "0 Barcelona - Eixample Moderate 0h Good 36.0 \n", - "1 Barcelona - Palau Reial Good 23h Good 23.0 \n", - "2 Barcelona - Poblenou Good 23h Good 32.0 \n", - "3 Barcelona - Observ Fabra Good 23h Good 25.0 \n", - "4 Barcelona - Eixample Good 1h Good 35.0 \n", - "... ... ... ... ... ... \n", - "3642 Barcelona - Gràcia Good 22h Good 22.0 \n", - "3643 Barcelona - Vall Hebron Good 22h Good 21.0 \n", - "3644 Barcelona - Palau Reial Good 22h Good 15.0 \n", - "3645 Barcelona - Poblenou Good 22h Good 25.0 \n", - "3646 Barcelona - Observ Fabra Good 22h Good 12.0 \n", + " Station Air Quality PM10 Quality PM10 Value \\\n", + "0 Barcelona - Eixample Moderate Good 36.0 \n", + "1 Barcelona - Palau Reial Good Good 23.0 \n", + "2 Barcelona - Poblenou Good Good 32.0 \n", + "3 Barcelona - Observ Fabra Good Good 25.0 \n", + "4 Barcelona - Eixample Good Good 35.0 \n", + "... ... ... ... ... \n", + "3642 Barcelona - Gràcia Good Good 22.0 \n", + "3643 Barcelona - Vall Hebron Good Good 21.0 \n", + "3644 Barcelona - Palau Reial Good Good 15.0 \n", + "3645 Barcelona - Poblenou Good Good 25.0 \n", + "3646 Barcelona - Observ Fabra Good Good 12.0 \n", "\n", - " Generated \n", - "0 01/11/2018 0:00 \n", - "1 01/11/2018 0:00 \n", - "2 01/11/2018 0:00 \n", - "3 01/11/2018 0:00 \n", - "4 01/11/2018 1:00 \n", - "... ... \n", - "3642 30/11/2018 23:00 \n", - "3643 30/11/2018 23:00 \n", - "3644 30/11/2018 23:00 \n", - "3645 30/11/2018 23:00 \n", - "3646 30/11/2018 23:00 \n", + " Generated Time (h) \n", + "0 01/11/2018 0:00 0 \n", + "1 01/11/2018 0:00 23 \n", + "2 01/11/2018 0:00 23 \n", + "3 01/11/2018 0:00 23 \n", + "4 01/11/2018 1:00 1 \n", + "... ... ... \n", + "3642 30/11/2018 23:00 22 \n", + "3643 30/11/2018 23:00 22 \n", + "3644 30/11/2018 23:00 22 \n", + "3645 30/11/2018 23:00 22 \n", + "3646 30/11/2018 23:00 22 \n", "\n", "[3647 rows x 6 columns]" ] }, - "execution_count": 227, + "execution_count": 228, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#Removing NaN rows\n", - "\n", - "nantodrop = pm[pm['PM10 Value'].isna() == True].index.tolist()\n", - "pm2 = pm.drop(nantodrop)\n", - "pm2.reset_index(drop=True,inplace=True)\n", + "#Removing \"h\" from PM10 Hour column elements in a new column\n", "\n", + "pm2['time'] = list(map(lambda x: int(re.findall(r\"\\d+\",x)[0]),pm2['PM10 Hour']))\n", + "pm2.rename(columns={'time':'Time (h)'},inplace=True)\n", + "pm2.drop(columns=['PM10 Hour'],inplace=True)\n", "pm2" ] }, { "cell_type": "code", - "execution_count": 228, - "id": "wrapped-lawsuit", + "execution_count": 290, + "id": "plastic-grove", "metadata": { "ExecuteTime": { - "end_time": "2021-04-01T13:48:53.208152Z", - "start_time": "2021-04-01T13:48:53.151069Z" - } + "end_time": "2021-04-01T16:10:13.198267Z", + "start_time": "2021-04-01T16:10:13.118788Z" + }, + "scrolled": true }, "outputs": [ { @@ -721,173 +753,134 @@ " \n", " \n", " \n", - " Station\n", - " Air Quality\n", - " PM10 Quality\n", - " PM10 Value\n", - " Generated\n", + " min\n", + " max\n", + " mean\n", + " \n", + " \n", " Time (h)\n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " 0\n", - " Barcelona - Eixample\n", - " Moderate\n", - " Good\n", - " 36.0\n", - " 01/11/2018 0:00\n", - " 0\n", + " 2.0\n", + " 42.0\n", + " 16.07\n", " \n", " \n", " 1\n", - " Barcelona - Palau Reial\n", - " Good\n", - " Good\n", - " 23.0\n", - " 01/11/2018 0:00\n", - " 23\n", + " 3.0\n", + " 43.0\n", + " 17.23\n", " \n", " \n", " 2\n", - " Barcelona - Poblenou\n", - " Good\n", - " Good\n", - " 32.0\n", - " 01/11/2018 0:00\n", - " 23\n", + " 2.0\n", + " 39.0\n", + " 16.34\n", " \n", " \n", " 3\n", - " Barcelona - Observ Fabra\n", - " Good\n", - " Good\n", - " 25.0\n", - " 01/11/2018 0:00\n", - " 23\n", + " 2.0\n", + " 44.0\n", + " 17.23\n", " \n", " \n", " 4\n", - " Barcelona - Eixample\n", - " Good\n", - " Good\n", - " 35.0\n", - " 01/11/2018 1:00\n", - " 1\n", + " 3.0\n", + " 44.0\n", + " 16.81\n", " \n", " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", + " 5\n", + " 2.0\n", + " 44.0\n", + " 16.88\n", " \n", " \n", - " 3642\n", - " Barcelona - Gràcia\n", - " Good\n", - " Good\n", - " 22.0\n", - " 30/11/2018 23:00\n", - " 22\n", + " 6\n", + " 2.0\n", + " 44.0\n", + " 16.59\n", " \n", " \n", - " 3643\n", - " Barcelona - Vall Hebron\n", - " Good\n", - " Good\n", - " 21.0\n", - " 30/11/2018 23:00\n", - " 22\n", + " 7\n", + " 2.0\n", + " 43.0\n", + " 16.66\n", " \n", " \n", - " 3644\n", - " Barcelona - Palau Reial\n", - " Good\n", - " Good\n", - " 15.0\n", - " 30/11/2018 23:00\n", - " 22\n", + " 8\n", + " 2.0\n", + " 42.0\n", + " 16.46\n", " \n", " \n", - " 3645\n", - " Barcelona - Poblenou\n", - " Good\n", - " Good\n", - " 25.0\n", - " 30/11/2018 23:00\n", - " 22\n", + " 9\n", + " 3.0\n", + " 40.0\n", + " 16.58\n", " \n", " \n", - " 3646\n", - " Barcelona - Observ Fabra\n", - " Good\n", - " Good\n", - " 12.0\n", - " 30/11/2018 23:00\n", - " 22\n", + " 10\n", + " 2.0\n", + " 38.0\n", + " 16.29\n", + " \n", + " \n", + " 11\n", + " 3.0\n", + " 39.0\n", + " 16.42\n", " \n", " \n", "\n", - "

3647 rows × 6 columns

\n", "" ], "text/plain": [ - " Station Air Quality PM10 Quality PM10 Value \\\n", - "0 Barcelona - Eixample Moderate Good 36.0 \n", - "1 Barcelona - Palau Reial Good Good 23.0 \n", - "2 Barcelona - Poblenou Good Good 32.0 \n", - "3 Barcelona - Observ Fabra Good Good 25.0 \n", - "4 Barcelona - Eixample Good Good 35.0 \n", - "... ... ... ... ... \n", - "3642 Barcelona - Gràcia Good Good 22.0 \n", - "3643 Barcelona - Vall Hebron Good Good 21.0 \n", - "3644 Barcelona - Palau Reial Good Good 15.0 \n", - "3645 Barcelona - Poblenou Good Good 25.0 \n", - "3646 Barcelona - Observ Fabra Good Good 12.0 \n", - "\n", - " Generated Time (h) \n", - "0 01/11/2018 0:00 0 \n", - "1 01/11/2018 0:00 23 \n", - "2 01/11/2018 0:00 23 \n", - "3 01/11/2018 0:00 23 \n", - "4 01/11/2018 1:00 1 \n", - "... ... ... \n", - "3642 30/11/2018 23:00 22 \n", - "3643 30/11/2018 23:00 22 \n", - "3644 30/11/2018 23:00 22 \n", - "3645 30/11/2018 23:00 22 \n", - "3646 30/11/2018 23:00 22 \n", - "\n", - "[3647 rows x 6 columns]" + " min max mean\n", + "Time (h) \n", + "0 2.0 42.0 16.07\n", + "1 3.0 43.0 17.23\n", + "2 2.0 39.0 16.34\n", + "3 2.0 44.0 17.23\n", + "4 3.0 44.0 16.81\n", + "5 2.0 44.0 16.88\n", + "6 2.0 44.0 16.59\n", + "7 2.0 43.0 16.66\n", + "8 2.0 42.0 16.46\n", + "9 3.0 40.0 16.58\n", + "10 2.0 38.0 16.29\n", + "11 3.0 39.0 16.42" ] }, - "execution_count": 228, + "execution_count": 290, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "#Removing \"h\" from PM10 Hour column elements in a new column\n", + "# Analyzing how it changes throughout the day\n", "\n", - "pm2['time'] = list(map(lambda x: int(re.findall(r\"\\d+\",x)[0]),pm2['PM10 Hour']))\n", - "pm2.rename(columns={'time':'Time (h)'},inplace=True)\n", - "pm2.drop(columns=['PM10 Hour'],inplace=True)\n", - "pm2" + "roun = lambda x: np.round(np.mean(x),decimals=2)\n", + "hourly = pm2.groupby('Time (h)')['PM10 Value'].agg(['min','max','mean']).round(2).sort_values('Time (h)')\n", + "hourly_df1 = hourly.iloc[:12,:]\n", + "hourly_df2 = hourly.iloc[12:,:]" ] }, { "cell_type": "code", - "execution_count": 229, - "id": "laden-attraction", + "execution_count": 291, + "id": "sticky-popularity", "metadata": { "ExecuteTime": { - "end_time": "2021-04-01T13:49:09.614329Z", - "start_time": "2021-04-01T13:49:09.565306Z" - }, - "scrolled": true + "end_time": "2021-04-01T16:10:22.045671Z", + "start_time": "2021-04-01T16:10:21.994665Z" + } }, "outputs": [ { @@ -954,10 +947,162 @@ " 16.81\n", " \n", " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", + " 5\n", + " 2.0\n", + " 44.0\n", + " 16.88\n", + " \n", + " \n", + " 6\n", + " 2.0\n", + " 44.0\n", + " 16.59\n", + " \n", + " \n", + " 7\n", + " 2.0\n", + " 43.0\n", + " 16.66\n", + " \n", + " \n", + " 8\n", + " 2.0\n", + " 42.0\n", + " 16.46\n", + " \n", + " \n", + " 9\n", + " 3.0\n", + " 40.0\n", + " 16.58\n", + " \n", + " \n", + " 10\n", + " 2.0\n", + " 38.0\n", + " 16.29\n", + " \n", + " \n", + " 11\n", + " 3.0\n", + " 39.0\n", + " 16.42\n", + " \n", + " \n", + "\n", + "" + ], + "text/plain": [ + " min max mean\n", + "Time (h) \n", + "0 2.0 42.0 16.07\n", + "1 3.0 43.0 17.23\n", + "2 2.0 39.0 16.34\n", + "3 2.0 44.0 17.23\n", + "4 3.0 44.0 16.81\n", + "5 2.0 44.0 16.88\n", + "6 2.0 44.0 16.59\n", + "7 2.0 43.0 16.66\n", + "8 2.0 42.0 16.46\n", + "9 3.0 40.0 16.58\n", + "10 2.0 38.0 16.29\n", + "11 3.0 39.0 16.42" + ] + }, + "execution_count": 291, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "hourly_df1" + ] + }, + { + "cell_type": "code", + "execution_count": 289, + "id": "bridal-realtor", + "metadata": { + "ExecuteTime": { + "end_time": "2021-04-01T16:08:36.558117Z", + "start_time": "2021-04-01T16:08:36.514976Z" + } + }, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -991,43 +1136,38 @@ " \n", " \n", "
minmaxmean
Time (h)
123.041.016.34
133.042.016.93
143.042.016.55
152.043.016.53
162.043.016.51
172.042.016.01
182.041.016.81
19
\n", - "

24 rows × 3 columns

\n", "
" ], "text/plain": [ " min max mean\n", "Time (h) \n", - "0 2.0 42.0 16.07\n", - "1 3.0 43.0 17.23\n", - "2 2.0 39.0 16.34\n", - "3 2.0 44.0 17.23\n", - "4 3.0 44.0 16.81\n", - "... ... ... ...\n", + "12 3.0 41.0 16.34\n", + "13 3.0 42.0 16.93\n", + "14 3.0 42.0 16.55\n", + "15 2.0 43.0 16.53\n", + "16 2.0 43.0 16.51\n", + "17 2.0 42.0 16.01\n", + "18 2.0 41.0 16.81\n", "19 3.0 41.0 16.73\n", "20 2.0 41.0 16.51\n", "21 2.0 41.0 16.40\n", "22 3.0 42.0 16.58\n", - "23 2.0 41.0 16.70\n", - "\n", - "[24 rows x 3 columns]" + "23 2.0 41.0 16.70" ] }, - "execution_count": 229, + "execution_count": 289, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Analyzing how it changes throughout the day\n", - "\n", - "roun = lambda x: np.round(np.mean(x),decimals=2)\n", - "pm2.groupby('Time (h)')['PM10 Value'].agg(['min','max','mean']).round(2).sort_values('Time (h)')" + "hourly_df2" ] }, { "cell_type": "code", "execution_count": 230, - "id": "sought-bouquet", + "id": "civil-valuation", "metadata": { "ExecuteTime": { "end_time": "2021-04-01T13:49:11.691227Z", @@ -1133,25 +1273,25 @@ }, { "cell_type": "code", - "execution_count": 231, - "id": "secondary-winner", + "execution_count": 298, + "id": "small-pledge", "metadata": { "ExecuteTime": { - "end_time": "2021-04-01T13:49:13.625830Z", - "start_time": "2021-04-01T13:49:13.600203Z" + "end_time": "2021-04-01T16:32:33.030744Z", + "start_time": "2021-04-01T16:32:32.970748Z" } }, "outputs": [], "source": [ "# to see full table\n", "\n", - "pd.set_option('display.max_rows', 10)" + "pd.set_option('display.max_rows', 50)" ] }, { "cell_type": "code", "execution_count": 232, - "id": "senior-rotation", + "id": "soviet-salon", "metadata": { "ExecuteTime": { "end_time": "2021-04-01T13:49:18.004853Z", @@ -1300,7 +1440,7 @@ { "cell_type": "code", "execution_count": 233, - "id": "political-victoria", + "id": "sorted-profit", "metadata": { "ExecuteTime": { "end_time": "2021-04-01T13:49:34.668276Z", @@ -1485,7 +1625,7 @@ { "cell_type": "code", "execution_count": 241, - "id": "falling-college", + "id": "spoken-saint", "metadata": { "ExecuteTime": { "end_time": "2021-04-01T14:06:54.219391Z", @@ -1678,7 +1818,7 @@ { "cell_type": "code", "execution_count": 252, - "id": "spiritual-identity", + "id": "assured-decline", "metadata": { "ExecuteTime": { "end_time": "2021-04-01T14:12:33.048829Z", @@ -1702,7 +1842,7 @@ { "cell_type": "code", "execution_count": 262, - "id": "interim-morgan", + "id": "martial-gasoline", "metadata": { "ExecuteTime": { "end_time": "2021-04-01T14:16:13.508968Z", @@ -1799,12 +1939,12 @@ }, { "cell_type": "code", - "execution_count": 264, - "id": "interracial-throw", + "execution_count": 272, + "id": "least-level", "metadata": { "ExecuteTime": { - "end_time": "2021-04-01T14:25:12.716014Z", - "start_time": "2021-04-01T14:25:12.604722Z" + "end_time": "2021-04-01T15:36:21.367550Z", + "start_time": "2021-04-01T15:36:21.193651Z" } }, "outputs": [ @@ -1972,7 +2112,7 @@ "[762 rows x 6 columns]" ] }, - "execution_count": 264, + "execution_count": 272, "metadata": {}, "output_type": "execute_result" } @@ -1983,18 +2123,18 @@ "week_2 = pm2[pm2['Generated'].str.contains('08/11/2018|09/11/2018|10/11/2018|11/11/2018|12/11/2018|13/11/2018|14/11/2018')]\n", "week_3 = pm2[pm2['Generated'].str.contains('15/11/2018|16/11/2018|17/11/2018|18/11/2018|19/11/2018|20/11/2018|21/11/2018')]\n", "week_4 = pm2[pm2['Generated'].str.contains('22/11/2018|23/11/2018|24/11/2018|25/11/2018|26/11/2018|27/11/2018|28/11/2018')]\n", - "week_5 = pm2[pm2['Generated'].str.contains('29/11/2018|30/11/2018')]\n", + "#week_5 = pm2[pm2['Generated'].str.contains('29/11/2018|30/11/2018')]\n", "week_1" ] }, { "cell_type": "code", - "execution_count": 270, - "id": "confident-reach", + "execution_count": 273, + "id": "varying-suspect", "metadata": { "ExecuteTime": { - "end_time": "2021-04-01T14:37:38.529607Z", - "start_time": "2021-04-01T14:37:38.497782Z" + "end_time": "2021-04-01T15:36:23.459737Z", + "start_time": "2021-04-01T15:36:23.429539Z" } }, "outputs": [], @@ -2005,17 +2145,17 @@ "w2_mean = week_2['PM10 Value'].mean()\n", "w3_mean = week_3['PM10 Value'].mean()\n", "w4_mean = week_4['PM10 Value'].mean()\n", - "w5_mean = week_5['PM10 Value'].mean()" + "#w5_mean = week_5['PM10 Value'].mean()" ] }, { "cell_type": "code", - "execution_count": 271, - "id": "vocal-convenience", + "execution_count": 274, + "id": "ecological-crowd", "metadata": { "ExecuteTime": { - "end_time": "2021-04-01T14:37:39.741788Z", - "start_time": "2021-04-01T14:37:39.690765Z" + "end_time": "2021-04-01T15:36:24.965200Z", + "start_time": "2021-04-01T15:36:24.920692Z" } }, "outputs": [ @@ -2064,10 +2204,6 @@ " Week 4\n", " 13.561404\n", " \n", - " \n", - " Week 5\n", - " 24.357639\n", - " \n", " \n", "\n", "" @@ -2078,18 +2214,17 @@ "Week 1 13.481627\n", "Week 2 19.594096\n", "Week 3 17.355828\n", - "Week 4 13.561404\n", - "Week 5 24.357639" + "Week 4 13.561404" ] }, - "execution_count": 271, + "execution_count": 274, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# creating DataFrame for weeks\n", - "weeks = [['Week 1', w1_mean], ['Week 2', w2_mean], ['Week 3', w3_mean], ['Week 4', w4_mean], ['Week 5', w5_mean]]\n", + "weeks = [['Week 1', w1_mean], ['Week 2', w2_mean], ['Week 3', w3_mean], ['Week 4', w4_mean]] #['Week 5', w5_mean]]\n", "\n", "weeksdf = pd.DataFrame(weeks,columns=['Weeks','PM10 Mean']).set_index('Weeks')\n", "weeksdf" From 3e8297afbc149dd8fdb7df98c6967e52fab9581c Mon Sep 17 00:00:00 2001 From: lisasaundersgit Date: Thu, 1 Apr 2021 19:14:46 +0200 Subject: [PATCH 10/18] final code update --- ...rQuality-Lisa.ipynb => NO2_analysis.ipynb} | 878 ++++++++++++------ 1 file changed, 583 insertions(+), 295 deletions(-) rename your-project/{AirQuality-Lisa.ipynb => NO2_analysis.ipynb} (64%) diff --git a/your-project/AirQuality-Lisa.ipynb b/your-project/NO2_analysis.ipynb similarity index 64% rename from your-project/AirQuality-Lisa.ipynb rename to your-project/NO2_analysis.ipynb index f6d18cc..1cfdd3d 100644 --- a/your-project/AirQuality-Lisa.ipynb +++ b/your-project/NO2_analysis.ipynb @@ -7,9 +7,16 @@ "# NO2 Pollution Barcelona" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Air Quality info: https://www.airnow.gov/sites/default/files/2018-06/no2.pdf" + ] + }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -126,33 +133,30 @@ "2 NaN 01/11/2018 0:00 1541027104 " ] }, - "execution_count": 4, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Importing packages and data\n", + "\n", "import pandas as pd\n", + "import re\n", "\n", "df = pd.read_csv('../datasets/2.-Urban-Environment/air-quality-nov-2017.csv')\n", "\n", - "data.head(3)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Air Quality info: https://www.airnow.gov/sites/default/files/2018-06/no2.pdf" + "df.head(3)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "#creating no2 df and renaming columns\n", + "\n", "df_no2 = df[['Station', 'Air Quality', 'Longitude', 'Latitude', 'NO2 Hour', 'NO2 Quality', 'NO2 Value', 'Generated', 'Date Time']].copy()\n", "df_no2.columns = ['station', 'air_quality', 'longitude', 'latitude', 'no2_hour', 'no2_quality', 'no2_value', 'generated', 'date_time']" ] @@ -166,7 +170,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -267,7 +271,7 @@ "Barcelona - Vall Hebron 6.0 91.0 30.812940" ] }, - "execution_count": 87, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -285,7 +289,7 @@ }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -294,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -318,9 +322,9 @@ " \n", " \n", " \n", - " no2_hour\n", - " no2_quality\n", - " no2_value\n", + " NO2 Time\n", + " NO2 Quality\n", + " NO2 Value\n", " \n", " \n", " station\n", @@ -395,7 +399,7 @@ "" ], "text/plain": [ - " no2_hour no2_quality no2_value\n", + " NO2 Time NO2 Quality NO2 Value\n", "station \n", "Barcelona - Gràcia 10h Moderate 117.0\n", "Barcelona - Gràcia 9h Moderate 116.0\n", @@ -409,14 +413,16 @@ "Barcelona - Poblenou 20h Moderate 105.0" ] }, - "execution_count": 78, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_no2_short.set_index('station', inplace=True)\n", - "df_no2_short.nlargest(columns='no2_value', n = 10)" + "largest = df_no2_short.nlargest(columns='no2_value', n = 10)\n", + "largest.columns = ['NO2 Time', 'NO2 Quality', 'NO2 Value']\n", + "largest" ] }, { @@ -428,7 +434,218 @@ }, { "cell_type": "code", - "execution_count": 86, + "execution_count": 8, + "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", + " \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", + "
stationair_qualitylongitudelatitudeno2_hourno2_qualityno2_valuegenerateddate_time
0Barcelona - SantsGood2.133141.37880hGood84.001/11/2018 0:001541027104
1Barcelona - EixampleModerate2.153841.38530hModerate113.001/11/2018 0:001541027104
2Barcelona - GràciaGood2.153441.39870hGood73.001/11/2018 0:001541027104
\n", + "
" + ], + "text/plain": [ + " station air_quality longitude latitude no2_hour no2_quality \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 0h Good \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 0h Moderate \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 0h Good \n", + "\n", + " no2_value generated date_time \n", + "0 84.0 01/11/2018 0:00 1541027104 \n", + "1 113.0 01/11/2018 0:00 1541027104 \n", + "2 73.0 01/11/2018 0:00 1541027104 " + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Dropping missing values\n", + "\n", + "nantodrop = df_no2[df_no2['no2_value'].isna() == True].index.tolist()\n", + "df_no2 = df_no2.drop(nantodrop)\n", + "df_no2.reset_index(drop=True,inplace=True)\n", + "\n", + "df_no2.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stationair_qualitylongitudelatitudeno2_qualityno2_valuegenerateddate_timeTime
0Barcelona - SantsGood2.133141.3788Good84.001/11/2018 0:0015410271040
1Barcelona - EixampleModerate2.153841.3853Moderate113.001/11/2018 0:0015410271040
2Barcelona - GràciaGood2.153441.3987Good73.001/11/2018 0:0015410271040
\n", + "
" + ], + "text/plain": [ + " station air_quality longitude latitude no2_quality \\\n", + "0 Barcelona - Sants Good 2.1331 41.3788 Good \n", + "1 Barcelona - Eixample Moderate 2.1538 41.3853 Moderate \n", + "2 Barcelona - Gràcia Good 2.1534 41.3987 Good \n", + "\n", + " no2_value generated date_time Time \n", + "0 84.0 01/11/2018 0:00 1541027104 0 \n", + "1 113.0 01/11/2018 0:00 1541027104 0 \n", + "2 73.0 01/11/2018 0:00 1541027104 0 " + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Removing \"h\" from Hour column elements in a new column\n", + "\n", + "df_no2['time'] = list(map(lambda x: int(re.findall(r\"\\d+\",x)[0]),df_no2['no2_hour']))\n", + "df_no2.rename(columns={'time':'Time'},inplace=True)\n", + "df_no2.drop(columns=['no2_hour'],inplace=True)\n", + "df_no2.head(3)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -457,7 +674,7 @@ " mean\n", " \n", " \n", - " no2_hour\n", + " Time\n", " \n", " \n", " \n", @@ -465,195 +682,341 @@ " \n", " \n", " \n", - " 0h\n", + " 0\n", " 2.0\n", " 113.0\n", " 42.854890\n", " \n", " \n", - " 10h\n", + " 1\n", + " 2.0\n", + " 96.0\n", + " 35.714286\n", + " \n", + " \n", + " 2\n", + " 2.0\n", + " 86.0\n", + " 30.235808\n", + " \n", + " \n", + " 3\n", + " 1.0\n", + " 77.0\n", + " 26.772926\n", + " \n", + " \n", + " 4\n", + " 1.0\n", + " 65.0\n", + " 24.644444\n", + " \n", + " \n", + " 5\n", + " 1.0\n", + " 67.0\n", + " 23.298701\n", + " \n", + " \n", + " 6\n", + " 1.0\n", + " 64.0\n", + " 24.314894\n", + " \n", + " \n", + " 7\n", + " 1.0\n", + " 80.0\n", + " 30.372294\n", + " \n", + " \n", + " 8\n", + " 1.0\n", + " 103.0\n", + " 40.004237\n", + " \n", + " \n", + " 9\n", + " 1.0\n", + " 116.0\n", + " 46.268908\n", + " \n", + " \n", + " 10\n", " 1.0\n", " 117.0\n", " 43.719665\n", " \n", " \n", - " 11h\n", + " 11\n", " 1.0\n", " 109.0\n", " 38.466667\n", " \n", " \n", - " 12h\n", + " 12\n", " 2.0\n", " 80.0\n", " 30.612335\n", " \n", " \n", - " 13h\n", + " 13\n", " 1.0\n", " 83.0\n", " 27.261411\n", " \n", " \n", - " 14h\n", + " 14\n", " 2.0\n", " 71.0\n", " 28.053398\n", " \n", " \n", - " 15h\n", + " 15\n", " 2.0\n", " 88.0\n", " 28.342723\n", " \n", " \n", - " 16h\n", + " 16\n", " 3.0\n", " 84.0\n", " 28.910714\n", " \n", " \n", - " 17h\n", + " 17\n", " 3.0\n", " 80.0\n", " 32.728111\n", " \n", " \n", - " 18h\n", + " 18\n", " 6.0\n", " 89.0\n", " 42.253219\n", " \n", " \n", - " 19h\n", + " 19\n", " 6.0\n", " 101.0\n", " 49.320000\n", " \n", " \n", - " 1h\n", - " 2.0\n", - " 96.0\n", - " 35.714286\n", - " \n", - " \n", - " 20h\n", + " 20\n", " 4.0\n", " 105.0\n", " 50.504505\n", " \n", " \n", - " 21h\n", + " 21\n", " 4.0\n", " 97.0\n", " 48.506726\n", " \n", " \n", - " 22h\n", + " 22\n", " 3.0\n", " 97.0\n", " 44.532967\n", " \n", " \n", - " 23h\n", + " 23\n", " 3.0\n", " 88.0\n", " 39.039735\n", " \n", + " \n", + "\n", + "" + ], + "text/plain": [ + " min max mean\n", + "Time \n", + "0 2.0 113.0 42.854890\n", + "1 2.0 96.0 35.714286\n", + "2 2.0 86.0 30.235808\n", + "3 1.0 77.0 26.772926\n", + "4 1.0 65.0 24.644444\n", + "5 1.0 67.0 23.298701\n", + "6 1.0 64.0 24.314894\n", + "7 1.0 80.0 30.372294\n", + "8 1.0 103.0 40.004237\n", + "9 1.0 116.0 46.268908\n", + "10 1.0 117.0 43.719665\n", + "11 1.0 109.0 38.466667\n", + "12 2.0 80.0 30.612335\n", + "13 1.0 83.0 27.261411\n", + "14 2.0 71.0 28.053398\n", + "15 2.0 88.0 28.342723\n", + "16 3.0 84.0 28.910714\n", + "17 3.0 80.0 32.728111\n", + "18 6.0 89.0 42.253219\n", + "19 6.0 101.0 49.320000\n", + "20 4.0 105.0 50.504505\n", + "21 4.0 97.0 48.506726\n", + "22 3.0 97.0 44.532967\n", + "23 3.0 88.0 39.039735" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#Getting Hourly Data\n", + "\n", + "hourly = df_no2.groupby('Time').no2_value.agg(['min', 'max', 'mean'])\n", + "hourly" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "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", + " \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", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
minmaxmean
Time
2h02.0113.042.854890
12.096.035.714286
22.086.030.235808
3h31.077.026.772926
4h41.065.024.644444
5h51.067.023.298701
6h61.064.024.314894
7h71.080.030.372294
8h81.0103.040.004237
9h91.0116.046.268908
101.0117.043.719665
111.0109.038.466667
\n", "
" ], "text/plain": [ - " min max mean\n", - "no2_hour \n", - "0h 2.0 113.0 42.854890\n", - "10h 1.0 117.0 43.719665\n", - "11h 1.0 109.0 38.466667\n", - "12h 2.0 80.0 30.612335\n", - "13h 1.0 83.0 27.261411\n", - "14h 2.0 71.0 28.053398\n", - "15h 2.0 88.0 28.342723\n", - "16h 3.0 84.0 28.910714\n", - "17h 3.0 80.0 32.728111\n", - "18h 6.0 89.0 42.253219\n", - "19h 6.0 101.0 49.320000\n", - "1h 2.0 96.0 35.714286\n", - "20h 4.0 105.0 50.504505\n", - "21h 4.0 97.0 48.506726\n", - "22h 3.0 97.0 44.532967\n", - "23h 3.0 88.0 39.039735\n", - "2h 2.0 86.0 30.235808\n", - "3h 1.0 77.0 26.772926\n", - "4h 1.0 65.0 24.644444\n", - "5h 1.0 67.0 23.298701\n", - "6h 1.0 64.0 24.314894\n", - "7h 1.0 80.0 30.372294\n", - "8h 1.0 103.0 40.004237\n", - "9h 1.0 116.0 46.268908" + " min max mean\n", + "Time \n", + "0 2.0 113.0 42.854890\n", + "1 2.0 96.0 35.714286\n", + "2 2.0 86.0 30.235808\n", + "3 1.0 77.0 26.772926\n", + "4 1.0 65.0 24.644444\n", + "5 1.0 67.0 23.298701\n", + "6 1.0 64.0 24.314894\n", + "7 1.0 80.0 30.372294\n", + "8 1.0 103.0 40.004237\n", + "9 1.0 116.0 46.268908\n", + "10 1.0 117.0 43.719665\n", + "11 1.0 109.0 38.466667" ] }, - "execution_count": 86, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "hourly = df_no2.groupby('no2_hour').no2_value.agg(['min', 'max', 'mean'])\n", - "hourly" + "# Splitting Dataframe\n", + "\n", + "hourly_df1 = hourly.iloc[:12,:]\n", + "hourly_df2 = hourly.iloc[12:,:]\n", + "hourly_df1" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -676,70 +1039,59 @@ "\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", " \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", + " \n", " \n", " \n", " \n", @@ -748,22 +1100,22 @@ " \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", @@ -772,65 +1124,48 @@ " \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", "
no2_hour0h10h11h12h13h14h15h16h17h18hTime0123456789...22h23h2h3h4h5h6h7h8h9h14151617181920212223
min2.000002.0000002.0000001.0000001.0000001.0000001.0000001.0000002.0000001.0000001.000000...2.0000002.0000003.0000003.0000006.000000...6.004.0000004.0000003.0000003.0000002.0000001.0000001.0000001.0000001.0000001.0000001.0000001.000000
max113.00000117.000000109.00000080.00000083.00000071.00000088.00000084.00000080.00000089.000000...97.00000088.00000096.00000086.00000077.00000065.00000080.000000103.000000116.000000...71.00000088.00000084.00000080.00000089.000000101.00105.00000097.00000097.00000088.000000
mean42.8548943.71966538.46666730.61233527.26141128.05339828.34272328.91071432.72811142.253219...44.53296739.03973535.71428630.23580826.77292624.64444430.37229440.00423746.268908
median42.0000045.00000035.00000026.00000022.00000023.50000023.00000024.50000029.00000040.000000...45.50000038.00000026.00000023.00000021.00000019.00000021.00000027.00000042.00000049.00000028.05339828.34272328.91071432.72811142.25321949.3250.50450548.50672644.53296739.039735
\n", - "

4 rows × 24 columns

\n", + "

3 rows × 24 columns

\n", "" ], "text/plain": [ - "no2_hour 0h 10h 11h 12h 13h 14h \\\n", - "min 2.00000 1.000000 1.000000 2.000000 1.000000 2.000000 \n", - "max 113.00000 117.000000 109.000000 80.000000 83.000000 71.000000 \n", - "mean 42.85489 43.719665 38.466667 30.612335 27.261411 28.053398 \n", - "median 42.00000 45.000000 35.000000 26.000000 22.000000 23.500000 \n", + "Time 0 1 2 3 4 5 \\\n", + "min 2.00000 2.000000 2.000000 1.000000 1.000000 1.000000 \n", + "max 113.00000 96.000000 86.000000 77.000000 65.000000 67.000000 \n", + "mean 42.85489 35.714286 30.235808 26.772926 24.644444 23.298701 \n", "\n", - "no2_hour 15h 16h 17h 18h ... 22h \\\n", - "min 2.000000 3.000000 3.000000 6.000000 ... 3.000000 \n", - "max 88.000000 84.000000 80.000000 89.000000 ... 97.000000 \n", - "mean 28.342723 28.910714 32.728111 42.253219 ... 44.532967 \n", - "median 23.000000 24.500000 29.000000 40.000000 ... 45.500000 \n", + "Time 6 7 8 9 ... 14 15 \\\n", + "min 1.000000 1.000000 1.000000 1.000000 ... 2.000000 2.000000 \n", + "max 64.000000 80.000000 103.000000 116.000000 ... 71.000000 88.000000 \n", + "mean 24.314894 30.372294 40.004237 46.268908 ... 28.053398 28.342723 \n", "\n", - "no2_hour 23h 2h 3h 4h 5h 6h \\\n", - "min 3.000000 2.000000 1.000000 1.000000 1.000000 1.000000 \n", - "max 88.000000 86.000000 77.000000 65.000000 67.000000 64.000000 \n", - "mean 39.039735 30.235808 26.772926 24.644444 23.298701 24.314894 \n", - "median 38.000000 26.000000 23.000000 21.000000 19.000000 21.000000 \n", + "Time 16 17 18 19 20 21 \\\n", + "min 3.000000 3.000000 6.000000 6.00 4.000000 4.000000 \n", + "max 84.000000 80.000000 89.000000 101.00 105.000000 97.000000 \n", + "mean 28.910714 32.728111 42.253219 49.32 50.504505 48.506726 \n", "\n", - "no2_hour 7h 8h 9h \n", - "min 1.000000 1.000000 1.000000 \n", - "max 80.000000 103.000000 116.000000 \n", - "mean 30.372294 40.004237 46.268908 \n", - "median 27.000000 42.000000 49.000000 \n", + "Time 22 23 \n", + "min 3.000000 3.000000 \n", + "max 97.000000 88.000000 \n", + "mean 44.532967 39.039735 \n", "\n", - "[4 rows x 24 columns]" + "[3 rows x 24 columns]" ] }, - "execution_count": 14, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -983,24 +1318,6 @@ "df_sun.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" ] }, - { - "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [], - "source": [ - "#df_week = pd.concat([df_mon, df_tue, df_wed, df_thu, df_fr, df_sa, df_sun], axis=0).reset_index(drop=True)" - ] - }, - { - "cell_type": "code", - "execution_count": 34, - "metadata": {}, - "outputs": [], - "source": [ - "#df_week.groupby('station').no2_value.agg(['min', 'max', 'mean', 'median'])" - ] - }, { "cell_type": "code", "execution_count": 32, @@ -1018,17 +1335,17 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 109, "metadata": {}, "outputs": [], "source": [ "weekdays_list = [['Monday', mon_mean], ['Tuesday', tue_mean], ['Wednesday', wed_mean], ['Thursday', thu_mean], ['Friday', fr_mean], ['Saturday', sa_mean], ['Sunday', sun_mean]] \n", - "weekdays = pd.DataFrame(weekdays_list, columns = ['Weekday', 'Mean'])" + "weekdays = pd.DataFrame(weekdays_list, columns = ['Weekday', 'NO2 Value Mean'])" ] }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 110, "metadata": {}, "outputs": [], "source": [ @@ -1037,7 +1354,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 111, "metadata": {}, "outputs": [ { @@ -1061,7 +1378,7 @@ " \n", " \n", " \n", - " Mean\n", + " NO2 Value Mean\n", " \n", " \n", " Weekday\n", @@ -1102,18 +1419,18 @@ "" ], "text/plain": [ - " Mean\n", - "Weekday \n", - "Monday 29.031335\n", - "Tuesday 31.291951\n", - "Wednesday 38.773427\n", - "Thursday 45.619699\n", - "Friday 44.128767\n", - "Saturday 29.661664\n", - "Sunday 25.686731" + " NO2 Value Mean\n", + "Weekday \n", + "Monday 29.031335\n", + "Tuesday 31.291951\n", + "Wednesday 38.773427\n", + "Thursday 45.619699\n", + "Friday 44.128767\n", + "Saturday 29.661664\n", + "Sunday 25.686731" ] }, - "execution_count": 62, + "execution_count": 111, "metadata": {}, "output_type": "execute_result" } @@ -1124,7 +1441,34 @@ }, { "cell_type": "code", - "execution_count": 83, + "execution_count": 95, + "metadata": {}, + "outputs": [], + "source": [ + "#Separate into one dataframe per week\n", + "week_1 = df_no2[df_no2['generated'].str.contains('01/11/2018|02/11/2018|03/11/2018|04/11/2018|05/11/2018|06/11/2018|07/11/2018')]\n", + "week_2 = df_no2[df_no2['generated'].str.contains('08/11/2018|09/11/2018|10/11/2018|11/11/2018|12/11/2018|13/11/2018|14/11/2018')]\n", + "week_3 = df_no2[df_no2['generated'].str.contains('15/11/2018|16/11/2018|17/11/2018|18/11/2018|19/11/2018|20/11/2018|21/11/2018')]\n", + "week_4 = df_no2[df_no2['generated'].str.contains('22/11/2018|23/11/2018|24/11/2018|25/11/2018|26/11/2018|27/11/2018|28/11/2018')]\n", + "week_5 = df_no2[df_no2['generated'].str.contains('29/11/2018|30/11/2018')]" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [], + "source": [ + "w1_mean = week_1['no2_value'].mean()\n", + "w2_mean = week_2['no2_value'].mean()\n", + "w3_mean = week_3['no2_value'].mean()\n", + "w4_mean = week_4['no2_value'].mean()\n", + "w5_mean = week_5['no2_value'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 100, "metadata": {}, "outputs": [ { @@ -1148,110 +1492,54 @@ " \n", " \n", " \n", - " no2_hour\n", - " no2_value\n", + " NO2 Value\n", " \n", " \n", - " station\n", - " \n", + " Weeks\n", " \n", " \n", " \n", " \n", " \n", - " Barcelona - Sants\n", - " 0h\n", - " 84.0\n", + " Week 1\n", + " 34.013503\n", " \n", " \n", - " Barcelona - Eixample\n", - " 0h\n", - " 113.0\n", - " \n", - " \n", - " Barcelona - Gràcia\n", - " 0h\n", - " 73.0\n", + " Week 2\n", + " 35.436096\n", " \n", " \n", - " Barcelona - Ciutadella\n", - " 0h\n", - " 86.0\n", + " Week 3\n", + " 32.219124\n", " \n", " \n", - " Barcelona - Vall Hebron\n", - " 0h\n", - " 69.0\n", - " \n", - " \n", - " ...\n", - " ...\n", - " ...\n", - " \n", - " \n", - " Barcelona - Ciutadella\n", - " 22h\n", - " 57.0\n", - " \n", - " \n", - " Barcelona - Vall Hebron\n", - " 22h\n", - " 31.0\n", - " \n", - " \n", - " Barcelona - Palau Reial\n", - " 22h\n", - " 20.0\n", - " \n", - " \n", - " Barcelona - Poblenou\n", - " 22h\n", - " 70.0\n", - " \n", - " \n", - " Barcelona - Observ Fabra\n", - " 22h\n", - " 21.0\n", + " Week 4\n", + " 36.809077\n", " \n", " \n", "\n", - "

5744 rows × 2 columns

\n", "" ], "text/plain": [ - " no2_hour no2_value\n", - "station \n", - "Barcelona - Sants 0h 84.0\n", - "Barcelona - Eixample 0h 113.0\n", - "Barcelona - Gràcia 0h 73.0\n", - "Barcelona - Ciutadella 0h 86.0\n", - "Barcelona - Vall Hebron 0h 69.0\n", - "... ... ...\n", - "Barcelona - Ciutadella 22h 57.0\n", - "Barcelona - Vall Hebron 22h 31.0\n", - "Barcelona - Palau Reial 22h 20.0\n", - "Barcelona - Poblenou 22h 70.0\n", - "Barcelona - Observ Fabra 22h 21.0\n", - "\n", - "[5744 rows x 2 columns]" + " NO2 Value\n", + "Weeks \n", + "Week 1 34.013503\n", + "Week 2 35.436096\n", + "Week 3 32.219124\n", + "Week 4 36.809077" ] }, - "execution_count": 83, + "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df_corr = df_no2_short[['no2_hour', 'no2_value']]" - ] - }, - { - "cell_type": "code", - "execution_count": 88, - "metadata": {}, - "outputs": [], - "source": [ - "#df_no2_short.groupby('no2_hour')[['no2_value']].corr()" + "# creating DataFrame for weeks\n", + "weeks = [['Week 1', w1_mean], ['Week 2', w2_mean], ['Week 3', w3_mean], ['Week 4', w4_mean]]\n", + "\n", + "weeksdf = pd.DataFrame(weeks,columns=['Weeks','NO2 Value']).set_index('Weeks')\n", + "weeksdf" ] } ], From 137f38e8cd3a136930725a4e6b7102a71c8fab98 Mon Sep 17 00:00:00 2001 From: lisasaundersgit Date: Thu, 1 Apr 2021 19:56:36 +0200 Subject: [PATCH 11/18] read me update --- your-project/README.md | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/your-project/README.md b/your-project/README.md index 0103b93..0d9943d 100644 --- a/your-project/README.md +++ b/your-project/README.md @@ -1,9 +1,9 @@ Ironhack Logo # Title of My Project -*[Your Name]* +Lisa Saunders, Tsvetelina Minkova & Ignacio Rus Prados +DAFT MAR2021 -*[Your Cohort, Campus & Date]* ## Content - [Project Description](#project-description) @@ -16,28 +16,26 @@ ## Project Description -Write a short introduction to your project: 3-5 sentences about the context of your topic and why you chose it. +Our project explores the Urban Environment Dataset for Barcelona, where we analyse patterns of three different pollutants: O3, NO2 and PM10. +The research shows pollution evolution over the day, week and month. It also offers an overview of the areas within Barcelona that are most affected. ## Questions & Hypotheses -What are the questions you would like to answer with your analysis? What did you feel were the answers to those questions before answering them with data? +When can we see the highest levels of pollution? +Which areas are most affected by pollution? +Are there significant changes of pollution levels during the day? during the week? ## Dataset -What dataset (or datasets) did you use? What is the source of your data? Provide links to the data if available and describe the data briefly. +We used the Urban Evironment Dataset for Barcelona, which offers hourly and daily pollution levels for O3, NO2 and PM10. -## Database -What is the structure of your database? Have you created more than one table and if yes, how are they related to each other? Include a drawing or computer-generated image of the ERD (Entity Relationship Diagram) of your database. ## Workflow -Outline the workflow you used in your project. What are the steps you went through? +Our first step was to plan our timeline. After deciding on our deadlines we divided the project and started a list of questions that could be interesting to explore with our dataset. ## Organization -How did you organize your work? Did you use any tools like a kanban board? - -What does your repository look like? Explain your folder and file structure. +We used a Kanban board to keep track of our tasks for the project. We summarized our necessary steps in this board and had regular check ins everyday. ## Links -Include links to your repository, slides and kanban board. Feel free to include any other links associated with your project. -[Repository](https://github.com/) -[Slides](https://slides.com/) -[Trello](https://trello.com/en) +[Repository](https://github.com/IgnacioRus/Project-Week-2-Barcelona.git) +[Slides](https://docs.google.com/presentation/d/1aIBM9A2m2_DH6Keqxy7CH0daNFuNeX912AQWhAiYBwI/edit?usp=sharing) +[Trello](https://trello.com/invite/b/wr2ikOtw/02a590d9a44ee4d42cac1bfcbf73bbf4/barcelone-urban-environment) From 3dbdad411235cd0504dc8fc508d98cf951b61715 Mon Sep 17 00:00:00 2001 From: lisasaundersgit Date: Thu, 1 Apr 2021 19:59:18 +0200 Subject: [PATCH 12/18] readme update 2 --- your-project/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/your-project/README.md b/your-project/README.md index 0d9943d..18b1e5e 100644 --- a/your-project/README.md +++ b/your-project/README.md @@ -21,7 +21,9 @@ The research shows pollution evolution over the day, week and month. It also off ## Questions & Hypotheses When can we see the highest levels of pollution? + Which areas are most affected by pollution? + Are there significant changes of pollution levels during the day? during the week? ## Dataset From c7808cdbc5d5aac8f55d5a05f1f99b3349229512 Mon Sep 17 00:00:00 2001 From: lisasaundersgit Date: Thu, 1 Apr 2021 20:00:06 +0200 Subject: [PATCH 13/18] readme update --- your-project/README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/your-project/README.md b/your-project/README.md index 18b1e5e..cd9dbe4 100644 --- a/your-project/README.md +++ b/your-project/README.md @@ -20,11 +20,9 @@ Our project explores the Urban Environment Dataset for Barcelona, where we analy The research shows pollution evolution over the day, week and month. It also offers an overview of the areas within Barcelona that are most affected. ## Questions & Hypotheses -When can we see the highest levels of pollution? - -Which areas are most affected by pollution? - -Are there significant changes of pollution levels during the day? during the week? +- When can we see the highest levels of pollution? +- Which areas are most affected by pollution? +- Are there significant changes of pollution levels during the day? during the week? ## Dataset We used the Urban Evironment Dataset for Barcelona, which offers hourly and daily pollution levels for O3, NO2 and PM10. From 4c85947a10e19b20a859a1e824a75ff20c6563eb Mon Sep 17 00:00:00 2001 From: lisasaundersgit Date: Thu, 1 Apr 2021 20:00:42 +0200 Subject: [PATCH 14/18] readme update --- your-project/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/your-project/README.md b/your-project/README.md index cd9dbe4..83b2efa 100644 --- a/your-project/README.md +++ b/your-project/README.md @@ -2,6 +2,7 @@ # Title of My Project Lisa Saunders, Tsvetelina Minkova & Ignacio Rus Prados + DAFT MAR2021 From bc3e2c34520f6932128c47f35f3d8d4f0b4210b2 Mon Sep 17 00:00:00 2001 From: Nacho Rus Date: Fri, 2 Apr 2021 09:20:15 +0200 Subject: [PATCH 15/18] Changing name --- green_vs_polluted_city_311751.jpg | Bin 95476 -> 0 bytes ...rQuality-Nacho.ipynb => PM10_analysis.ipynb} | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 green_vs_polluted_city_311751.jpg rename your-project/{AirQuality-Nacho.ipynb => PM10_analysis.ipynb} (100%) diff --git a/green_vs_polluted_city_311751.jpg b/green_vs_polluted_city_311751.jpg deleted file mode 100644 index a936f52e2d3ab82fe0460401267b838b1ddbd0f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95476 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 z 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 diff --git a/your-project/AirQuality-Nacho.ipynb b/your-project/PM10_analysis.ipynb similarity index 100% rename from your-project/AirQuality-Nacho.ipynb rename to your-project/PM10_analysis.ipynb From f6fd82a9c1e35f6beb5e3d2c929516dbc5cc33a4 Mon Sep 17 00:00:00 2001 From: Nacho Rus Date: Fri, 2 Apr 2021 09:23:07 +0200 Subject: [PATCH 16/18] More names --- your-project/{AirQuality.ipynb => AirQualityDataset.ipynb} | 0 your-project/{AirQuality-Tsvetelina.ipynb => O3_analysis.ipynb} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename your-project/{AirQuality.ipynb => AirQualityDataset.ipynb} (100%) rename your-project/{AirQuality-Tsvetelina.ipynb => O3_analysis.ipynb} (100%) diff --git a/your-project/AirQuality.ipynb b/your-project/AirQualityDataset.ipynb similarity index 100% rename from your-project/AirQuality.ipynb rename to your-project/AirQualityDataset.ipynb diff --git a/your-project/AirQuality-Tsvetelina.ipynb b/your-project/O3_analysis.ipynb similarity index 100% rename from your-project/AirQuality-Tsvetelina.ipynb rename to your-project/O3_analysis.ipynb From 4b4489661369d2b6857249d2d8185ef79745ca8a Mon Sep 17 00:00:00 2001 From: Nacho Rus Date: Fri, 2 Apr 2021 09:28:21 +0200 Subject: [PATCH 17/18] small changes to ReadMe --- your-project/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/your-project/README.md b/your-project/README.md index 83b2efa..8ba05e2 100644 --- a/your-project/README.md +++ b/your-project/README.md @@ -1,6 +1,6 @@ Ironhack Logo -# Title of My Project +# Air Quality in Barcelona Lisa Saunders, Tsvetelina Minkova & Ignacio Rus Prados DAFT MAR2021 @@ -23,14 +23,14 @@ The research shows pollution evolution over the day, week and month. It also off ## Questions & Hypotheses - When can we see the highest levels of pollution? - Which areas are most affected by pollution? -- Are there significant changes of pollution levels during the day? during the week? +- Are there significant changes of pollution levels during the day? And during the week? ## Dataset -We used the Urban Evironment Dataset for Barcelona, which offers hourly and daily pollution levels for O3, NO2 and PM10. +We used the Urban Evironment Dataset for Barcelona, which offers hourly and daily pollution levels for O3, NO2 and PM10. It covers one month of time (November, 2018) ## Workflow -Our first step was to plan our timeline. After deciding on our deadlines we divided the project and started a list of questions that could be interesting to explore with our dataset. +Our first step was to plan our timeline. After deciding on our deadlines we divided the project in tasks and investigated a series of questions that could be interesting to explore within our dataset. ## Organization We used a Kanban board to keep track of our tasks for the project. We summarized our necessary steps in this board and had regular check ins everyday. From 3e09959314da543ced0bcf9c845df3ba1f19838a Mon Sep 17 00:00:00 2001 From: Tsvetelina Minkova Date: Fri, 2 Apr 2021 09:58:34 +0200 Subject: [PATCH 18/18] uploading --- your-project/O3_analysis.ipynb | 2165 +++++++++++++++++++++++++++++++- 1 file changed, 2150 insertions(+), 15 deletions(-) diff --git a/your-project/O3_analysis.ipynb b/your-project/O3_analysis.ipynb index 9af8e26..1b975c3 100644 --- a/your-project/O3_analysis.ipynb +++ b/your-project/O3_analysis.ipynb @@ -2,8 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, - "id": "facial-portfolio", + "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2021-03-30T15:53:34.467216Z", @@ -65,7 +64,7 @@ " NaN\n", " NaN\n", " NaN\n", - " 01/11/2018 0:00\n", + " 1/11/2018 0:00\n", " 1541027104\n", " \n", " \n", @@ -83,7 +82,7 @@ " 0h\n", " Good\n", " 36.0\n", - " 01/11/2018 0:00\n", + " 1/11/2018 0:00\n", " 1541027104\n", " \n", " \n", @@ -101,7 +100,7 @@ " NaN\n", " NaN\n", " NaN\n", - " 01/11/2018 0:00\n", + " 1/11/2018 0:00\n", " 1541027104\n", " \n", " \n", @@ -119,7 +118,7 @@ " NaN\n", " NaN\n", " NaN\n", - " 01/11/2018 0:00\n", + " 1/11/2018 0:00\n", " 1541027104\n", " \n", " \n", @@ -137,7 +136,7 @@ " NaN\n", " NaN\n", " NaN\n", - " 01/11/2018 0:00\n", + " 1/11/2018 0:00\n", " 1541027104\n", " \n", " \n", @@ -159,15 +158,15 @@ "3 Good 2.0 0h Good 86.0 NaN NaN \n", "4 Good 7.0 0h Good 69.0 NaN NaN \n", "\n", - " PM10 Value Generated Date Time \n", - "0 NaN 01/11/2018 0:00 1541027104 \n", - "1 36.0 01/11/2018 0:00 1541027104 \n", - "2 NaN 01/11/2018 0:00 1541027104 \n", - "3 NaN 01/11/2018 0:00 1541027104 \n", - "4 NaN 01/11/2018 0:00 1541027104 " + " PM10 Value Generated Date Time \n", + "0 NaN 1/11/2018 0:00 1541027104 \n", + "1 36.0 1/11/2018 0:00 1541027104 \n", + "2 NaN 1/11/2018 0:00 1541027104 \n", + "3 NaN 1/11/2018 0:00 1541027104 \n", + "4 NaN 1/11/2018 0:00 1541027104 " ] }, - "execution_count": 3, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } @@ -179,6 +178,2142 @@ "\n", "data.head()" ] + }, + { + "cell_type": "code", + "execution_count": 4, + "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", + " \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", + " \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", + "
StationAir QualityLongitudeLatitudeO3 HourO3 QualityO3 ValueNO2 HourNO2 QualityNO2 ValuePM10 HourPM10 QualityPM10 ValueGeneratedDate Time
5739Barcelona - CiutadellaGood2.187441.386422hGood10.022hGood57.0NaNNaNNaN30/11/2018 23:001543615502
5740Barcelona - Vall HebronGood2.148041.426122hGood32.022hGood31.022hGood21.030/11/2018 23:001543615502
5741Barcelona - Palau ReialGood2.115141.387522hGood40.022hGood20.022hGood15.030/11/2018 23:001543615502
5742Barcelona - PoblenouGood2.204541.4039NaNNaNNaN22hGood70.022hGood25.030/11/2018 23:001543615502
5743Barcelona - Observ FabraGood2.123941.418322hGood64.022hGood21.022hGood12.030/11/2018 23:001543615502
\n", + "
" + ], + "text/plain": [ + " Station Air Quality Longitude Latitude O3 Hour \\\n", + "5739 Barcelona - Ciutadella Good 2.1874 41.3864 22h \n", + "5740 Barcelona - Vall Hebron Good 2.1480 41.4261 22h \n", + "5741 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", + "5742 Barcelona - Poblenou Good 2.2045 41.4039 NaN \n", + "5743 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", + "\n", + " O3 Quality O3 Value NO2 Hour NO2 Quality NO2 Value PM10 Hour \\\n", + "5739 Good 10.0 22h Good 57.0 NaN \n", + "5740 Good 32.0 22h Good 31.0 22h \n", + "5741 Good 40.0 22h Good 20.0 22h \n", + "5742 NaN NaN 22h Good 70.0 22h \n", + "5743 Good 64.0 22h Good 21.0 22h \n", + "\n", + " PM10 Quality PM10 Value Generated Date Time \n", + "5739 NaN NaN 30/11/2018 23:00 1543615502 \n", + "5740 Good 21.0 30/11/2018 23:00 1543615502 \n", + "5741 Good 15.0 30/11/2018 23:00 1543615502 \n", + "5742 Good 25.0 30/11/2018 23:00 1543615502 \n", + "5743 Good 12.0 30/11/2018 23:00 1543615502 " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.tail()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Station', 'Air Quality', 'Longitude', 'Latitude', 'O3 Hour',\n", + " 'O3 Quality', 'O3 Value', 'NO2 Hour', 'NO2 Quality', 'NO2 Value',\n", + " 'PM10 Hour', 'PM10 Quality', 'PM10 Value', 'Generated', 'Date Time'],\n", + " dtype='object')" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "my_data=data[[\"Station\", \"O3 Hour\",\"O3 Quality\", \"O3 Value\"]]" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StationO3 HourO3 QualityO3 Value
0Barcelona - SantsNaNNaNNaN
1Barcelona - Eixample0hGood1.0
2Barcelona - Gràcia0hGood10.0
3Barcelona - Ciutadella0hGood2.0
4Barcelona - Vall Hebron0hGood7.0
...............
5739Barcelona - Ciutadella22hGood10.0
5740Barcelona - Vall Hebron22hGood32.0
5741Barcelona - Palau Reial22hGood40.0
5742Barcelona - PoblenouNaNNaNNaN
5743Barcelona - Observ Fabra22hGood64.0
\n", + "

5744 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " Station O3 Hour O3 Quality O3 Value\n", + "0 Barcelona - Sants NaN NaN NaN\n", + "1 Barcelona - Eixample 0h Good 1.0\n", + "2 Barcelona - Gràcia 0h Good 10.0\n", + "3 Barcelona - Ciutadella 0h Good 2.0\n", + "4 Barcelona - Vall Hebron 0h Good 7.0\n", + "... ... ... ... ...\n", + "5739 Barcelona - Ciutadella 22h Good 10.0\n", + "5740 Barcelona - Vall Hebron 22h Good 32.0\n", + "5741 Barcelona - Palau Reial 22h Good 40.0\n", + "5742 Barcelona - Poblenou NaN NaN NaN\n", + "5743 Barcelona - Observ Fabra 22h Good 64.0\n", + "\n", + "[5744 rows x 4 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_data" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "34.082906608144356" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"O3 Value\"].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1.0" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"O3 Value\"].min()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "100.0" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"O3 Value\"].max()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "my_data = data[['Station', 'O3 Hour', 'O3 Quality', 'O3 Value']].copy()\n", + "my_data.columns = ['station', 'o3_hour', 'o3_quality', 'o3_value']" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "o3_df = data[['Station', 'Air Quality', 'Longitude', 'Latitude', 'O3 Hour', 'O3 Quality', 'O3 Value', 'Generated', 'Date Time']].copy()\n", + "o3_df.columns = ['station', 'air_quality', 'longitude', 'latitude', 'o3_hour', 'o3_quality', 'o3_value', 'generated', 'date_time']" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "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", + " \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", + " \n", + "
minmaxmeanmedian
station
Barcelona - Ciutadella1.085.025.12838822.0
Barcelona - Eixample1.061.017.03876014.0
Barcelona - Gràcia1.069.026.67546626.0
Barcelona - Observ Fabra16.0100.065.35908466.0
Barcelona - Palau Reial1.064.032.02139835.0
Barcelona - PoblenouNaNNaNNaNNaN
Barcelona - SantsNaNNaNNaNNaN
Barcelona - Vall Hebron1.082.036.36708940.0
\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "station \n", + "Barcelona - Ciutadella 1.0 85.0 25.128388 22.0\n", + "Barcelona - Eixample 1.0 61.0 17.038760 14.0\n", + "Barcelona - Gràcia 1.0 69.0 26.675466 26.0\n", + "Barcelona - Observ Fabra 16.0 100.0 65.359084 66.0\n", + "Barcelona - Palau Reial 1.0 64.0 32.021398 35.0\n", + "Barcelona - Poblenou NaN NaN NaN NaN\n", + "Barcelona - Sants NaN NaN NaN NaN\n", + "Barcelona - Vall Hebron 1.0 82.0 36.367089 40.0" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "o3_df.groupby('station').o3_value.agg(['min', 'max', 'mean', 'median'])" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "count 4101.000000\n", + "mean 34.082907\n", + "std 22.960687\n", + "min 1.000000\n", + "25% 14.000000\n", + "50% 34.000000\n", + "75% 52.000000\n", + "max 100.000000\n", + "Name: o3_value, dtype: float64" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "o3_df[\"o3_value\"].describe()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2.0 258\n", + "1.0 125\n", + "3.0 124\n", + "41.0 77\n", + "47.0 77\n", + " ... \n", + "88.0 1\n", + "89.0 1\n", + "100.0 1\n", + "92.0 1\n", + "99.0 1\n", + "Name: o3_value, Length: 94, dtype: int64" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "o3_df[\"o3_value\"].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "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", + " \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", + " \n", + "
o3_houro3_quality
stationo3_value
Barcelona - Ciutadella1.099
2.09595
3.03333
4.01414
5.01515
............
Barcelona - Vall Hebron76.011
78.011
79.011
81.011
82.011
\n", + "

408 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " o3_hour o3_quality\n", + "station o3_value \n", + "Barcelona - Ciutadella 1.0 9 9\n", + " 2.0 95 95\n", + " 3.0 33 33\n", + " 4.0 14 14\n", + " 5.0 15 15\n", + "... ... ...\n", + "Barcelona - Vall Hebron 76.0 1 1\n", + " 78.0 1 1\n", + " 79.0 1 1\n", + " 81.0 1 1\n", + " 82.0 1 1\n", + "\n", + "[408 rows x 2 columns]" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "my_data.groupby([\"station\",\"o3_value\"]).count()" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "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", + " \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", + " \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", + " \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", + "
stationair_qualitylongitudelatitudeo3_houro3_qualityo3_valuegenerateddate_time
0Barcelona - EixampleModerate2.153841.38530hGood1.01/11/2018 0:001541027104
1Barcelona - GràciaGood2.153441.39870hGood10.01/11/2018 0:001541027104
2Barcelona - CiutadellaGood2.187441.38640hGood2.01/11/2018 0:001541027104
3Barcelona - Vall HebronGood2.148041.42610hGood7.01/11/2018 0:001541027104
4Barcelona - Palau ReialGood2.115141.387523hGood11.01/11/2018 0:001541027104
..............................
4096Barcelona - GràciaGood2.153441.398722hGood8.030/11/2018 23:001543615502
4097Barcelona - CiutadellaGood2.187441.386422hGood10.030/11/2018 23:001543615502
4098Barcelona - Vall HebronGood2.148041.426122hGood32.030/11/2018 23:001543615502
4099Barcelona - Palau ReialGood2.115141.387522hGood40.030/11/2018 23:001543615502
4100Barcelona - Observ FabraGood2.123941.418322hGood64.030/11/2018 23:001543615502
\n", + "

4101 rows × 9 columns

\n", + "
" + ], + "text/plain": [ + " station air_quality longitude latitude o3_hour \\\n", + "0 Barcelona - Eixample Moderate 2.1538 41.3853 0h \n", + "1 Barcelona - Gràcia Good 2.1534 41.3987 0h \n", + "2 Barcelona - Ciutadella Good 2.1874 41.3864 0h \n", + "3 Barcelona - Vall Hebron Good 2.1480 41.4261 0h \n", + "4 Barcelona - Palau Reial Good 2.1151 41.3875 23h \n", + "... ... ... ... ... ... \n", + "4096 Barcelona - Gràcia Good 2.1534 41.3987 22h \n", + "4097 Barcelona - Ciutadella Good 2.1874 41.3864 22h \n", + "4098 Barcelona - Vall Hebron Good 2.1480 41.4261 22h \n", + "4099 Barcelona - Palau Reial Good 2.1151 41.3875 22h \n", + "4100 Barcelona - Observ Fabra Good 2.1239 41.4183 22h \n", + "\n", + " o3_quality o3_value generated date_time \n", + "0 Good 1.0 1/11/2018 0:00 1541027104 \n", + "1 Good 10.0 1/11/2018 0:00 1541027104 \n", + "2 Good 2.0 1/11/2018 0:00 1541027104 \n", + "3 Good 7.0 1/11/2018 0:00 1541027104 \n", + "4 Good 11.0 1/11/2018 0:00 1541027104 \n", + "... ... ... ... ... \n", + "4096 Good 8.0 30/11/2018 23:00 1543615502 \n", + "4097 Good 10.0 30/11/2018 23:00 1543615502 \n", + "4098 Good 32.0 30/11/2018 23:00 1543615502 \n", + "4099 Good 40.0 30/11/2018 23:00 1543615502 \n", + "4100 Good 64.0 30/11/2018 23:00 1543615502 \n", + "\n", + "[4101 rows x 9 columns]" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nulls_o3 = o3_df[o3_df['o3_value'].isna() == True].index.tolist()\n", + "o3_clean = o3_df.drop(nulls_o3)\n", + "o3_clean.reset_index(drop=True,inplace=True)\n", + "o3_clean" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "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", + " \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", + "
minmaxmeanmedian
station
Barcelona - Ciutadella1.085.025.1322.0
Barcelona - Eixample1.061.017.0414.0
Barcelona - Gràcia1.069.026.6826.0
Barcelona - Observ Fabra16.0100.065.3666.0
Barcelona - Palau Reial1.064.032.0235.0
Barcelona - Vall Hebron1.082.036.3740.0
\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "station \n", + "Barcelona - Ciutadella 1.0 85.0 25.13 22.0\n", + "Barcelona - Eixample 1.0 61.0 17.04 14.0\n", + "Barcelona - Gràcia 1.0 69.0 26.68 26.0\n", + "Barcelona - Observ Fabra 16.0 100.0 65.36 66.0\n", + "Barcelona - Palau Reial 1.0 64.0 32.02 35.0\n", + "Barcelona - Vall Hebron 1.0 82.0 36.37 40.0" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "o3_clean.groupby('station').o3_value.agg(['min', 'max', 'mean', 'median']).round(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "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", + " \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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
minmaxmeanmedian
o3_hour
0h1.089.027.6623.0
10h1.083.028.5024.0
11h1.084.032.3031.0
12h1.081.039.9741.0
13h2.081.045.0046.0
14h2.083.044.5946.0
15h2.085.044.2946.0
16h2.081.044.4546.0
17h1.080.042.0142.0
18h1.085.034.0234.5
19h1.090.028.4724.0
1h1.083.030.4930.0
20h1.099.027.1221.0
21h1.0100.027.9522.0
22h1.091.030.1725.0
23h1.092.033.3631.0
2h1.084.033.4334.0
3h1.085.035.2735.0
4h1.086.036.6438.5
5h1.088.036.9737.5
6h1.090.035.9534.0
7h1.086.031.5932.0
8h1.087.027.2420.0
9h1.084.024.9617.0
\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "o3_hour \n", + "0h 1.0 89.0 27.66 23.0\n", + "10h 1.0 83.0 28.50 24.0\n", + "11h 1.0 84.0 32.30 31.0\n", + "12h 1.0 81.0 39.97 41.0\n", + "13h 2.0 81.0 45.00 46.0\n", + "14h 2.0 83.0 44.59 46.0\n", + "15h 2.0 85.0 44.29 46.0\n", + "16h 2.0 81.0 44.45 46.0\n", + "17h 1.0 80.0 42.01 42.0\n", + "18h 1.0 85.0 34.02 34.5\n", + "19h 1.0 90.0 28.47 24.0\n", + "1h 1.0 83.0 30.49 30.0\n", + "20h 1.0 99.0 27.12 21.0\n", + "21h 1.0 100.0 27.95 22.0\n", + "22h 1.0 91.0 30.17 25.0\n", + "23h 1.0 92.0 33.36 31.0\n", + "2h 1.0 84.0 33.43 34.0\n", + "3h 1.0 85.0 35.27 35.0\n", + "4h 1.0 86.0 36.64 38.5\n", + "5h 1.0 88.0 36.97 37.5\n", + "6h 1.0 90.0 35.95 34.0\n", + "7h 1.0 86.0 31.59 32.0\n", + "8h 1.0 87.0 27.24 20.0\n", + "9h 1.0 84.0 24.96 17.0" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "o3_clean.groupby('o3_hour')['o3_value'].agg(['min','max','mean','median']).round(2)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "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", + " \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", + " \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", + "
minmaxmeanmedian
stationo3_hour
Barcelona - Ciutadella0h1.071.016.559.5
10h2.047.014.8012.5
11h3.053.023.9325.0
12h2.057.032.8333.5
13h7.065.037.9242.0
..................
Barcelona - Vall Hebron5h4.070.041.2047.5
6h5.066.037.9741.0
7h1.065.030.2832.0
8h2.061.027.1329.5
9h3.054.028.3134.0
\n", + "

144 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " min max mean median\n", + "station o3_hour \n", + "Barcelona - Ciutadella 0h 1.0 71.0 16.55 9.5\n", + " 10h 2.0 47.0 14.80 12.5\n", + " 11h 3.0 53.0 23.93 25.0\n", + " 12h 2.0 57.0 32.83 33.5\n", + " 13h 7.0 65.0 37.92 42.0\n", + "... ... ... ... ...\n", + "Barcelona - Vall Hebron 5h 4.0 70.0 41.20 47.5\n", + " 6h 5.0 66.0 37.97 41.0\n", + " 7h 1.0 65.0 30.28 32.0\n", + " 8h 2.0 61.0 27.13 29.5\n", + " 9h 3.0 54.0 28.31 34.0\n", + "\n", + "[144 rows x 4 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(o3_clean.groupby(['station','o3_hour'])['o3_value'].agg(['min','max','mean','median']).round(2))" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "monday = o3_clean[o3_clean['generated'].str.contains('05/11/2018|12/11/2018|19/11/2018|26/11/2018')]\n", + "tuesday = o3_clean[o3_clean['generated'].str.contains('06/11/2018|13/11/2018|20/11/2018|27/11/2018')]\n", + "wednesday = o3_clean[o3_clean['generated'].str.contains('07/11/2018|14/11/2018|21/11/2018|28/11/2018')]\n", + "thursday = o3_clean[o3_clean['generated'].str.contains('01/11/2018|08/11/2018|15/11/2018|22/11/2018|29/11/2018')]\n", + "friday = o3_clean[o3_clean['generated'].str.contains('02/11/2018|09/11/2018|16/11/2018|23/11/2018|30/11/2018')]\n", + "saturday = o3_clean[o3_clean['generated'].str.contains('03/11/2018|10/11/2018|17/11/2018|24/11/2018')]\n", + "sunday = o3_clean[o3_clean['generated'].str.contains('04/11/2018|11/11/2018|18/11/2018|25/11/2018')]" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [], + "source": [ + "mon_mean = monday['o3_value'].mean()\n", + "tue_mean = tuesday['o3_value'].mean()\n", + "wed_mean = wednesday['o3_value'].mean()\n", + "thu_mean = thursday['o3_value'].mean()\n", + "fri_mean = friday['o3_value'].mean()\n", + "sat_mean = saturday['o3_value'].mean()\n", + "sun_mean = sunday['o3_value'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
O3 Mean
Weekdays
Monday36.84
Tuesday35.02
Wednesday32.72
Thursday28.68
Friday22.39
Saturday40.27
Sunday44.10
\n", + "
" + ], + "text/plain": [ + " O3 Mean\n", + "Weekdays \n", + "Monday 36.84\n", + "Tuesday 35.02\n", + "Wednesday 32.72\n", + "Thursday 28.68\n", + "Friday 22.39\n", + "Saturday 40.27\n", + "Sunday 44.10" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "weekdays = [['Monday', mon_mean], ['Tuesday', tue_mean], ['Wednesday', wed_mean], ['Thursday', thu_mean], ['Friday', fri_mean], ['Saturday', sat_mean], ['Sunday', sun_mean]]\n", + "\n", + "weekdf = pd.DataFrame(weekdays,columns=['Weekdays','O3 Mean']).set_index('Weekdays').round(2)\n", + "weekdf" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [], + "source": [ + "week_1 = o3_clean[o3_clean['generated'].str.contains('01/11/2018|02/11/2018|03/11/2018|04/11/2018|05/11/2018|06/11/2018|07/11/2018')]\n", + "week_2 = o3_clean[o3_clean['generated'].str.contains('08/11/2018|09/11/2018|10/11/2018|11/11/2018|12/11/2018|13/11/2018|14/11/2018')]\n", + "week_3 = o3_clean[o3_clean['generated'].str.contains('15/11/2018|16/11/2018|17/11/2018|18/11/2018|19/11/2018|20/11/2018|21/11/2018')]\n", + "week_4 = o3_clean[o3_clean['generated'].str.contains('22/11/2018|23/11/2018|24/11/2018|25/11/2018|26/11/2018|27/11/2018|28/11/2018')]" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [], + "source": [ + "w1_mean = week_1['o3_value'].mean()\n", + "w2_mean = week_2['o3_value'].mean()\n", + "w3_mean = week_3['o3_value'].mean()\n", + "w4_mean = week_4['o3_value'].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "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", + " \n", + " \n", + " \n", + " \n", + "
O3 Mean
Weeks
Week 1NaN
Week 240.074605
Week 338.747604
Week 430.050568
\n", + "
" + ], + "text/plain": [ + " O3 Mean\n", + "Weeks \n", + "Week 1 NaN\n", + "Week 2 40.074605\n", + "Week 3 38.747604\n", + "Week 4 30.050568" + ] + }, + "execution_count": 86, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "weeks = [['Week 1', w1_mean], ['Week 2', w2_mean], ['Week 3', w3_mean], ['Week 4', w4_mean]]\n", + "\n", + "weeksdf = pd.DataFrame(weeks,columns=['Weeks','O3 Mean']).set_index('Weeks')\n", + "weeksdf" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
stationo3_houro3_qualityo3_value
5543Barcelona - Observ Fabra21hGood100.0
5535Barcelona - Observ Fabra20hGood99.0
959Barcelona - Observ Fabra23hGood92.0
5551Barcelona - Observ Fabra22hGood91.0
5559Barcelona - Observ Fabra23hGood91.0
2159Barcelona - Observ Fabra6hGood90.0
3823Barcelona - Observ Fabra22hGood90.0
5527Barcelona - Observ Fabra19hGood90.0
5567Barcelona - Observ Fabra0hGood89.0
5607Barcelona - Observ Fabra5hGood88.0
15Barcelona - Observ Fabra0hGood87.0
847Barcelona - Observ Fabra8hGood87.0
2151Barcelona - Observ Fabra5hGood87.0
2175Barcelona - Observ Fabra8hGood87.0
2351Barcelona - Observ Fabra6hGood87.0
4271Barcelona - Observ Fabra6hGood87.0
751Barcelona - Observ Fabra20hGood86.0
2335Barcelona - Observ Fabra4hGood86.0
2343Barcelona - Observ Fabra5hGood86.0
2359Barcelona - Observ Fabra7hGood86.0
2367Barcelona - Observ Fabra8hGood86.0
4263Barcelona - Observ Fabra5hGood86.0
915Barcelona - Ciutadella18hGood85.0
1583Barcelona - Observ Fabra5hGood85.0
2327Barcelona - Observ Fabra3hGood85.0
2615Barcelona - Observ Fabra15hGood85.0
2735Barcelona - Observ Fabra6hGood85.0
679Barcelona - Observ Fabra11hGood84.0
2231Barcelona - Observ Fabra15hGood84.0
2319Barcelona - Observ Fabra2hGood84.0
2375Barcelona - Observ Fabra9hGood84.0
5599Barcelona - Observ Fabra4hGood84.0
5639Barcelona - Observ Fabra9hGood84.0
31Barcelona - Observ Fabra2hGood83.0
39Barcelona - Observ Fabra3hGood83.0
671Barcelona - Observ Fabra10hGood83.0
919Barcelona - Observ Fabra18hGood83.0
2223Barcelona - Observ Fabra14hGood83.0
4255Barcelona - Observ Fabra4hGood83.0
5031Barcelona - Observ Fabra5hGood83.0
5455Barcelona - Observ Fabra10hGood83.0
5575Barcelona - Observ Fabra1hGood83.0
615Barcelona - Observ Fabra3hGood82.0
623Barcelona - Observ Fabra4hGood82.0
916Barcelona - Vall Hebron18hGood82.0
2167Barcelona - Observ Fabra7hGood82.0
4247Barcelona - Observ Fabra3hGood82.0
5583Barcelona - Observ Fabra2hGood82.0
5647Barcelona - Observ Fabra10hGood82.0
47Barcelona - Observ Fabra4hGood81.0
\n", + "
" + ], + "text/plain": [ + " station o3_hour o3_quality o3_value\n", + "5543 Barcelona - Observ Fabra 21h Good 100.0\n", + "5535 Barcelona - Observ Fabra 20h Good 99.0\n", + "959 Barcelona - Observ Fabra 23h Good 92.0\n", + "5551 Barcelona - Observ Fabra 22h Good 91.0\n", + "5559 Barcelona - Observ Fabra 23h Good 91.0\n", + "2159 Barcelona - Observ Fabra 6h Good 90.0\n", + "3823 Barcelona - Observ Fabra 22h Good 90.0\n", + "5527 Barcelona - Observ Fabra 19h Good 90.0\n", + "5567 Barcelona - Observ Fabra 0h Good 89.0\n", + "5607 Barcelona - Observ Fabra 5h Good 88.0\n", + "15 Barcelona - Observ Fabra 0h Good 87.0\n", + "847 Barcelona - Observ Fabra 8h Good 87.0\n", + "2151 Barcelona - Observ Fabra 5h Good 87.0\n", + "2175 Barcelona - Observ Fabra 8h Good 87.0\n", + "2351 Barcelona - Observ Fabra 6h Good 87.0\n", + "4271 Barcelona - Observ Fabra 6h Good 87.0\n", + "751 Barcelona - Observ Fabra 20h Good 86.0\n", + "2335 Barcelona - Observ Fabra 4h Good 86.0\n", + "2343 Barcelona - Observ Fabra 5h Good 86.0\n", + "2359 Barcelona - Observ Fabra 7h Good 86.0\n", + "2367 Barcelona - Observ Fabra 8h Good 86.0\n", + "4263 Barcelona - Observ Fabra 5h Good 86.0\n", + "915 Barcelona - Ciutadella 18h Good 85.0\n", + "1583 Barcelona - Observ Fabra 5h Good 85.0\n", + "2327 Barcelona - Observ Fabra 3h Good 85.0\n", + "2615 Barcelona - Observ Fabra 15h Good 85.0\n", + "2735 Barcelona - Observ Fabra 6h Good 85.0\n", + "679 Barcelona - Observ Fabra 11h Good 84.0\n", + "2231 Barcelona - Observ Fabra 15h Good 84.0\n", + "2319 Barcelona - Observ Fabra 2h Good 84.0\n", + "2375 Barcelona - Observ Fabra 9h Good 84.0\n", + "5599 Barcelona - Observ Fabra 4h Good 84.0\n", + "5639 Barcelona - Observ Fabra 9h Good 84.0\n", + "31 Barcelona - Observ Fabra 2h Good 83.0\n", + "39 Barcelona - Observ Fabra 3h Good 83.0\n", + "671 Barcelona - Observ Fabra 10h Good 83.0\n", + "919 Barcelona - Observ Fabra 18h Good 83.0\n", + "2223 Barcelona - Observ Fabra 14h Good 83.0\n", + "4255 Barcelona - Observ Fabra 4h Good 83.0\n", + "5031 Barcelona - Observ Fabra 5h Good 83.0\n", + "5455 Barcelona - Observ Fabra 10h Good 83.0\n", + "5575 Barcelona - Observ Fabra 1h Good 83.0\n", + "615 Barcelona - Observ Fabra 3h Good 82.0\n", + "623 Barcelona - Observ Fabra 4h Good 82.0\n", + "916 Barcelona - Vall Hebron 18h Good 82.0\n", + "2167 Barcelona - Observ Fabra 7h Good 82.0\n", + "4247 Barcelona - Observ Fabra 3h Good 82.0\n", + "5583 Barcelona - Observ Fabra 2h Good 82.0\n", + "5647 Barcelona - Observ Fabra 10h Good 82.0\n", + "47 Barcelona - Observ Fabra 4h Good 81.0" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "max_values = my_data.nlargest(columns='o3_value', n = 50)\n", + "\n", + "max_values" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -197,7 +2332,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.8.2" + "version": "3.8.5" }, "latex_envs": { "LaTeX_envs_menu_present": true,