{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "**Developed by:** [Georgii Bocharov](https://github.com/georgebv)\n", "\n", "**E-Mail:** bocharovgeorgii@gmail.com\n", "\n", "**coastlib:** https://github.com/georgebv/coastlib\n", "\n", "**License:** GNU General Public License v3.0\n", "\n", "\n", "# Introduction\n", "This notebook provides examples for the `noaa_ncei` module of the [coastlib](https://github.com/georgebv/coastlib) library. Source code for this module [can be found here](https://github.com/georgebv/coastlib/blob/master/coastlib/data/noaa_ncei.py).\n", "\n", "The `noaa_ncei` module is a part of the `coastlib.data` package. This module provides interface to the [NOAA NCEI](https://www.ncei.noaa.gov/) data portal via the [NCEI Data Service API](https://www.ncei.noaa.gov/support/access-data-service-api-user-documentation). It allows retrieval of environmental data collected by NOAA NCEI sensors such as wind, precipitation, air pressure, etc. in the form of [pandas](https://pandas.pydata.org/) [DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html). With the help of this tool one can automate extraction of large amounts of data from NOAA NCEI stations for further processing and storing.\n", "\n", "# Basic Usage\n", "Let's start by extracting hourly wind speed data for the La Guardia and Bethel Airport stations for the October 2012 time period:" ] }, { "cell_type": "code", "execution_count": 1, "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", "
REPORT_TYPEHourlyWindDirectionLONGITUDEELEVATIONSOURCEHourlyWindSpeedLATITUDE
STATIONDATE
72503014732 : LA GUARDIA AIRPORT, NY US2012-10-01 00:51:00FM-15270-73.883.47840.7792
2012-10-01 01:00:00FM-12270-73.883.44840.7792
2012-10-01 01:51:00FM-15290-73.883.471340.7792
2012-10-01 02:51:00FM-15260-73.883.471140.7792
2012-10-01 03:51:00FM-15250-73.883.471040.7792
...........................
70219026615 : BETHEL AIRPORT, AK US2012-11-01 21:00:00FM-12010-161.829331.141960.785
2012-11-01 21:53:00FM-15010-161.829331.172160.785
2012-11-01 22:53:00FM-15010-161.829331.172560.785
2012-11-01 23:53:00FM-15010-161.829331.172460.785
2012-11-01 23:59:00SODNaN-161.829331.16NaN60.785
\n", "

2427 rows × 7 columns

\n", "
" ], "text/plain": [ " REPORT_TYPE \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2012-10-01 00:51:00 FM-15 \n", " 2012-10-01 01:00:00 FM-12 \n", " 2012-10-01 01:51:00 FM-15 \n", " 2012-10-01 02:51:00 FM-15 \n", " 2012-10-01 03:51:00 FM-15 \n", "... ... \n", "70219026615 : BETHEL AIRPORT, AK US 2012-11-01 21:00:00 FM-12 \n", " 2012-11-01 21:53:00 FM-15 \n", " 2012-11-01 22:53:00 FM-15 \n", " 2012-11-01 23:53:00 FM-15 \n", " 2012-11-01 23:59:00 SOD \n", "\n", " HourlyWindDirection \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2012-10-01 00:51:00 270 \n", " 2012-10-01 01:00:00 270 \n", " 2012-10-01 01:51:00 290 \n", " 2012-10-01 02:51:00 260 \n", " 2012-10-01 03:51:00 250 \n", "... ... \n", "70219026615 : BETHEL AIRPORT, AK US 2012-11-01 21:00:00 010 \n", " 2012-11-01 21:53:00 010 \n", " 2012-11-01 22:53:00 010 \n", " 2012-11-01 23:53:00 010 \n", " 2012-11-01 23:59:00 NaN \n", "\n", " LONGITUDE \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2012-10-01 00:51:00 -73.88 \n", " 2012-10-01 01:00:00 -73.88 \n", " 2012-10-01 01:51:00 -73.88 \n", " 2012-10-01 02:51:00 -73.88 \n", " 2012-10-01 03:51:00 -73.88 \n", "... ... \n", "70219026615 : BETHEL AIRPORT, AK US 2012-11-01 21:00:00 -161.8293 \n", " 2012-11-01 21:53:00 -161.8293 \n", " 2012-11-01 22:53:00 -161.8293 \n", " 2012-11-01 23:53:00 -161.8293 \n", " 2012-11-01 23:59:00 -161.8293 \n", "\n", " ELEVATION SOURCE \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2012-10-01 00:51:00 3.4 7 \n", " 2012-10-01 01:00:00 3.4 4 \n", " 2012-10-01 01:51:00 3.4 7 \n", " 2012-10-01 02:51:00 3.4 7 \n", " 2012-10-01 03:51:00 3.4 7 \n", "... ... ... \n", "70219026615 : BETHEL AIRPORT, AK US 2012-11-01 21:00:00 31.1 4 \n", " 2012-11-01 21:53:00 31.1 7 \n", " 2012-11-01 22:53:00 31.1 7 \n", " 2012-11-01 23:53:00 31.1 7 \n", " 2012-11-01 23:59:00 31.1 6 \n", "\n", " HourlyWindSpeed \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2012-10-01 00:51:00 8 \n", " 2012-10-01 01:00:00 8 \n", " 2012-10-01 01:51:00 13 \n", " 2012-10-01 02:51:00 11 \n", " 2012-10-01 03:51:00 10 \n", "... ... \n", "70219026615 : BETHEL AIRPORT, AK US 2012-11-01 21:00:00 19 \n", " 2012-11-01 21:53:00 21 \n", " 2012-11-01 22:53:00 25 \n", " 2012-11-01 23:53:00 24 \n", " 2012-11-01 23:59:00 NaN \n", "\n", " LATITUDE \n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2012-10-01 00:51:00 40.7792 \n", " 2012-10-01 01:00:00 40.7792 \n", " 2012-10-01 01:51:00 40.7792 \n", " 2012-10-01 02:51:00 40.7792 \n", " 2012-10-01 03:51:00 40.7792 \n", "... ... \n", "70219026615 : BETHEL AIRPORT, AK US 2012-11-01 21:00:00 60.785 \n", " 2012-11-01 21:53:00 60.785 \n", " 2012-11-01 22:53:00 60.785 \n", " 2012-11-01 23:53:00 60.785 \n", " 2012-11-01 23:59:00 60.785 \n", "\n", "[2427 rows x 7 columns]" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "%matplotlib inline\n", "\n", "import pandas as pd\n", "from coastlib.data import ncei_api, ncei_api_batch, ncei_datasets, ncei_search\n", "\n", "\n", "df = ncei_api(\n", " dataset='local-climatological-data', stations=['72503014732', '70219026615'],\n", " start_date='2012-10-01', end_date='2012-11-01', datatypes=['HourlyWindSpeed', 'HourlyWindDirection']\n", ")\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It should be noted that the extracted data is not numeric. This was done explicitly in order to allow for extraction of all data provided by NOAA (they mix datatypes in the responses) with specific processing methods left to the end user.\n", "\n", "In order to do something meaningful with the data, some processing is required:" ] }, { "cell_type": "code", "execution_count": 2, "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", "
HourlyWindSpeedHourlyWindDirection
STATIONDATE
72503014732 : LA GUARDIA AIRPORT, NY US2012-10-01 00:51:008.0270.0
2012-10-01 01:00:008.0270.0
2012-10-01 01:51:0013.0290.0
2012-10-01 02:51:0011.0260.0
2012-10-01 03:51:0010.0250.0
............
70219026615 : BETHEL AIRPORT, AK US2012-11-01 20:53:0020.010.0
2012-11-01 21:00:0019.010.0
2012-11-01 21:53:0021.010.0
2012-11-01 22:53:0025.010.0
2012-11-01 23:53:0024.010.0
\n", "

2329 rows × 2 columns

\n", "
" ], "text/plain": [ " HourlyWindSpeed \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2012-10-01 00:51:00 8.0 \n", " 2012-10-01 01:00:00 8.0 \n", " 2012-10-01 01:51:00 13.0 \n", " 2012-10-01 02:51:00 11.0 \n", " 2012-10-01 03:51:00 10.0 \n", "... ... \n", "70219026615 : BETHEL AIRPORT, AK US 2012-11-01 20:53:00 20.0 \n", " 2012-11-01 21:00:00 19.0 \n", " 2012-11-01 21:53:00 21.0 \n", " 2012-11-01 22:53:00 25.0 \n", " 2012-11-01 23:53:00 24.0 \n", "\n", " HourlyWindDirection \n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2012-10-01 00:51:00 270.0 \n", " 2012-10-01 01:00:00 270.0 \n", " 2012-10-01 01:51:00 290.0 \n", " 2012-10-01 02:51:00 260.0 \n", " 2012-10-01 03:51:00 250.0 \n", "... ... \n", "70219026615 : BETHEL AIRPORT, AK US 2012-11-01 20:53:00 10.0 \n", " 2012-11-01 21:00:00 10.0 \n", " 2012-11-01 21:53:00 10.0 \n", " 2012-11-01 22:53:00 10.0 \n", " 2012-11-01 23:53:00 10.0 \n", "\n", "[2329 rows x 2 columns]" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_processed = (\n", " df\n", " .loc[:, ['HourlyWindSpeed', 'HourlyWindDirection']]\n", " .apply(pd.to_numeric, errors='coerce')\n", " .dropna(how='any')\n", ")\n", "df_processed" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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btzI3LlzOeuss1i5ciWXX365nn/vdDrHfHAGg0GWL1/OV77yFfbv34/X68Xj8eiTN48Ve0wn4L/61a90W+rr61myZIkeQjn11FM57rjjmDlzpr7+1KlTOfHEE+Nsvv3221m2bJku4F/60pfG1YReu3Ytra2tkyrP8K9//Yubb76ZiooKjEYjf/7zn/nGN77BoYceSn9/P9dddx0AixYt0uv4JN7gydAmYY5Fmw7ua1/7GkcddRT//Oc/mT9/PhdeeCGA3tEZu21NwM866yzdWz311FOZN2/euAVce0BpDA8P64OEJjt70kQRQrB8+XJOOOEEAD1slk+0c2ixWKiurmb9+vW8++67+ueaNmgC7vV62bt3LzNmzOCmm27ir3/9K3PnzgUiU7XFkisBzxgp5e+llMuklMuqq6vjYnsARxxxBNOmTWPq1Kkp58kcHBzkwQcfZPbs2VnrNHnllVcmvQ2NdB74nj179AlWtXBEIuFwWG/OPv7447hcLs4555wxy9Jq8Uufz8e1114b91l1dTVut5sZM2bwqU99io997GN89atf1bc5VtMMIjfo6aefzrx58/Qqkh6PB4fDwf79+8f8frpzNTAwwHHHHYfRaKSqqoqPfexjutisXr2a6667jgULFujrNzU1sXr16jix7enp4XOf+xxOpxOLxcLZZ5+t30yZCPnmzZt55513JtXs3r59O3/+85+ZN28eRqORTZs28frrr3P44Yfjdru58cYbAVi8eDHnnntunG2LFy8el4Brk1HceOONzJ07l+eee45p06Zx9tmRBnCiB661lOx2O6eeeqref3Daaadhs9kmLeButxubzYbL5Spodtjq1av54he/CBD30M8XWkurvLyc6upqveyD1mGdKOAmkwm3283ll1/OwMAAH/nIR/RrcPXq1XHbNhqNOUkj7BRCNEaNbwTGrtZC+h7ZGTNmJK1zARGx2bp1K42NjVnzwDOtUZAJY8XAteL6qX7f7t27mTNnDn6/n+7ubqqrq+PqOaci3U1TXl7O4sWLaWho0C+O2BswEw/cYDBgs9mora1l7969dHd34/F4qKys1NPiIPV5HasTU8se0Ug3IbPmrScOPqmurqaysnLChZm2bds2KQEfHh7G4XCwaNEijEYjPp+Puro6DjvssJQTJmjNfi3nPRmpPHDN1pkzZ1JZWRlXZTFRwOvq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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df_processed.loc['72503014732 : LA GUARDIA AIRPORT, NY US', 'HourlyWindSpeed'].plot(color='k', lw=.5)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "df_processed.loc['70219026615 : BETHEL AIRPORT, AK US', 'HourlyWindSpeed'].plot(\n", " kind='hist', facecolor='None', edgecolor='k', lw=1, bins=15\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The `ncei_api` is the most direct way of interfacing with the NOAA NCEI API. Its drawback is that it allows for extraction of data for only a relatively small window (depends on data source, not clearly documented by NOAA - largest window apeears to be ~10 years). Serious applications require many years of data. That's where the `ncei_api_batch` function becomes much more convenient.\n", "\n", "# Batch Data Extraction\n", "Let's get 2 years of wind data for the [La Guardia](https://www.ncdc.noaa.gov/cdo-web/datasets/GHCND/stations/GHCND:USW00014732/detail) station (it should be noted that station ID is not WBAN, but a USAF number - it can be found in pdf printouts for the station or via the NCEI Search API as shown further in this notebook):" ] }, { "cell_type": "code", "execution_count": 5, "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", "
REPORT_TYPEHourlyWindDirectionLONGITUDEELEVATIONSOURCEHourlyWindSpeedLATITUDE
STATIONDATE
72503014732 : LA GUARDIA AIRPORT, NY US2010-01-01 00:51:00FM-15060-73.883.47340.7792
2010-01-01 01:00:00FM-12060-73.883.44340.7792
2010-01-01 01:04:00FM-16000-73.883.47040.7792
2010-01-01 01:37:00FM-16000-73.883.47040.7792
2010-01-01 01:47:00FM-16000-73.883.47040.7792
........................
2011-01-01 01:51:00FM-15200-73.883.47840.7792
2011-01-01 02:51:00FM-15200-73.883.47640.7792
2011-01-01 03:51:00FM-15200-73.883.47540.7792
2011-01-01 04:00:00FM-12200-73.883.44540.7792
2011-01-01 04:51:00FM-15180-73.883.47340.7792
\n", "

13482 rows × 7 columns

\n", "
" ], "text/plain": [ " REPORT_TYPE \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2010-01-01 00:51:00 FM-15 \n", " 2010-01-01 01:00:00 FM-12 \n", " 2010-01-01 01:04:00 FM-16 \n", " 2010-01-01 01:37:00 FM-16 \n", " 2010-01-01 01:47:00 FM-16 \n", "... ... \n", " 2011-01-01 01:51:00 FM-15 \n", " 2011-01-01 02:51:00 FM-15 \n", " 2011-01-01 03:51:00 FM-15 \n", " 2011-01-01 04:00:00 FM-12 \n", " 2011-01-01 04:51:00 FM-15 \n", "\n", " HourlyWindDirection \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2010-01-01 00:51:00 060 \n", " 2010-01-01 01:00:00 060 \n", " 2010-01-01 01:04:00 000 \n", " 2010-01-01 01:37:00 000 \n", " 2010-01-01 01:47:00 000 \n", "... ... \n", " 2011-01-01 01:51:00 200 \n", " 2011-01-01 02:51:00 200 \n", " 2011-01-01 03:51:00 200 \n", " 2011-01-01 04:00:00 200 \n", " 2011-01-01 04:51:00 180 \n", "\n", " LONGITUDE \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2010-01-01 00:51:00 -73.88 \n", " 2010-01-01 01:00:00 -73.88 \n", " 2010-01-01 01:04:00 -73.88 \n", " 2010-01-01 01:37:00 -73.88 \n", " 2010-01-01 01:47:00 -73.88 \n", "... ... \n", " 2011-01-01 01:51:00 -73.88 \n", " 2011-01-01 02:51:00 -73.88 \n", " 2011-01-01 03:51:00 -73.88 \n", " 2011-01-01 04:00:00 -73.88 \n", " 2011-01-01 04:51:00 -73.88 \n", "\n", " ELEVATION SOURCE \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2010-01-01 00:51:00 3.4 7 \n", " 2010-01-01 01:00:00 3.4 4 \n", " 2010-01-01 01:04:00 3.4 7 \n", " 2010-01-01 01:37:00 3.4 7 \n", " 2010-01-01 01:47:00 3.4 7 \n", "... ... ... \n", " 2011-01-01 01:51:00 3.4 7 \n", " 2011-01-01 02:51:00 3.4 7 \n", " 2011-01-01 03:51:00 3.4 7 \n", " 2011-01-01 04:00:00 3.4 4 \n", " 2011-01-01 04:51:00 3.4 7 \n", "\n", " HourlyWindSpeed \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2010-01-01 00:51:00 3 \n", " 2010-01-01 01:00:00 3 \n", " 2010-01-01 01:04:00 0 \n", " 2010-01-01 01:37:00 0 \n", " 2010-01-01 01:47:00 0 \n", "... ... \n", " 2011-01-01 01:51:00 8 \n", " 2011-01-01 02:51:00 6 \n", " 2011-01-01 03:51:00 5 \n", " 2011-01-01 04:00:00 5 \n", " 2011-01-01 04:51:00 3 \n", "\n", " LATITUDE \n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2010-01-01 00:51:00 40.7792 \n", " 2010-01-01 01:00:00 40.7792 \n", " 2010-01-01 01:04:00 40.7792 \n", " 2010-01-01 01:37:00 40.7792 \n", " 2010-01-01 01:47:00 40.7792 \n", "... ... \n", " 2011-01-01 01:51:00 40.7792 \n", " 2011-01-01 02:51:00 40.7792 \n", " 2011-01-01 03:51:00 40.7792 \n", " 2011-01-01 04:00:00 40.7792 \n", " 2011-01-01 04:51:00 40.7792 \n", "\n", "[13482 rows x 7 columns]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wind = ncei_api_batch(\n", " dataset='local-climatological-data', stations='72503014732',\n", " start_date='2010-01-01', end_date='2011-01-01', time_delta='1Y',\n", " datatypes=['HourlyWindSpeed', 'HourlyWindDirection']\n", " )\n", "wind" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This output is exactly the same one as for the `ncei_api` function, except that the DataFrame is much longer. Similar processing is required:" ] }, { "cell_type": "code", "execution_count": 6, "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", "
HourlyWindSpeedHourlyWindDirection
STATIONDATE
72503014732 : LA GUARDIA AIRPORT, NY US2010-01-01 00:51:003.060.0
2010-01-01 01:00:003.060.0
2010-01-01 01:04:000.00.0
2010-01-01 01:37:000.00.0
2010-01-01 01:47:000.00.0
.........
2011-01-01 01:51:008.0200.0
2011-01-01 02:51:006.0200.0
2011-01-01 03:51:005.0200.0
2011-01-01 04:00:005.0200.0
2011-01-01 04:51:003.0180.0
\n", "

12846 rows × 2 columns

\n", "
" ], "text/plain": [ " HourlyWindSpeed \\\n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2010-01-01 00:51:00 3.0 \n", " 2010-01-01 01:00:00 3.0 \n", " 2010-01-01 01:04:00 0.0 \n", " 2010-01-01 01:37:00 0.0 \n", " 2010-01-01 01:47:00 0.0 \n", "... ... \n", " 2011-01-01 01:51:00 8.0 \n", " 2011-01-01 02:51:00 6.0 \n", " 2011-01-01 03:51:00 5.0 \n", " 2011-01-01 04:00:00 5.0 \n", " 2011-01-01 04:51:00 3.0 \n", "\n", " HourlyWindDirection \n", "STATION DATE \n", "72503014732 : LA GUARDIA AIRPORT, NY US 2010-01-01 00:51:00 60.0 \n", " 2010-01-01 01:00:00 60.0 \n", " 2010-01-01 01:04:00 0.0 \n", " 2010-01-01 01:37:00 0.0 \n", " 2010-01-01 01:47:00 0.0 \n", "... ... \n", " 2011-01-01 01:51:00 200.0 \n", " 2011-01-01 02:51:00 200.0 \n", " 2011-01-01 03:51:00 200.0 \n", " 2011-01-01 04:00:00 200.0 \n", " 2011-01-01 04:51:00 180.0 \n", "\n", "[12846 rows x 2 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wind_processed = (\n", " wind\n", " .loc[:, ['HourlyWindSpeed', 'HourlyWindDirection']]\n", " .apply(pd.to_numeric, errors='coerce')\n", " .dropna(how='any')\n", ")\n", "wind_processed" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "wind_processed.loc[:, 'HourlyWindSpeed'].plot(kind='hist', facecolor='None', edgecolor='k', lw=1, bins=20)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Additional Functions\n", "The `coastlib.data.noaa_ncei` module has additional functions `ncei_datasets` and `ncei_search`. These functions are useful when exploring what information is available for specific regions and what keywords should be used in the `ncei_api` and `ncei_api_batch` functions.\n", "\n", "### NCEI Datasets\n", "The `ncei_datasets` function should be used to retrieve available NOAA NCEI formats, datasets, and datatypes for given dates, geographical extents, and keywords. Unfortunately, these appear to not be working properly at this moment since the NCEI API is not fully developed and is not properly documented. One way to use it would be as follows:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Formats: ['csv', 'json', 'native', 'netcdf', 'pdf']\n", "\n", "Datasets (first 3): ['avhrr-cloud-properties-patmosx', 'avhrr-reflectance-patmosx', 'daily-summaries']\n", "\n", "Datatypes: dict_keys(['global-summary-of-the-month', 'global-summary-of-the-year', 'global-hourly', 'daily-summaries', 'global-marine', 'global-summary-of-the-day', 'mean-layer-temperature-uah', 'avhrr-reflectance-patmosx', 'local-climatological-data', 'normals-annualseasonal'])\n" ] } ], "source": [ "datasets = ncei_datasets()\n", "print('Formats:', datasets[0], end='\\n\\n')\n", "print('Datasets (first 3):', datasets[1][:3], end='\\n\\n')\n", "print('Datatypes:', datasets[2].keys())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### NCEI Search\n", "The `ncei_search` function should be used to retrieve available NOAA NCEI formats, datasets, and datatypes for given parameters (station IDs, geographical extents, keywords, etc.). Unfortunately, as with the `ncei_datasets`, the NCEI Search API is not documented (current NOAA documentation is completely wrong - their description don't match examples, I had to manually play with different parameters to find out how it works). In addition to absense of any documentation, this API is also broken - certain options have no effect (such as geographical extent). It is unknown when/if NOAA will update it.\n", "\n", "So far, the only meaningful way to use this is to get metadata for known stations:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Datatypes (first 5): ['AWND', 'CDSD', 'CLDD', 'DSNW', 'DailyAverageDewPointTemperature']\n", "\n", "Stations: ['72503014732']\n", "\n", "Results: {'name': 'LA GUARDIA AIRPORT, NY US', 'datatypes': {'Short Duration Precipitation Value 150': 'ShortDurationPrecipitationValue150', 'REPORT_TYPE': 'REPORT_TYPE', 'Short Duration Precipitation Value 030': 'ShortDurationPrecipitationValue030', 'Monthly Sea Level Pressure': 'MonthlySeaLevelPressure', 'Monthly Max Sea Level Pressure Value Date': 'MonthlyMaxSeaLevelPressureValueDate', 'Hourly Sea Level Pressure': 'HourlySeaLevelPressure', 'Daily Maximum Dry Bulb Temperature': 'DailyMaximumDryBulbTemperature', 'Monthly Days With Temperature > 32 Degrees': 'MonthlyDaysWithGT32Temp', 'Monthly Days With Temperature < 32 Degrees': 'MonthlyDaysWithLT32Temp', 'Monthly Max Sea Level Pressure Value Time': 'MonthlyMaxSeaLevelPressureValueTime', 'Monthly Greatest Precip Date': 'MonthlyGreatestPrecipDate', 'Hourly Precipitation': 'HourlyPrecipitation', 'Daily Peak Wind Speed': 'DailyPeakWindSpeed', 'Monthly Station Pressure': 'MonthlyStationPressure', 'Daily Peak Wind Direction': 'DailyPeakWindDirection', 'Short Duration End Date 100': 'ShortDurationEndDate100', 'Monthly Departure From Normal Maximum Temperature': 'MonthlyDepartureFromNormalMaximumTemperature', 'Daily Average Relative Humidity': 'DailyAverageRelativeHumidity', 'Monthly Maximum Temperature': 'MonthlyMaximumTemperature', 'SOURCE': 'SOURCE', 'Hourly Pressure Tendency': 'HourlyPressureTendency', 'Short Duration End Date 060': 'ShortDurationEndDate060', 'Short Duration End Date 180': 'ShortDurationEndDate180', 'Short Duration Precipitation Value 020': 'ShortDurationPrecipitationValue020', 'Long-term Averages of Monthly Cooling Degree Days with Base 65F': 'NormalsCoolingDegreeDay', 'Monthly Departure From Normal Minimum Temperature': 'MonthlyDepartureFromNormalMinimumTemperature', 'Monthly Greatest Snowfall Date': 'MonthlyGreatestSnowfallDate', 'Hourly Pressure Change': 'HourlyPressureChange', 'Daily Sustained Wind Speed': 'DailySustainedWindSpeed', 'Short Duration Precipitation Value 015': 'ShortDurationPrecipitationValue015', 'Monthly Days With > 0.001 Precip': 'MonthlyDaysWithGT001Precip', 'Short Duration Precipitation Value 010': 'ShortDurationPrecipitationValue010', 'Short Duration Precipitation Value 080': 'ShortDurationPrecipitationValue080', 'Daily Snow Depth': 'DailySnowDepth', 'Monthly Days With Temperature > 90 Degrees': 'MonthlyDaysWithGT90Temp', 'Daily Average Wind Speed': 'DailyAverageWindSpeed', 'Hourly Altimeter Setting': 'HourlyAltimeterSetting', 'Heating Degree Days Season to Date': 'HDSD', 'Cooling Degree Days Season to Date': 'CDSD', 'Average Wind Speed for the Month': 'AWND', 'Short Duration End Date 045': 'ShortDurationEndDate045', 'Monthly Departure From Normal Average Temperature': 'MonthlyDepartureFromNormalAverageTemperature', 'Short Duration Precipitation Value 005': 'ShortDurationPrecipitationValue005', 'Sunrise': 'Sunrise', 'REM': 'REM', 'Monthly Departure From Normal Precipitation': 'MonthlyDepartureFromNormalPrecipitation', 'Departure from Long-term Averages of Monthly Heating Degree Days with Base 65F': 'MonthlyDepartureFromNormalHeatingDegreeDays', 'Monthly Max Sea Level Pressure Value': 'MonthlyMaxSeaLevelPressureValue', 'Short Duration Precipitation Value 120': 'ShortDurationPrecipitationValue120', 'Monthly Greatest Snow Depth': 'MonthlyGreatestSnowDepth', 'Monthly Minimum Temperature': 'MonthlyMinimumTemperature', 'Daily Precipitation': 'DailyPrecipitation', 'Daily Average Sea Level Pressure': 'DailyAverageSeaLevelPressure', 'Hourly Wind Speed': 'HourlyWindSpeed', 'Monthly Days With Temperature < 0 Degrees': 'MonthlyDaysWithLT0Temp', 'Hourly Relative Humidity': 'HourlyRelativeHumidity', 'Short Duration End Date 150': 'ShortDurationEndDate150', 'Hourly Present Weather Type': 'HourlyPresentWeatherType', 'Monthly Min Sea Level Pressure Value': 'MonthlyMinSeaLevelPressureValue', 'Daily Departure From Normal Average Temperature': 'DailyDepartureFromNormalAverageTemperature', 'Short Duration End Date 030': 'ShortDurationEndDate030', 'Short Duration Precipitation Value 060': 'ShortDurationPrecipitationValue060', 'Monthly Greatest Snowfall': 'MonthlyGreatestSnowfall', 'Short Duration Precipitation Value 180': 'ShortDurationPrecipitationValue180', 'Heating Degree Days': 'HTDD', 'Hourly Wet Bulb Temperature': 'HourlyWetBulbTemperature', 'Departure from Long-term Averages of Monthly Cooling Degree Days with Base 65F': 'MonthlyDepartureFromNormalCoolingDegreeDays', 'Cooling Degree Days': 'CLDD', 'Number of Days with >= 1.0 inch of Snowfall': 'DSNW', 'Daily Heating Degree Days': 'DailyHeatingDegreeDays', 'Short Duration Precipitation Value 100': 'ShortDurationPrecipitationValue100', 'Monthly Total Snowfall': 'MonthlyTotalSnowfall', 'Short Duration End Date 020': 'ShortDurationEndDate020', 'Daily Snowfall': 'DailySnowfall', 'Daily Average Wet Bulb Temperature': 'DailyAverageWetBulbTemperature', 'Monthly Days With > 0.10 Precip': 'MonthlyDaysWithGT010Precip', 'Monthly Total Liquid Precipitation': 'MonthlyTotalLiquidPrecipitation', 'Monthly Greatest Snow Depth Date': 'MonthlyGreatestSnowDepthDate', 'Daily Minimum Dry Bulb Temperature': 'DailyMinimumDryBulbTemperature', 'Short Duration End Date 015': 'ShortDurationEndDate015', 'Hourly Wind Direction': 'HourlyWindDirection', 'Daily Weather': 'DailyWeather', 'Daily Average Station Pressure': 'DailyAverageStationPressure', 'Daily Average Dry Bulb Temperature': 'DailyAverageDryBulbTemperature', 'Short Duration End Date 010': 'ShortDurationEndDate010', 'Monthly Greatest Precip': 'MonthlyGreatestPrecip', 'Daily Average Dew Point Temperature': 'DailyAverageDewPointTemperature', 'Short Duration End Date 080': 'ShortDurationEndDate080', 'Monthly Min Sea Level Pressure Value Time': 'MonthlyMinSeaLevelPressureValueTime', 'Long-term Averages of Monthly Heating Degree Days with Base 65F': 'NormalsHeatingDegreeDay', 'Hourly Dry Bulb Temperature': 'HourlyDryBulbTemperature', 'Hourly Dew Point Temperature': 'HourlyDewPointTemperature', 'Sunset': 'Sunset', 'Monthly Min Sea Level Pressure Value Date': 'MonthlyMinSeaLevelPressureValueDate', 'Hourly Visibility': 'HourlyVisibility', 'Hourly Wind Gust Speed': 'HourlyWindGustSpeed', 'Hourly Station Pressure': 'HourlyStationPressure', 'Short Duration End Date 005': 'ShortDurationEndDate005', 'Daily Cooling Degree Days': 'DailyCoolingDegreeDays', 'Hourly Sky Conditions': 'HourlySkyConditions', 'Daily Sustained Wind Direction': 'DailySustainedWindDirection', 'Monthly Mean Temperature': 'MonthlyMeanTemperature', 'Short Duration End Date 120': 'ShortDurationEndDate120', 'Short Duration Precipitation Value 045': 'ShortDurationPrecipitationValue045'}}\n" ] } ], "source": [ "ns_data = ncei_search(dataset='local-climatological-data', stations='72503014732', limit=5)\n", "print('Datatypes (first 5):', ns_data[0][:5], end='\\n\\n')\n", "print('Stations:', ns_data[1], end='\\n\\n')\n", "print('Results:', ns_data[2]['72503014732'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Final Remarks\n", "This tutorial doesn't cover all functionality and ways of using the `noaa_ncei` module. Please refer to the [module source code](https://github.com/georgebv/coastlib/blob/master/coastlib/data/noaa_ncei.py) and the API reference for more information on arguments not covered here." ] } ], "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.7.4" } }, "nbformat": 4, "nbformat_minor": 2 }