Skip to content

Instantly share code, notes, and snippets.

@barronh
Created March 12, 2021 16:45
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save barronh/ce818df08c6efb0356859698e545e4e8 to your computer and use it in GitHub Desktop.
Save barronh/ce818df08c6efb0356859698e545e4e8 to your computer and use it in GitHub Desktop.
Python AQS API Example
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "comfortable-consent",
"metadata": {},
"source": [
"# AQS API Query Parameters and Perform Analysis\n",
"\n",
" author: Barron H. Henderson\n",
" date: 2021-03-12\n",
"\n",
"\n",
"Overview:\n",
"* List Criteria Pollutant and CBSA codes\n",
"* Query observational data for a pollutant and CBSA on a day\n",
"* Show descriptive statistics\n",
"* Plot a spatial map\n",
"\n",
"Prerequisites: Python3, numpy, and pandas\n",
"\n",
"Tested on: Windows, Linux, Google Colab"
]
},
{
"cell_type": "markdown",
"id": "stunning-conflict",
"metadata": {},
"source": [
"## Import Libraries\n",
"\n",
"* `urllib` and `json` are default system libraries\n",
" * `urllib` is used to interact with the AQS API\n",
" * `json` is used to interpret the results\n",
"* `pandas` is used to convert the json to a tabular style format\n",
"* `pycno` is a python interface to NASA's overlays for mapping"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "enormous-format",
"metadata": {},
"outputs": [],
"source": [
"from urllib.request import urlretrieve, urlopen\n",
"import json\n",
"import pandas as pd\n",
"import pycno"
]
},
{
"cell_type": "markdown",
"id": "economic-vietnamese",
"metadata": {},
"source": [
"## Configure to use your own credentials\n",
"\n",
"* the test credientials will only work for small queries\n",
"* see https://aqs.epa.gov/aqsweb/documents/data_api.html"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "interim-brass",
"metadata": {},
"outputs": [],
"source": [
"user = \"test@aqs.api\"\n",
"key = \"test\""
]
},
{
"cell_type": "markdown",
"id": "advance-husband",
"metadata": {},
"source": [
"## Display CBSA Codes\n",
"\n",
"* The API uses codes that correspond to CBSAs\n",
"* This is the first query, which will show the CBSA codes.\n",
"* The query is setup to show Rhode Island because the result is short, but you can change RI to any state abbreviation.\n"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "limited-toddler",
"metadata": {},
"outputs": [],
"source": [
"responsetxt = urlopen(f'https://aqs.epa.gov/data/api/list/cbsas?email={user}&key={key}').read()\n",
"cbsa_df = pd.DataFrame.from_dict(json.loads(responsetxt)['Data']).set_index('code')"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "focal-country",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>value_represented</th>\n",
" </tr>\n",
" <tr>\n",
" <th>code</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>39300</th>\n",
" <td>Providence-Warwick, RI-MA</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" value_represented\n",
"code \n",
"39300 Providence-Warwick, RI-MA"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Find a CBSA by state\n",
"cbsa_df.query('value_represented.str.contains(\"RI\")')"
]
},
{
"cell_type": "markdown",
"id": "occupational-agreement",
"metadata": {},
"source": [
"## Display Pollutant Parameter Codes\n",
"\n",
"* This is similar to CBSAs, but for pollutants\n",
"* First, we query types.\n",
"* Then, we use CRITERIA to query pollutant codes "
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "concrete-therapy",
"metadata": {},
"outputs": [],
"source": [
"responsetxt = urlopen(f'https://aqs.epa.gov/data/api/list/classes?email={user}&key={key}').read()\n",
"polltype_df = pd.DataFrame.from_dict(json.loads(responsetxt)['Data']).set_index('code')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "hollywood-drawing",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>value_represented</th>\n",
" </tr>\n",
" <tr>\n",
" <th>code</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>AIRNOW MAPS</th>\n",
" <td>The parameters represented on AirNow maps (881...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>ALL</th>\n",
" <td>Select all Parameters Available</td>\n",
" </tr>\n",
" <tr>\n",
" <th>AQI POLLUTANTS</th>\n",
" <td>Pollutants that have an AQI Defined</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CORE_HAPS</th>\n",
" <td>Urban Air Toxic Pollutants</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CRITERIA</th>\n",
" <td>Criteria Pollutants</td>\n",
" </tr>\n",
" <tr>\n",
" <th>CSN DART</th>\n",
" <td>List of CSN speciation parameters to populate ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>FORECAST</th>\n",
" <td>Parameters routinely extracted by AirNow (STI)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>HAPS</th>\n",
" <td>Hazardous Air Pollutants</td>\n",
" </tr>\n",
" <tr>\n",
" <th>IMPROVE CARBON</th>\n",
" <td>IMPROVE Carbon Parameters</td>\n",
" </tr>\n",
" <tr>\n",
" <th>IMPROVE_SPECIATION</th>\n",
" <td>PM2.5 Speciated Parameters Measured at IMPROVE...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>MET</th>\n",
" <td>Meteorological Parameters</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NATTS CORE HAPS</th>\n",
" <td>The core list of toxics of interest to the NAT...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NATTS REQUIRED</th>\n",
" <td>Required compounds to be collected in the Nati...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PAMS</th>\n",
" <td>Photochemical Assessment Monitoring System</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PAMS_VOC</th>\n",
" <td>Volatile Organic Compound subset of the PAMS P...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PM COARSE</th>\n",
" <td>PM between 2.5 and 10 micrometers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PM10 SPECIATION</th>\n",
" <td>PM10 Speciated Parameters</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PM2.5 CONT NONREF</th>\n",
" <td>PM2.5 Continuous, Nonreference Methods</td>\n",
" </tr>\n",
" <tr>\n",
" <th>PM2.5 MASS/QA</th>\n",
" <td>PM2.5 Mass and QA Parameters</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SCHOOL AIR TOXICS</th>\n",
" <td>School Air Toxics Program Parameters</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SPECIATION</th>\n",
" <td>PM2.5 Speciated Parameters</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SPECIATION CARBON</th>\n",
" <td>PM2.5 Speciation Carbon Parameters</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SPECIATION CATION/ANION</th>\n",
" <td>PM2.5 Speciation Cation/Anion Parameters</td>\n",
" </tr>\n",
" <tr>\n",
" <th>SPECIATION METALS</th>\n",
" <td>PM2.5 Speciation Metal Parameters</td>\n",
" </tr>\n",
" <tr>\n",
" <th>UATMP CARBONYL</th>\n",
" <td>Urban Air Toxics Monitoring Program Carbonyls</td>\n",
" </tr>\n",
" <tr>\n",
" <th>UATMP VOC</th>\n",
" <td>Urban Air Toxics Monitoring Program VOCs</td>\n",
" </tr>\n",
" <tr>\n",
" <th>VOC</th>\n",
" <td>Volatile organic compounds</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" value_represented\n",
"code \n",
"AIRNOW MAPS The parameters represented on AirNow maps (881...\n",
"ALL Select all Parameters Available\n",
"AQI POLLUTANTS Pollutants that have an AQI Defined\n",
"CORE_HAPS Urban Air Toxic Pollutants\n",
"CRITERIA Criteria Pollutants\n",
"CSN DART List of CSN speciation parameters to populate ...\n",
"FORECAST Parameters routinely extracted by AirNow (STI)\n",
"HAPS Hazardous Air Pollutants\n",
"IMPROVE CARBON IMPROVE Carbon Parameters\n",
"IMPROVE_SPECIATION PM2.5 Speciated Parameters Measured at IMPROVE...\n",
"MET Meteorological Parameters\n",
"NATTS CORE HAPS The core list of toxics of interest to the NAT...\n",
"NATTS REQUIRED Required compounds to be collected in the Nati...\n",
"PAMS Photochemical Assessment Monitoring System\n",
"PAMS_VOC Volatile Organic Compound subset of the PAMS P...\n",
"PM COARSE PM between 2.5 and 10 micrometers\n",
"PM10 SPECIATION PM10 Speciated Parameters\n",
"PM2.5 CONT NONREF PM2.5 Continuous, Nonreference Methods\n",
"PM2.5 MASS/QA PM2.5 Mass and QA Parameters\n",
"SCHOOL AIR TOXICS School Air Toxics Program Parameters\n",
"SPECIATION PM2.5 Speciated Parameters\n",
"SPECIATION CARBON PM2.5 Speciation Carbon Parameters\n",
"SPECIATION CATION/ANION PM2.5 Speciation Cation/Anion Parameters\n",
"SPECIATION METALS PM2.5 Speciation Metal Parameters\n",
"UATMP CARBONYL Urban Air Toxics Monitoring Program Carbonyls\n",
"UATMP VOC Urban Air Toxics Monitoring Program VOCs\n",
"VOC Volatile organic compounds"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"polltype_df"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "heard-burden",
"metadata": {},
"outputs": [],
"source": [
"responsetxt = urlopen(f'https://aqs.epa.gov/data/api/list/parametersByClass?email={user}&key={key}&pc=CRITERIA').read()\n",
"param_df = pd.DataFrame.from_dict(json.loads(responsetxt)['Data']).set_index('code')"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "judicial-northwest",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>value_represented</th>\n",
" </tr>\n",
" <tr>\n",
" <th>code</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>14129</th>\n",
" <td>Lead (TSP) LC</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42101</th>\n",
" <td>Carbon monoxide</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42401</th>\n",
" <td>Sulfur dioxide</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42602</th>\n",
" <td>Nitrogen dioxide (NO2)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>44201</th>\n",
" <td>Ozone</td>\n",
" </tr>\n",
" <tr>\n",
" <th>81102</th>\n",
" <td>PM10 Total 0-10um STP</td>\n",
" </tr>\n",
" <tr>\n",
" <th>85129</th>\n",
" <td>Lead PM10 LC FRM/FEM</td>\n",
" </tr>\n",
" <tr>\n",
" <th>88101</th>\n",
" <td>PM2.5 - Local Conditions</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" value_represented\n",
"code \n",
"14129 Lead (TSP) LC\n",
"42101 Carbon monoxide\n",
"42401 Sulfur dioxide\n",
"42602 Nitrogen dioxide (NO2)\n",
"44201 Ozone\n",
"81102 PM10 Total 0-10um STP\n",
"85129 Lead PM10 LC FRM/FEM\n",
"88101 PM2.5 - Local Conditions"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"param_df"
]
},
{
"cell_type": "markdown",
"id": "wired-enemy",
"metadata": {},
"source": [
"## Select Data Query\n",
"\n",
"Based on previous queries we know:\n",
"1. 88101 corresponds to PM2.5\n",
"2. 16980 corresponds to Chicago-Naperville-Elgin, IL-IN-WI\n",
"3. In this case, I choose to focus on July 4th."
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "boxed-headset",
"metadata": {},
"outputs": [],
"source": [
"param = 88101\n",
"cbsa = 16980\n",
"bdate = 20200704\n",
"edate = 20200704"
]
},
{
"cell_type": "markdown",
"id": "agricultural-greenhouse",
"metadata": {},
"source": [
"## Now download and Archive Data\n",
"\n",
"* Storing data in a json file\n",
"* Loading data into `records` a pandas.DataFrame"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "federal-omaha",
"metadata": {},
"outputs": [],
"source": [
"# This is where results will be stored\n",
"archivepath = 'temp.json'"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "million-scout",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('temp.json', <http.client.HTTPMessage at 0x161634fefd0>)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# This will download \n",
"cbsa_url = f'https://aqs.epa.gov/data/api/dailyData/byCBSA?email={user}&key={key}&param={param}&bdate={bdate}&edate={edate}&cbsa={cbsa}'\n",
"urlretrieve(cbsa_url, archivepath)\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "growing-tennessee",
"metadata": {},
"outputs": [],
"source": [
"data = json.load(open(archivepath, 'r'))\n",
"records = pd.DataFrame.from_dict(data['Data'])"
]
},
{
"cell_type": "markdown",
"id": "mineral-controversy",
"metadata": {},
"source": [
"## Show Descriptive Information\n",
"\n",
"* Grouping by duration because the results can be quite different.\n",
"* `pandas.DataFrame.describe` displays counts, means, standard deviation and quantile information"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "dominican-swing",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sample_duration</th>\n",
" <th>1 HOUR</th>\n",
" <th>24-HR BLK AVG</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"8\" valign=\"top\">arithmetic_mean</th>\n",
" <th>count</th>\n",
" <td>13.000000</td>\n",
" <td>52.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>18.917338</td>\n",
" <td>18.869231</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>8.456861</td>\n",
" <td>8.227966</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>11.391304</td>\n",
" <td>11.300000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>12.220833</td>\n",
" <td>12.200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>15.570833</td>\n",
" <td>15.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>23.150000</td>\n",
" <td>23.100000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>37.233333</td>\n",
" <td>37.200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"8\" valign=\"top\">first_max_value</th>\n",
" <th>count</th>\n",
" <td>13.000000</td>\n",
" <td>52.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>62.476923</td>\n",
" <td>18.869231</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>68.668675</td>\n",
" <td>8.227966</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>15.200000</td>\n",
" <td>11.300000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>19.600000</td>\n",
" <td>12.200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>38.600000</td>\n",
" <td>15.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>66.000000</td>\n",
" <td>23.100000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>247.600000</td>\n",
" <td>37.200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"8\" valign=\"top\">first_max_hour</th>\n",
" <th>count</th>\n",
" <td>13.000000</td>\n",
" <td>52.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>18.153846</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>6.135228</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>15.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>21.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>22.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>23.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"sample_duration 1 HOUR 24-HR BLK AVG\n",
"arithmetic_mean count 13.000000 52.000000\n",
" mean 18.917338 18.869231\n",
" std 8.456861 8.227966\n",
" min 11.391304 11.300000\n",
" 25% 12.220833 12.200000\n",
" 50% 15.570833 15.500000\n",
" 75% 23.150000 23.100000\n",
" max 37.233333 37.200000\n",
"first_max_value count 13.000000 52.000000\n",
" mean 62.476923 18.869231\n",
" std 68.668675 8.227966\n",
" min 15.200000 11.300000\n",
" 25% 19.600000 12.200000\n",
" 50% 38.600000 15.500000\n",
" 75% 66.000000 23.100000\n",
" max 247.600000 37.200000\n",
"first_max_hour count 13.000000 52.000000\n",
" mean 18.153846 0.000000\n",
" std 6.135228 0.000000\n",
" min 1.000000 0.000000\n",
" 25% 15.000000 0.000000\n",
" 50% 21.000000 0.000000\n",
" 75% 22.000000 0.000000\n",
" max 23.000000 0.000000"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"records.filter(['sample_duration', 'arithmetic_mean', 'first_max_value', 'first_max_hour']).groupby('sample_duration').describe().T"
]
},
{
"cell_type": "markdown",
"id": "arabic-scholarship",
"metadata": {},
"source": [
"## Display Data as a Map\n",
"\n",
"* `pycno` is used to fetch and display a medium resolution map\n",
" * You may get a warning the first time this is run. pycno is downloading the overlay.\n",
" * You could replace the pycno functionality with `basemap` or `cartopy`, which have more options.\n",
" * You can also make your own `cnob` or `cno` files from shapefiles or kml, but that is not covered here.\n",
"* `records.plot.scatter` is used to display the arithmetic_mean"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "temporal-turning",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ax = records.plot.scatter(x=['longitude'], y=['latitude'], c=records.arithmetic_mean, cmap='viridis')\n",
"cno = pycno.cno()\n",
"cno.draw('MWDB_Coasts_USA_1.cnob');"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "hidden-condition",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"((41.157377749999995, 42.568881250000004), (-88.240557, -87.14957700000001))"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ax.get_ylim(), ax.get_xlim()"
]
},
{
"cell_type": "markdown",
"id": "chubby-lesbian",
"metadata": {},
"source": [
"## Many more options are available in addition to CBSA\n",
"\n",
"* You could replace cbsa_url with any of the following\n",
"* `box_url` to use a longitude/latitude bounding box\n",
"* see https://aqs.epa.gov/aqsweb/documents/data_api.html"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "minor-budget",
"metadata": {},
"outputs": [],
"source": [
"box_url = f'https://aqs.epa.gov/data/api/dailyData/byBox?email={user}&key={key}&param={param}&bdate={bdate}&edate={edate}&minlat=41.15&maxlat=42.6&minlon=-88.24&maxlon=-87.15'\n",
"state_url = f'https://aqs.epa.gov/data/api/dailyData/byState?email={user}&key={key}&param={param}&bdate={bdate}&edate={edate}&state=17'\n",
"county_url = f'https://aqs.epa.gov/data/api/dailyData/byCounty?email={user}&key={key}&param={param}&bdate={bdate}&edate={edate}&state=17&county=031'\n",
"site_url = f'https://aqs.epa.gov/data/api/dailyData/bySite?email={user}&key={key}&param={param}&bdate={bdate}&edate={edate}&state=17&county=031&site=4201'"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "powered-guyana",
"metadata": {},
"outputs": [],
"source": [
"responsetxt = urlopen(state_url).read()\n",
"records = pd.DataFrame.from_dict(json.loads(responsetxt)['Data'])"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "turned-involvement",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>sample_duration</th>\n",
" <th>1 HOUR</th>\n",
" <th>24-HR BLK AVG</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th rowspan=\"8\" valign=\"top\">arithmetic_mean</th>\n",
" <th>count</th>\n",
" <td>17.000000</td>\n",
" <td>68.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>23.102496</td>\n",
" <td>23.064706</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>9.275212</td>\n",
" <td>9.064277</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>11.266667</td>\n",
" <td>11.200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>16.787500</td>\n",
" <td>16.700000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>20.575000</td>\n",
" <td>20.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>31.809091</td>\n",
" <td>31.800000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>40.695833</td>\n",
" <td>40.600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"8\" valign=\"top\">first_max_value</th>\n",
" <th>count</th>\n",
" <td>17.000000</td>\n",
" <td>68.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>102.841176</td>\n",
" <td>23.064706</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>77.531518</td>\n",
" <td>9.064277</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>22.500000</td>\n",
" <td>11.200000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>51.800000</td>\n",
" <td>16.700000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>66.100000</td>\n",
" <td>20.500000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>150.800000</td>\n",
" <td>31.800000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>247.600000</td>\n",
" <td>40.600000</td>\n",
" </tr>\n",
" <tr>\n",
" <th rowspan=\"8\" valign=\"top\">first_max_hour</th>\n",
" <th>count</th>\n",
" <td>17.000000</td>\n",
" <td>68.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>mean</th>\n",
" <td>20.705882</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>std</th>\n",
" <td>5.132795</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>min</th>\n",
" <td>1.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>25%</th>\n",
" <td>21.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>50%</th>\n",
" <td>22.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>75%</th>\n",
" <td>22.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>max</th>\n",
" <td>23.000000</td>\n",
" <td>0.000000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
"sample_duration 1 HOUR 24-HR BLK AVG\n",
"arithmetic_mean count 17.000000 68.000000\n",
" mean 23.102496 23.064706\n",
" std 9.275212 9.064277\n",
" min 11.266667 11.200000\n",
" 25% 16.787500 16.700000\n",
" 50% 20.575000 20.500000\n",
" 75% 31.809091 31.800000\n",
" max 40.695833 40.600000\n",
"first_max_value count 17.000000 68.000000\n",
" mean 102.841176 23.064706\n",
" std 77.531518 9.064277\n",
" min 22.500000 11.200000\n",
" 25% 51.800000 16.700000\n",
" 50% 66.100000 20.500000\n",
" 75% 150.800000 31.800000\n",
" max 247.600000 40.600000\n",
"first_max_hour count 17.000000 68.000000\n",
" mean 20.705882 0.000000\n",
" std 5.132795 0.000000\n",
" min 1.000000 0.000000\n",
" 25% 21.000000 0.000000\n",
" 50% 22.000000 0.000000\n",
" 75% 22.000000 0.000000\n",
" max 23.000000 0.000000"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"records.filter(['sample_duration', 'arithmetic_mean', 'first_max_value', 'first_max_hour']).groupby(['sample_duration']).describe().T"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "dirty-syntax",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"ax = records.plot.scatter(x=['longitude'], y=['latitude'], c=records.arithmetic_mean, cmap='viridis')\n",
"cno = pycno.cno()\n",
"cno.draw('MWDB_Coasts_USA_1.cnob');"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "mounted-distribution",
"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.7"
},
"toc-showtags": false
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment