2018-09-05 15:52:38 -06:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-08-18 15:59:45 -07:00
"<a name=\"top\"></a>\n",
"<div style=\"width:1000 px\">\n",
"\n",
"<div style=\"float:right; width:98 px; height:98px;\">\n",
"<img src=\"https://docs.unidata.ucar.edu/images/logos/unidata_logo_vertical_150x150.png\" alt=\"Unidata Logo\" style=\"height: 98px;\">\n",
"</div>\n",
"\n",
"# Model Sounding Data\n",
"**Python-AWIPS Tutorial Notebook**\n",
"\n",
"<div style=\"clear:both\"></div>\n",
"</div>\n",
"\n",
"---\n",
"\n",
"<div style=\"float:right; width:250 px\"><img src=\"../images/model_sounding_preview.png\" alt=\"preview image of a model sounding skewt and hodograph\" style=\"height: 300px;\"></div>\n",
"\n",
"\n",
"# Objectives\n",
"\n",
"* Use python-awips to connect to an edex server\n",
"* Define and filter data request for model sounding data\n",
"* Create vertical profiles from GFS BUFR products\n",
"* Use MetPy to create [SkewT](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html) and [Hodograph](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.html) plots\n",
"\n",
"---"
2018-09-05 15:52:38 -06:00
]
},
{
2022-08-18 15:59:45 -07:00
"cell_type": "markdown",
2018-09-05 15:52:38 -06:00
"metadata": {
2022-08-18 15:59:45 -07:00
"toc": true
2018-09-05 15:52:38 -06:00
},
2022-08-18 15:59:45 -07:00
"source": [
"<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
"<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Imports\" data-toc-modified-id=\"Imports-1\"><span class=\"toc-item-num\">1 </span>Imports</a></span></li><li><span><a href=\"#EDEX-Connection\" data-toc-modified-id=\"EDEX-Connection-2\"><span class=\"toc-item-num\">2 </span>EDEX Connection</a></span></li><li><span><a href=\"#Setting-Location\" data-toc-modified-id=\"Setting-Location-3\"><span class=\"toc-item-num\">3 </span>Setting Location</a></span><ul class=\"toc-item\"><li><span><a href=\"#Available-Location-Names\" data-toc-modified-id=\"Available-Location-Names-3.1\"><span class=\"toc-item-num\">3.1 </span>Available Location Names</a></span></li><li><span><a href=\"#Setting-the-Location-Name\" data-toc-modified-id=\"Setting-the-Location-Name-3.2\"><span class=\"toc-item-num\">3.2 </span>Setting the Location Name</a></span></li></ul></li><li><span><a href=\"#Filtering-by-Time\" data-toc-modified-id=\"Filtering-by-Time-4\"><span class=\"toc-item-num\">4 </span>Filtering by Time</a></span></li><li><span><a href=\"#Get-the-Data!\" data-toc-modified-id=\"Get-the-Data!-5\"><span class=\"toc-item-num\">5 </span>Get the Data!</a></span></li><li><span><a href=\"#Use-the-Data!\" data-toc-modified-id=\"Use-the-Data!-6\"><span class=\"toc-item-num\">6 </span>Use the Data!</a></span><ul class=\"toc-item\"><li><span><a href=\"#Prepare-data-objects\" data-toc-modified-id=\"Prepare-data-objects-6.1\"><span class=\"toc-item-num\">6.1 </span>Prepare data objects</a></span></li><li><span><a href=\"#Calculate-Dewpoint-from-Specific-Humidity\" data-toc-modified-id=\"Calculate-Dewpoint-from-Specific-Humidity-6.2\"><span class=\"toc-item-num\">6.2 </span>Calculate Dewpoint from Specific Humidity</a></span><ul class=\"toc-item\"><li><span><a href=\"#Method-1\" data-toc-modified-id=\"Method-1-6.2.1\"><span class=\"toc-item-num\">6.2.1 </span>Method 1</a></span></li><li><span><a href=\"#Method-2\" data-toc-modified-id=\"Method-2-6.2.2\"><span class=\"toc-item-num\">6.2.2 </span>Method 2</a></span></li><li><span><a href=\"#Method-3\" data-toc-modified-id=\"Method-3-6.2.3\"><span class=\"toc-item-num\">6.2.3 </span>Method 3</a></span></li></ul></li></ul></li><li><span><a href=\"#Plot-the-Data!\" data-toc-modified-id=\"Plot-the-Data!-7\"><span class=\"toc-item-num\">7 </span>Plot the Data!</a></span></li><li><span><a href=\"#See-Also\" data-toc-modified-id=\"See-Also-8\"><span class=\"toc-item-num\">8 </span>See Also</a></span><ul class=\"toc-item\"><li><span><a href=\"#Related-Notebooks\" data-toc-modified-id=\"Related-Notebooks-8.1\"><span class=\"toc-item-num\">8.1 </span>Related Notebooks</a></span></li><li><span><a href=\"#Additional-Documentation\" data-toc-modified-id=\"Additional-Documentation-8.2\"><span class=\"toc-item-num\">8.2 </span>Additional Documentation</a></span></li></ul></li></ul></div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Imports\n",
"\n",
"The imports below are used throughout the notebook. Note the first import is coming directly from python-awips and allows us to connect to an EDEX server. The subsequent imports are for data manipulation and visualization. "
]
},
{
"cell_type": "code",
2025-02-12 08:45:54 -07:00
"execution_count": 1,
2022-08-18 15:59:45 -07:00
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [],
"source": [
"from awips.dataaccess import DataAccessLayer\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.axes_grid1.inset_locator import inset_axes\n",
"from math import exp, log\n",
"import numpy as np\n",
2022-08-18 15:59:45 -07:00
"from metpy.calc import dewpoint, vapor_pressure, wind_speed, wind_direction\n",
2018-09-05 15:52:38 -06:00
"from metpy.plots import SkewT, Hodograph\n",
2022-08-18 15:59:45 -07:00
"from metpy.units import units"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## EDEX Connection\n",
2018-09-05 15:52:38 -06:00
"\n",
2022-08-19 11:31:09 -07:00
"First we establish a connection to Unidata's public EDEX server. With that connection made, we can create a [new data request object](http://unidata.github.io/python-awips/api/IDataRequest.html) and set the data type to ***modelsounding***, and define additional parameters and an identifier on the request."
2022-08-18 15:59:45 -07:00
]
},
{
"cell_type": "code",
2025-02-12 08:45:54 -07:00
"execution_count": 2,
2022-08-18 15:59:45 -07:00
"metadata": {},
"outputs": [],
"source": [
2025-02-13 13:04:21 -07:00
"DataAccessLayer.changeEDEXHost(\"edex-cloud.unidata.ucar.edu\")\n",
2018-10-11 14:56:26 -06:00
"request = DataAccessLayer.newDataRequest(\"modelsounding\")\n",
2018-09-05 15:52:38 -06:00
"forecastModel = \"GFS\"\n",
"request.addIdentifier(\"reportType\", forecastModel)\n",
2022-08-18 15:59:45 -07:00
"request.setParameters(\"pressure\",\"temperature\",\"specHum\",\"uComp\",\"vComp\")"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-08-18 15:59:45 -07:00
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setting Location\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Available Location Names\n",
2022-08-19 11:31:09 -07:00
"When working with a new data type, it is often useful to investigate all available options for a particular setting. Shown below is how to see all available location names for a data request with type `modelsounding` and `reportType` identifier of `GFS`. This step is not necessary if you already know exactly what the location name(s) you're interested in is."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
2025-02-12 08:45:54 -07:00
"execution_count": 3,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
2025-01-23 14:31:31 -07:00
"['1V4',\n",
" '2I0',\n",
" '2IS',\n",
2018-10-09 13:39:16 -06:00
" '3J2',\n",
" '4BL',\n",
" '4BQ',\n",
" '4HV',\n",
" '4OM',\n",
" '5AF',\n",
" '5AG',\n",
" '5SZ',\n",
" '6RO',\n",
2025-01-23 14:31:31 -07:00
" '82MN',\n",
2018-10-09 13:39:16 -06:00
" '8V7',\n",
2025-01-23 14:31:31 -07:00
" '95E',\n",
2018-10-09 13:39:16 -06:00
" '9B6',\n",
" 'A#2',\n",
" 'A#3',\n",
" 'A#4',\n",
" 'A#5',\n",
" 'A#6',\n",
" 'A#7',\n",
" 'A#8',\n",
" 'A#9',\n",
" 'A#A',\n",
" 'A#B',\n",
2025-01-23 14:31:31 -07:00
" 'A#C',\n",
" 'A#D',\n",
" 'A#E',\n",
2018-10-09 13:39:16 -06:00
" 'ABL',\n",
" 'ADM',\n",
" 'AFA',\n",
" 'AGR',\n",
" 'AHN',\n",
" 'AIH',\n",
" 'AJO',\n",
2025-01-23 14:31:31 -07:00
" 'AKO',\n",
" 'ALTA',\n",
2018-10-09 13:39:16 -06:00
" 'ANJ',\n",
2025-01-23 14:31:31 -07:00
" 'APPL',\n",
2018-10-09 13:39:16 -06:00
" 'APX',\n",
" 'AQQ',\n",
" 'ATH',\n",
" 'ATL1',\n",
" 'ATL2',\n",
" 'ATL3',\n",
" 'ATL4',\n",
2025-01-23 14:31:31 -07:00
" 'ATL5',\n",
" 'ATL6',\n",
2018-10-09 13:39:16 -06:00
" 'ATLH',\n",
" 'AWH',\n",
" 'AWR',\n",
" 'B#1',\n",
" 'B#2',\n",
" 'B#3',\n",
" 'B#4',\n",
" 'B#5',\n",
" 'B#6',\n",
" 'B#7',\n",
" 'B#8',\n",
" 'B#9',\n",
" 'B#A',\n",
" 'B#B',\n",
" 'B#C',\n",
" 'B#D',\n",
" 'B#E',\n",
" 'B#F',\n",
" 'B#G',\n",
" 'B#H',\n",
" 'B#J',\n",
" 'B#K',\n",
" 'B#L',\n",
" 'B#M',\n",
" 'B#N',\n",
" 'B#O',\n",
" 'B#P',\n",
" 'B#Q',\n",
" 'B#S',\n",
2025-01-23 14:31:31 -07:00
" 'B#T',\n",
" 'B#U',\n",
" 'B#V',\n",
" 'B#W',\n",
" 'B#X',\n",
" 'B015',\n",
" 'B40',\n",
" 'B41',\n",
" 'B42',\n",
" 'B43',\n",
" 'B44',\n",
" 'B45',\n",
" 'B46',\n",
" 'B47',\n",
" 'B48',\n",
" 'B49',\n",
2018-10-09 13:39:16 -06:00
" 'BAB',\n",
2025-01-23 14:31:31 -07:00
" 'BAX',\n",
" 'BBD',\n",
2018-10-09 13:39:16 -06:00
" 'BDG',\n",
" 'BDP',\n",
2025-01-23 14:31:31 -07:00
" 'BDS',\n",
2018-10-09 13:39:16 -06:00
" 'BFL',\n",
2025-01-23 14:31:31 -07:00
" 'BFX',\n",
2018-10-09 13:39:16 -06:00
" 'BGTL',\n",
" 'BH1',\n",
" 'BH2',\n",
" 'BH3',\n",
" 'BH4',\n",
" 'BH5',\n",
" 'BHK',\n",
" 'BID',\n",
" 'BIR',\n",
2025-01-23 14:31:31 -07:00
" 'BIV',\n",
" 'BKY',\n",
2018-10-09 13:39:16 -06:00
" 'BLS',\n",
" 'BLU',\n",
" 'BMX',\n",
" 'BNA',\n",
2025-01-23 14:31:31 -07:00
" 'BNY',\n",
2018-10-09 13:39:16 -06:00
" 'BOD',\n",
2025-01-23 14:31:31 -07:00
" 'BON',\n",
" 'BPK',\n",
2018-10-09 13:39:16 -06:00
" 'BRA',\n",
2025-01-23 14:31:31 -07:00
" 'BS1',\n",
" 'BS2',\n",
" 'BS3',\n",
2018-10-09 13:39:16 -06:00
" 'BTL',\n",
" 'BVR',\n",
2025-01-23 14:31:31 -07:00
" 'BYG',\n",
2018-10-09 13:39:16 -06:00
" 'C01',\n",
" 'C02',\n",
" 'C03',\n",
" 'C04',\n",
" 'C06',\n",
" 'C07',\n",
" 'C08',\n",
" 'C09',\n",
" 'C10',\n",
" 'C11',\n",
" 'C12',\n",
" 'C13',\n",
" 'C14',\n",
" 'C18',\n",
" 'C19',\n",
" 'C22',\n",
" 'C23',\n",
" 'C25',\n",
" 'C27',\n",
" 'C28',\n",
" 'C32',\n",
" 'C33',\n",
" 'C34',\n",
" 'C35',\n",
" 'C36',\n",
" 'C7H',\n",
" 'CAI',\n",
" 'CAN',\n",
" 'CBE',\n",
" 'CBN',\n",
2025-01-23 14:31:31 -07:00
" 'CCL',\n",
" 'CCR',\n",
" 'CFC',\n",
2018-10-09 13:39:16 -06:00
" 'CHE',\n",
2025-01-23 14:31:31 -07:00
" 'CHRL',\n",
2018-10-09 13:39:16 -06:00
" 'CKN',\n",
" 'CLD',\n",
" 'CLE',\n",
" 'CLN',\n",
2025-01-23 14:31:31 -07:00
" 'CND',\n",
" 'CNLK',\n",
" 'CNN',\n",
" 'COA',\n",
2018-10-09 13:39:16 -06:00
" 'COL1',\n",
" 'COL2',\n",
" 'COL3',\n",
" 'COL4',\n",
" 'COT',\n",
2025-01-23 14:31:31 -07:00
" 'COV',\n",
2018-10-09 13:39:16 -06:00
" 'CQV',\n",
" 'CRL',\n",
" 'CRR',\n",
2025-01-23 14:31:31 -07:00
" 'CSQ',\n",
2018-10-09 13:39:16 -06:00
" 'CTY',\n",
2025-01-23 14:31:31 -07:00
" 'CVD',\n",
2018-10-09 13:39:16 -06:00
" 'CVM',\n",
" 'CVS',\n",
" 'CWEU',\n",
" 'CWFN',\n",
" 'CWKX',\n",
" 'CWLB',\n",
" 'CWLO',\n",
" 'CWLT',\n",
" 'CWLW',\n",
" 'CWMW',\n",
" 'CWOS',\n",
" 'CWPH',\n",
" 'CWQG',\n",
" 'CWSA',\n",
" 'CWSE',\n",
" 'CWZB',\n",
" 'CWZC',\n",
" 'CWZV',\n",
" 'CYAH',\n",
" 'CYAW',\n",
" 'CYBK',\n",
" 'CYBU',\n",
" 'CYCB',\n",
" 'CYCG',\n",
" 'CYCX',\n",
" 'CYDA',\n",
2025-01-23 14:31:31 -07:00
" 'CYDF',\n",
2018-10-09 13:39:16 -06:00
" 'CYEG',\n",
" 'CYEV',\n",
" 'CYFB',\n",
" 'CYFO',\n",
" 'CYFS',\n",
" 'CYGQ',\n",
" 'CYHM',\n",
" 'CYHZ',\n",
" 'CYJT',\n",
2025-01-23 14:31:31 -07:00
" 'CYKF',\n",
2018-10-09 13:39:16 -06:00
" 'CYLH',\n",
" 'CYLJ',\n",
" 'CYMD',\n",
" 'CYMO',\n",
" 'CYMT',\n",
" 'CYMX',\n",
" 'CYOC',\n",
" 'CYOW',\n",
" 'CYPA',\n",
" 'CYPE',\n",
" 'CYPL',\n",
" 'CYPQ',\n",
" 'CYQA',\n",
" 'CYQD',\n",
" 'CYQG',\n",
" 'CYQH',\n",
" 'CYQI',\n",
" 'CYQK',\n",
2025-01-23 14:31:31 -07:00
" 'CYQM',\n",
2018-10-09 13:39:16 -06:00
" 'CYQQ',\n",
" 'CYQR',\n",
" 'CYQT',\n",
" 'CYQX',\n",
" 'CYQY',\n",
" 'CYRB',\n",
2025-01-23 14:31:31 -07:00
" 'CYSJ',\n",
2018-10-09 13:39:16 -06:00
" 'CYSM',\n",
" 'CYSY',\n",
" 'CYTH',\n",
" 'CYTL',\n",
" 'CYTS',\n",
" 'CYUL',\n",
" 'CYUX',\n",
" 'CYVO',\n",
" 'CYVP',\n",
" 'CYVQ',\n",
" 'CYVR',\n",
" 'CYVV',\n",
" 'CYWA',\n",
" 'CYWG',\n",
" 'CYWO',\n",
" 'CYXC',\n",
" 'CYXE',\n",
" 'CYXH',\n",
" 'CYXS',\n",
" 'CYXU',\n",
" 'CYXX',\n",
" 'CYXY',\n",
" 'CYXZ',\n",
" 'CYYB',\n",
" 'CYYC',\n",
" 'CYYE',\n",
2025-01-23 14:31:31 -07:00
" 'CYYG',\n",
2018-10-09 13:39:16 -06:00
" 'CYYJ',\n",
2025-01-23 14:31:31 -07:00
" 'CYYL',\n",
2018-10-09 13:39:16 -06:00
" 'CYYQ',\n",
" 'CYYR',\n",
" 'CYYT',\n",
" 'CYYZ',\n",
" 'CYZF',\n",
" 'CYZS',\n",
" 'CYZT',\n",
" 'CYZV',\n",
2025-01-23 14:31:31 -07:00
" 'CYZX',\n",
" 'CZC',\n",
" 'D07',\n",
" 'D55',\n",
" 'DDOR',\n",
2018-10-09 13:39:16 -06:00
" 'DEN',\n",
" 'DOV',\n",
" 'DPG',\n",
" 'DSC',\n",
" 'DSD',\n",
" 'DTX',\n",
" 'DVN',\n",
" 'DYS',\n",
" 'E28',\n",
" 'E74',\n",
" 'EAX',\n",
" 'EDW',\n",
" 'EFL',\n",
2025-01-23 14:31:31 -07:00
" 'ELZB',\n",
" 'EMF',\n",
2018-10-09 13:39:16 -06:00
" 'EMP',\n",
" 'END',\n",
" 'ENL',\n",
2025-01-23 14:31:31 -07:00
" 'EON',\n",
2018-10-09 13:39:16 -06:00
" 'ESTC',\n",
2025-01-23 14:31:31 -07:00
" 'EVR',\n",
" 'EVW',\n",
2018-10-09 13:39:16 -06:00
" 'FCS',\n",
" 'FDR',\n",
" 'FFC',\n",
" 'FHU',\n",
" 'FLG',\n",
2025-01-23 14:31:31 -07:00
" 'FLK',\n",
2018-10-09 13:39:16 -06:00
" 'FLP',\n",
2025-01-23 14:31:31 -07:00
" 'FNB',\n",
2018-10-09 13:39:16 -06:00
" 'FPK',\n",
2025-01-23 14:31:31 -07:00
" 'FPS7',\n",
2018-10-09 13:39:16 -06:00
" 'FRI',\n",
2025-01-23 14:31:31 -07:00
" 'FRO',\n",
" 'FRS',\n",
2018-10-09 13:39:16 -06:00
" 'FSI',\n",
2025-01-23 14:31:31 -07:00
" 'FSTK',\n",
2018-10-09 13:39:16 -06:00
" 'FTR',\n",
2025-01-23 14:31:31 -07:00
" 'FTSR',\n",
2018-10-09 13:39:16 -06:00
" 'FWD',\n",
2025-01-23 14:31:31 -07:00
" 'FZP',\n",
2018-10-09 13:39:16 -06:00
" 'G#1',\n",
" 'G#2',\n",
" 'G#3',\n",
" 'G#4',\n",
" 'G#5',\n",
" 'G#6',\n",
" 'G#7',\n",
" 'G#8',\n",
" 'G#9',\n",
" 'G#A',\n",
" 'G#B',\n",
" 'G#C',\n",
" 'G#D',\n",
" 'G#E',\n",
" 'G#F',\n",
" 'G#G',\n",
" 'G001',\n",
" 'G003',\n",
" 'G004',\n",
" 'G005',\n",
" 'G007',\n",
" 'G009',\n",
2025-01-23 14:31:31 -07:00
" 'G010',\n",
" 'G011',\n",
2018-10-09 13:39:16 -06:00
" 'GDP',\n",
" 'GDV',\n",
" 'GLRY',\n",
" 'GMX1',\n",
" 'GNB',\n",
" 'GNC',\n",
" 'GRF',\n",
2025-01-23 14:31:31 -07:00
" 'GRMM',\n",
" 'GRUN',\n",
2018-10-09 13:39:16 -06:00
" 'GTB',\n",
" 'GTP',\n",
2025-01-23 14:31:31 -07:00
" 'GVH',\n",
2018-10-09 13:39:16 -06:00
" 'GVL',\n",
" 'GVS',\n",
2025-01-23 14:31:31 -07:00
" 'GVY',\n",
2018-10-09 13:39:16 -06:00
" 'GYX',\n",
" 'H02',\n",
" 'HAY',\n",
" 'HGR',\n",
2025-01-23 14:31:31 -07:00
" 'HLD',\n",
" 'HMM',\n",
2018-10-09 13:39:16 -06:00
" 'HMN',\n",
2025-01-23 14:31:31 -07:00
" 'HNR',\n",
2018-10-09 13:39:16 -06:00
" 'HOM',\n",
" 'HOO',\n",
" 'HSI',\n",
" 'HYR',\n",
" 'ICC',\n",
" 'IGM',\n",
2025-01-23 14:31:31 -07:00
" 'IJD',\n",
2018-10-09 13:39:16 -06:00
" 'ILN',\n",
" 'ILS',\n",
" 'ILX',\n",
" 'IMT',\n",
" 'INK',\n",
2025-01-23 14:31:31 -07:00
" 'INV',\n",
2018-10-09 13:39:16 -06:00
" 'IPX',\n",
2025-01-23 14:31:31 -07:00
" 'ISQ',\n",
" 'IVNH',\n",
2018-10-09 13:39:16 -06:00
" 'JACK',\n",
2025-01-23 14:31:31 -07:00
" 'JAYV',\n",
" 'JCT',\n",
2018-10-09 13:39:16 -06:00
" 'JDN',\n",
2025-01-23 14:31:31 -07:00
" 'JHN',\n",
" 'JOES',\n",
" 'JPB',\n",
" 'JWG',\n",
" 'K13K',\n",
" 'K1A6',\n",
" 'K1H2',\n",
" 'K20V',\n",
" 'K2G4',\n",
" 'K2V5',\n",
" 'K36U',\n",
" 'K3LF',\n",
2018-10-09 13:39:16 -06:00
" 'K40B',\n",
2025-01-23 14:31:31 -07:00
" 'K48I',\n",
" 'K4MB',\n",
" 'K4S3',\n",
" 'K5J0',\n",
" 'K8K2',\n",
" 'K9D1',\n",
" 'K9K7',\n",
" 'K9K8',\n",
2018-10-09 13:39:16 -06:00
" 'K9V9',\n",
2025-01-23 14:31:31 -07:00
" 'KAAT',\n",
2018-10-09 13:39:16 -06:00
" 'KABE',\n",
" 'KABI',\n",
" 'KABQ',\n",
" 'KABR',\n",
" 'KABY',\n",
" 'KACK',\n",
" 'KACT',\n",
" 'KACV',\n",
" 'KACY',\n",
2025-01-23 14:31:31 -07:00
" 'KAEL',\n",
" 'KAFJ',\n",
" 'KAFO',\n",
2018-10-09 13:39:16 -06:00
" 'KAGC',\n",
" 'KAGS',\n",
" 'KAHN',\n",
2025-01-23 14:31:31 -07:00
" 'KAIA',\n",
" 'KAIB',\n",
2018-10-09 13:39:16 -06:00
" 'KAK',\n",
2025-01-23 14:31:31 -07:00
" 'KAKP',\n",
2018-10-09 13:39:16 -06:00
" 'KALB',\n",
" 'KALI',\n",
" 'KALO',\n",
" 'KALS',\n",
" 'KALW',\n",
" 'KAMA',\n",
" 'KAN',\n",
" 'KANB',\n",
" 'KAND',\n",
" 'KAOO',\n",
" 'KAPA',\n",
" 'KAPN',\n",
2025-01-23 14:31:31 -07:00
" 'KAQP',\n",
" 'KARA',\n",
" 'KARR',\n",
2018-10-09 13:39:16 -06:00
" 'KART',\n",
" 'KASE',\n",
" 'KAST',\n",
" 'KATL',\n",
" 'KATY',\n",
" 'KAUG',\n",
" 'KAUS',\n",
" 'KAUW',\n",
" 'KAVL',\n",
" 'KAVP',\n",
" 'KAXN',\n",
" 'KAYS',\n",
" 'KAZO',\n",
" 'KBAF',\n",
2025-01-23 14:31:31 -07:00
" 'KBBG',\n",
" 'KBBW',\n",
2018-10-09 13:39:16 -06:00
" 'KBCE',\n",
" 'KBDE',\n",
" 'KBDL',\n",
" 'KBDR',\n",
" 'KBED',\n",
" 'KBFD',\n",
" 'KBFF',\n",
" 'KBFI',\n",
" 'KBFL',\n",
2025-01-23 14:31:31 -07:00
" 'KBFM',\n",
2018-10-09 13:39:16 -06:00
" 'KBGM',\n",
" 'KBGR',\n",
" 'KBHB',\n",
" 'KBHM',\n",
2025-01-23 14:31:31 -07:00
" 'KBIE',\n",
2018-10-09 13:39:16 -06:00
" 'KBIH',\n",
" 'KBIL',\n",
" 'KBIS',\n",
" 'KBJC',\n",
" 'KBJI',\n",
" 'KBKE',\n",
" 'KBKW',\n",
2025-01-23 14:31:31 -07:00
" 'KBKX',\n",
2018-10-09 13:39:16 -06:00
" 'KBLF',\n",
" 'KBLH',\n",
" 'KBLI',\n",
2025-01-23 14:31:31 -07:00
" 'KBMG',\n",
" 'KBMI',\n",
2018-10-09 13:39:16 -06:00
" 'KBML',\n",
" 'KBNA',\n",
" 'KBNO',\n",
" 'KBNV',\n",
" 'KBOI',\n",
" 'KBOS',\n",
2025-01-23 14:31:31 -07:00
" 'KBPI',\n",
2018-10-09 13:39:16 -06:00
" 'KBPT',\n",
" 'KBQK',\n",
" 'KBRD',\n",
" 'KBRL',\n",
" 'KBRO',\n",
" 'KBTL',\n",
" 'KBTM',\n",
" 'KBTR',\n",
" 'KBTV',\n",
" 'KBUF',\n",
" 'KBUR',\n",
" 'KBVI',\n",
2025-01-23 14:31:31 -07:00
" 'KBVN',\n",
" 'KBVO',\n",
2018-10-09 13:39:16 -06:00
" 'KBVX',\n",
" 'KBVY',\n",
" 'KBWG',\n",
" 'KBWI',\n",
" 'KBYI',\n",
" 'KBZN',\n",
2025-01-23 14:31:31 -07:00
" 'KC1',\n",
" 'KCAD',\n",
2018-10-09 13:39:16 -06:00
" 'KCAE',\n",
" 'KCAK',\n",
" 'KCAR',\n",
" 'KCDC',\n",
" 'KCDR',\n",
" 'KCDS',\n",
" 'KCEC',\n",
" 'KCEF',\n",
2025-01-23 14:31:31 -07:00
" 'KCEZ',\n",
" 'KCFV',\n",
2018-10-09 13:39:16 -06:00
" 'KCGI',\n",
" 'KCGX',\n",
" 'KCHA',\n",
" 'KCHH',\n",
" 'KCHO',\n",
" 'KCHS',\n",
2025-01-23 14:31:31 -07:00
" 'KCIC',\n",
2018-10-09 13:39:16 -06:00
" 'KCID',\n",
" 'KCIU',\n",
" 'KCKB',\n",
" 'KCKL',\n",
" 'KCLE',\n",
" 'KCLL',\n",
" 'KCLM',\n",
" 'KCLT',\n",
" 'KCMH',\n",
" 'KCMI',\n",
" 'KCMX',\n",
2025-01-23 14:31:31 -07:00
" 'KCNB',\n",
" 'KCNK',\n",
2018-10-09 13:39:16 -06:00
" 'KCNM',\n",
" 'KCNU',\n",
2025-01-23 14:31:31 -07:00
" 'KCNY',\n",
2018-10-09 13:39:16 -06:00
" 'KCOD',\n",
" 'KCOE',\n",
" 'KCON',\n",
" 'KCOS',\n",
" 'KCOU',\n",
" 'KCPR',\n",
" 'KCRE',\n",
" 'KCRP',\n",
" 'KCRQ',\n",
" 'KCRW',\n",
" 'KCSG',\n",
2025-01-23 14:31:31 -07:00
" 'KCSM',\n",
2018-10-09 13:39:16 -06:00
" 'KCSV',\n",
" 'KCTB',\n",
" 'KCVG',\n",
2025-01-23 14:31:31 -07:00
" 'KCXO',\n",
2018-10-09 13:39:16 -06:00
" 'KCYS',\n",
" 'KDAB',\n",
2025-01-23 14:31:31 -07:00
" 'KDAF',\n",
2018-10-09 13:39:16 -06:00
" 'KDAG',\n",
" 'KDAL',\n",
" 'KDAN',\n",
" 'KDAY',\n",
" 'KDBQ',\n",
" 'KDCA',\n",
" 'KDDC',\n",
" 'KDEC',\n",
2025-01-23 14:31:31 -07:00
" 'KDEH',\n",
2018-10-09 13:39:16 -06:00
" 'KDEN',\n",
" 'KDET',\n",
" 'KDFW',\n",
" 'KDHN',\n",
" 'KDHT',\n",
" 'KDIK',\n",
" 'KDLH',\n",
2025-01-23 14:31:31 -07:00
" 'KDLL',\n",
2018-10-09 13:39:16 -06:00
" 'KDLS',\n",
" 'KDMN',\n",
2025-01-23 14:31:31 -07:00
" 'KDNV',\n",
2018-10-09 13:39:16 -06:00
" 'KDPA',\n",
" 'KDRA',\n",
" 'KDRO',\n",
" 'KDRT',\n",
" 'KDSM',\n",
2025-01-23 14:31:31 -07:00
" 'KDTL',\n",
2018-10-09 13:39:16 -06:00
" 'KDTW',\n",
2025-01-23 14:31:31 -07:00
" 'KDUB',\n",
2018-10-09 13:39:16 -06:00
" 'KDUG',\n",
" 'KDUJ',\n",
2025-01-23 14:31:31 -07:00
" 'KEAR',\n",
2018-10-09 13:39:16 -06:00
" 'KEAT',\n",
" 'KEAU',\n",
" 'KECG',\n",
2025-01-23 14:31:31 -07:00
" 'KECS',\n",
" 'KEE0',\n",
2018-10-09 13:39:16 -06:00
" 'KEED',\n",
2025-01-23 14:31:31 -07:00
" 'KEET',\n",
2018-10-09 13:39:16 -06:00
" 'KEGE',\n",
2025-01-23 14:31:31 -07:00
" 'KEHA',\n",
2018-10-09 13:39:16 -06:00
" 'KEKN',\n",
" 'KEKO',\n",
2025-01-23 14:31:31 -07:00
" 'KEKQ',\n",
2018-10-09 13:39:16 -06:00
" 'KEL',\n",
" 'KELD',\n",
" 'KELM',\n",
2025-01-23 14:31:31 -07:00
" 'KELN',\n",
2018-10-09 13:39:16 -06:00
" 'KELO',\n",
" 'KELP',\n",
" 'KELY',\n",
2025-01-23 14:31:31 -07:00
" 'KEMM',\n",
" 'KEMP',\n",
2018-10-09 13:39:16 -06:00
" 'KENV',\n",
2025-01-23 14:31:31 -07:00
" 'KENW',\n",
2018-10-09 13:39:16 -06:00
" 'KEPH',\n",
" 'KEPO',\n",
" 'KEPZ',\n",
" 'KERI',\n",
2025-01-23 14:31:31 -07:00
" 'KERY',\n",
" 'KESC',\n",
2018-10-09 13:39:16 -06:00
" 'KESF',\n",
" 'KEUG',\n",
" 'KEVV',\n",
" 'KEWB',\n",
" 'KEWN',\n",
" 'KEWR',\n",
" 'KEYW',\n",
" 'KFAM',\n",
" 'KFAR',\n",
" 'KFAT',\n",
" 'KFAY',\n",
" 'KFDY',\n",
" 'KFKL',\n",
2025-01-23 14:31:31 -07:00
" 'KFLD',\n",
2018-10-09 13:39:16 -06:00
" 'KFLG',\n",
" 'KFLL',\n",
" 'KFLO',\n",
2025-01-23 14:31:31 -07:00
" 'KFMH',\n",
2018-10-09 13:39:16 -06:00
" 'KFMN',\n",
" 'KFMY',\n",
2025-01-23 14:31:31 -07:00
" 'KFNL',\n",
2018-10-09 13:39:16 -06:00
" 'KFNT',\n",
2025-01-23 14:31:31 -07:00
" 'KFOD',\n",
2018-10-09 13:39:16 -06:00
" 'KFOE',\n",
" 'KFPR',\n",
" 'KFRM',\n",
" 'KFSD',\n",
" 'KFSM',\n",
2025-01-23 14:31:31 -07:00
" 'KFTK',\n",
2018-10-09 13:39:16 -06:00
" 'KFTW',\n",
" 'KFTY',\n",
" 'KFVE',\n",
" 'KFVX',\n",
" 'KFWA',\n",
" 'KFXE',\n",
" 'KFYV',\n",
" 'KGAG',\n",
2025-01-23 14:31:31 -07:00
" 'KGBD',\n",
" 'KGBG',\n",
2018-10-09 13:39:16 -06:00
" 'KGCC',\n",
" 'KGCK',\n",
" 'KGCN',\n",
" 'KGEG',\n",
2025-01-23 14:31:31 -07:00
" 'KGEY',\n",
2018-10-09 13:39:16 -06:00
" 'KGFK',\n",
" 'KGFL',\n",
" 'KGGG',\n",
" 'KGGW',\n",
" 'KGJT',\n",
2025-01-23 14:31:31 -07:00
" 'KGKL',\n",
2018-10-09 13:39:16 -06:00
" 'KGLD',\n",
" 'KGLH',\n",
" 'KGLS',\n",
" 'KGMU',\n",
" 'KGNR',\n",
" 'KGNV',\n",
" 'KGON',\n",
2025-01-23 14:31:31 -07:00
" 'KGPI',\n",
2018-10-09 13:39:16 -06:00
" 'KGPT',\n",
" 'KGRB',\n",
" 'KGRI',\n",
2025-01-23 14:31:31 -07:00
" 'KGRK',\n",
2018-10-09 13:39:16 -06:00
" 'KGRR',\n",
2025-01-23 14:31:31 -07:00
" 'KGSB',\n",
2018-10-09 13:39:16 -06:00
" 'KGSO',\n",
" 'KGSP',\n",
" 'KGTF',\n",
" 'KGUC',\n",
" 'KGUP',\n",
2025-01-23 14:31:31 -07:00
" 'KGUY',\n",
2018-10-09 13:39:16 -06:00
" 'KGWO',\n",
2025-01-23 14:31:31 -07:00
" 'KGXA',\n",
" 'KGXY',\n",
2018-10-09 13:39:16 -06:00
" 'KGYY',\n",
" 'KGZH',\n",
" 'KHAT',\n",
2025-01-23 14:31:31 -07:00
" 'KHBG',\n",
2018-10-09 13:39:16 -06:00
" 'KHBR',\n",
2025-01-23 14:31:31 -07:00
" 'KHCO',\n",
" 'KHDE',\n",
2018-10-09 13:39:16 -06:00
" 'KHDN',\n",
2025-01-23 14:31:31 -07:00
" 'KHFD',\n",
" 'KHFJ',\n",
2018-10-09 13:39:16 -06:00
" 'KHIB',\n",
2025-01-23 14:31:31 -07:00
" 'KHIE',\n",
2018-10-09 13:39:16 -06:00
" 'KHIO',\n",
2025-01-23 14:31:31 -07:00
" 'KHJH',\n",
2018-10-09 13:39:16 -06:00
" 'KHKY',\n",
2025-01-23 14:31:31 -07:00
" 'KHLC',\n",
2018-10-09 13:39:16 -06:00
" 'KHLG',\n",
" 'KHLN',\n",
2025-01-23 14:31:31 -07:00
" 'KHNR',\n",
2018-10-09 13:39:16 -06:00
" 'KHOB',\n",
" 'KHON',\n",
" 'KHOT',\n",
" 'KHOU',\n",
" 'KHPN',\n",
" 'KHQM',\n",
" 'KHRL',\n",
" 'KHRO',\n",
" 'KHSV',\n",
" 'KHTH',\n",
" 'KHTS',\n",
" 'KHUF',\n",
" 'KHUL',\n",
" 'KHUT',\n",
" 'KHVN',\n",
" 'KHVR',\n",
2025-01-23 14:31:31 -07:00
" 'KHXD',\n",
2018-10-09 13:39:16 -06:00
" 'KHYA',\n",
2025-01-23 14:31:31 -07:00
" 'KHYS',\n",
2018-10-09 13:39:16 -06:00
" 'KIAD',\n",
" 'KIAG',\n",
" 'KIAH',\n",
2025-01-23 14:31:31 -07:00
" 'KICR',\n",
2018-10-09 13:39:16 -06:00
" 'KICT',\n",
" 'KIDA',\n",
2025-01-23 14:31:31 -07:00
" 'KIDI',\n",
" 'KIEN',\n",
" 'KIJX',\n",
" 'KIKK',\n",
2018-10-09 13:39:16 -06:00
" 'KIL',\n",
" 'KILG',\n",
" 'KILM',\n",
2025-01-23 14:31:31 -07:00
" 'KIML',\n",
" 'KIMM',\n",
2018-10-09 13:39:16 -06:00
" 'KIND',\n",
" 'KINK',\n",
" 'KINL',\n",
" 'KINT',\n",
" 'KINW',\n",
2025-01-23 14:31:31 -07:00
" 'KIOB',\n",
" 'KIOW',\n",
2018-10-09 13:39:16 -06:00
" 'KIPL',\n",
" 'KIPT',\n",
2025-01-23 14:31:31 -07:00
" 'KISM',\n",
2018-10-09 13:39:16 -06:00
" 'KISN',\n",
2025-01-23 14:31:31 -07:00
" 'KISO',\n",
2018-10-09 13:39:16 -06:00
" 'KISP',\n",
2025-01-23 14:31:31 -07:00
" 'KISW',\n",
2018-10-09 13:39:16 -06:00
" 'KITH',\n",
" 'KIWD',\n",
2025-01-23 14:31:31 -07:00
" 'KIXA',\n",
2018-10-09 13:39:16 -06:00
" 'KJAC',\n",
" 'KJAN',\n",
" 'KJAX',\n",
" 'KJBR',\n",
" 'KJFK',\n",
" 'KJHW',\n",
" 'KJKL',\n",
" 'KJLN',\n",
2025-01-23 14:31:31 -07:00
" 'KJMR',\n",
2018-10-09 13:39:16 -06:00
" 'KJMS',\n",
" 'KJST',\n",
2025-01-23 14:31:31 -07:00
" 'KJVL',\n",
2018-10-09 13:39:16 -06:00
" 'KJXN',\n",
2025-01-23 14:31:31 -07:00
" 'KJYR',\n",
" 'KK68',\n",
2018-10-09 13:39:16 -06:00
" 'KKL',\n",
" 'KLAF',\n",
" 'KLAN',\n",
" 'KLAR',\n",
" 'KLAS',\n",
" 'KLAX',\n",
" 'KLBB',\n",
" 'KLBE',\n",
" 'KLBF',\n",
2025-01-23 14:31:31 -07:00
" 'KLBL',\n",
" 'KLBX',\n",
2018-10-09 13:39:16 -06:00
" 'KLCB',\n",
2025-01-23 14:31:31 -07:00
" 'KLCG',\n",
2018-10-09 13:39:16 -06:00
" 'KLCH',\n",
2025-01-23 14:31:31 -07:00
" 'KLCK',\n",
" 'KLDM',\n",
" 'KLDN',\n",
2018-10-09 13:39:16 -06:00
" 'KLEB',\n",
2025-01-23 14:31:31 -07:00
" 'KLEE',\n",
" 'KLEW',\n",
2018-10-09 13:39:16 -06:00
" 'KLEX',\n",
" 'KLFK',\n",
" 'KLFT',\n",
2025-01-23 14:31:31 -07:00
" 'KLG',\n",
2018-10-09 13:39:16 -06:00
" 'KLGA',\n",
" 'KLGB',\n",
" 'KLGU',\n",
" 'KLIT',\n",
2025-01-23 14:31:31 -07:00
" 'KLJF',\n",
" 'KLKN',\n",
2018-10-09 13:39:16 -06:00
" 'KLMT',\n",
" 'KLND',\n",
" 'KLNK',\n",
2025-01-23 14:31:31 -07:00
" 'KLNL',\n",
" 'KLNR',\n",
" 'KLNS',\n",
2018-10-09 13:39:16 -06:00
" 'KLOL',\n",
" 'KLOZ',\n",
" 'KLRD',\n",
2025-01-23 14:31:31 -07:00
" 'KLRU',\n",
" 'KLS',\n",
2018-10-09 13:39:16 -06:00
" 'KLSE',\n",
" 'KLUK',\n",
2025-01-23 14:31:31 -07:00
" 'KLVK',\n",
2018-10-09 13:39:16 -06:00
" 'KLVS',\n",
" 'KLWB',\n",
" 'KLWM',\n",
" 'KLWS',\n",
" 'KLWT',\n",
2025-01-23 14:31:31 -07:00
" 'KLWV',\n",
" 'KLXL',\n",
" 'KLXN',\n",
2018-10-09 13:39:16 -06:00
" 'KLYH',\n",
" 'KLZK',\n",
" 'KMAF',\n",
2025-01-23 14:31:31 -07:00
" 'KMBL',\n",
2018-10-09 13:39:16 -06:00
" 'KMBS',\n",
" 'KMCB',\n",
" 'KMCE',\n",
" 'KMCI',\n",
" 'KMCN',\n",
" 'KMCO',\n",
" 'KMCW',\n",
2025-01-23 14:31:31 -07:00
" 'KMDH',\n",
2018-10-09 13:39:16 -06:00
" 'KMDN',\n",
" 'KMDT',\n",
" 'KMDW',\n",
2025-01-23 14:31:31 -07:00
" 'KMDZ',\n",
2018-10-09 13:39:16 -06:00
" 'KMEI',\n",
" 'KMEM',\n",
" 'KMFD',\n",
" 'KMFE',\n",
" 'KMFR',\n",
2025-01-23 14:31:31 -07:00
" 'KMGC',\n",
2018-10-09 13:39:16 -06:00
" 'KMGM',\n",
" 'KMGW',\n",
" 'KMHE',\n",
" 'KMHK',\n",
2025-01-23 14:31:31 -07:00
" 'KMHR',\n",
2018-10-09 13:39:16 -06:00
" 'KMHT',\n",
2025-01-23 14:31:31 -07:00
" 'KMHV',\n",
2018-10-09 13:39:16 -06:00
" 'KMHX',\n",
" 'KMIA',\n",
2025-01-23 14:31:31 -07:00
" 'KMIB',\n",
2018-10-09 13:39:16 -06:00
" 'KMIV',\n",
" 'KMKC',\n",
" 'KMKE',\n",
" 'KMKG',\n",
" 'KMKL',\n",
2025-01-23 14:31:31 -07:00
" 'KMKX',\n",
2018-10-09 13:39:16 -06:00
" 'KMLB',\n",
" 'KMLC',\n",
" 'KMLI',\n",
" 'KMLS',\n",
" 'KMLT',\n",
" 'KMLU',\n",
2025-01-23 14:31:31 -07:00
" 'KMML',\n",
2018-10-09 13:39:16 -06:00
" 'KMMU',\n",
2025-01-23 14:31:31 -07:00
" 'KMNM',\n",
2018-10-09 13:39:16 -06:00
" 'KMOB',\n",
2025-01-23 14:31:31 -07:00
" 'KMOP',\n",
2018-10-09 13:39:16 -06:00
" 'KMOT',\n",
2025-01-23 14:31:31 -07:00
" 'KMPH',\n",
2018-10-09 13:39:16 -06:00
" 'KMPV',\n",
" 'KMQT',\n",
" 'KMRB',\n",
2025-01-23 14:31:31 -07:00
" 'KMRJ',\n",
2018-10-09 13:39:16 -06:00
" 'KMRY',\n",
" 'KMSL',\n",
" 'KMSN',\n",
" 'KMSO',\n",
" 'KMSP',\n",
" 'KMSS',\n",
2025-01-23 14:31:31 -07:00
" 'KMSV',\n",
2018-10-09 13:39:16 -06:00
" 'KMSY',\n",
2025-01-23 14:31:31 -07:00
" 'KMTH',\n",
2018-10-09 13:39:16 -06:00
" 'KMTJ',\n",
" 'KMTN',\n",
2025-01-23 14:31:31 -07:00
" 'KMTO',\n",
" 'KMTW',\n",
" 'KMVL',\n",
2018-10-09 13:39:16 -06:00
" 'KMWH',\n",
" 'KMYR',\n",
2025-01-23 14:31:31 -07:00
" 'KMYZ',\n",
2018-10-09 13:39:16 -06:00
" 'KNA',\n",
" 'KNEW',\n",
" 'KNL',\n",
" 'KNSI',\n",
2025-01-23 14:31:31 -07:00
" 'KOAJ',\n",
2018-10-09 13:39:16 -06:00
" 'KOAK',\n",
" 'KOFK',\n",
2025-01-23 14:31:31 -07:00
" 'KOGA',\n",
" 'KOGB',\n",
2018-10-09 13:39:16 -06:00
" 'KOGD',\n",
" 'KOKC',\n",
" 'KOLM',\n",
2025-01-23 14:31:31 -07:00
" 'KOLU',\n",
2018-10-09 13:39:16 -06:00
" 'KOMA',\n",
2025-01-23 14:31:31 -07:00
" 'KONL',\n",
2018-10-09 13:39:16 -06:00
" 'KONT',\n",
" 'KOPF',\n",
" 'KOQU',\n",
" 'KORD',\n",
2025-01-23 14:31:31 -07:00
" 'KORE',\n",
2018-10-09 13:39:16 -06:00
" 'KORF',\n",
" 'KORH',\n",
" 'KOSH',\n",
" 'KOTH',\n",
" 'KOTM',\n",
2025-01-23 14:31:31 -07:00
" 'KOTX',\n",
" 'KOVO',\n",
" 'KOWB',\n",
2018-10-09 13:39:16 -06:00
" 'KP11',\n",
2025-01-23 14:31:31 -07:00
" 'KP28',\n",
2018-10-09 13:39:16 -06:00
" 'KP38',\n",
2025-01-23 14:31:31 -07:00
" 'KP59',\n",
" 'KP60',\n",
2018-10-09 13:39:16 -06:00
" 'KPAE',\n",
" 'KPAH',\n",
" 'KPBF',\n",
2025-01-23 14:31:31 -07:00
" 'KPBG',\n",
2018-10-09 13:39:16 -06:00
" 'KPBI',\n",
" 'KPDK',\n",
" 'KPDT',\n",
" 'KPDX',\n",
2025-01-23 14:31:31 -07:00
" 'KPEQ',\n",
2018-10-09 13:39:16 -06:00
" 'KPFN',\n",
" 'KPGA',\n",
2025-01-23 14:31:31 -07:00
" 'KPGV',\n",
" 'KPHD',\n",
2018-10-09 13:39:16 -06:00
" 'KPHF',\n",
2025-01-23 14:31:31 -07:00
" 'KPHG',\n",
2018-10-09 13:39:16 -06:00
" 'KPHL',\n",
" 'KPHN',\n",
" 'KPHX',\n",
" 'KPIA',\n",
" 'KPIB',\n",
" 'KPIE',\n",
" 'KPIH',\n",
" 'KPIR',\n",
" 'KPIT',\n",
" 'KPKB',\n",
" 'KPLN',\n",
" 'KPMD',\n",
2025-01-23 14:31:31 -07:00
" 'KPNA',\n",
2018-10-09 13:39:16 -06:00
" 'KPNC',\n",
" 'KPNE',\n",
" 'KPNS',\n",
2025-01-23 14:31:31 -07:00
" 'KPNT',\n",
" 'KPOB',\n",
" 'KPOE',\n",
" 'KPOF',\n",
2018-10-09 13:39:16 -06:00
" 'KPOU',\n",
2025-01-23 14:31:31 -07:00
" 'KPOY',\n",
2018-10-09 13:39:16 -06:00
" 'KPQI',\n",
" 'KPRB',\n",
" 'KPRC',\n",
" 'KPSC',\n",
2025-01-23 14:31:31 -07:00
" 'KPSF',\n",
2018-10-09 13:39:16 -06:00
" 'KPSM',\n",
2025-01-23 14:31:31 -07:00
" 'KPSO',\n",
2018-10-09 13:39:16 -06:00
" 'KPSP',\n",
" 'KPTK',\n",
" 'KPUB',\n",
2018-10-05 17:09:43 -06:00
" ...]"
2018-09-05 15:52:38 -06:00
]
},
2025-02-12 08:45:54 -07:00
"execution_count": 3,
2018-09-05 15:52:38 -06:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"locations = DataAccessLayer.getAvailableLocationNames(request)\n",
"locations.sort()\n",
"list(locations)"
]
},
2022-08-18 15:59:45 -07:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setting the Location Name\n",
"\n",
"In this case we're setting the location name to `KFRM` which is the Municipal Airport in Fairmont, Minnesota."
]
},
2018-09-05 15:52:38 -06:00
{
"cell_type": "code",
2025-02-12 08:45:54 -07:00
"execution_count": 4,
2022-08-18 15:59:45 -07:00
"metadata": {},
"outputs": [],
"source": [
"request.setLocationNames(\"KFRM\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Filtering by Time\n",
"\n",
"Models produce many different time variants during their runs, so let's limit the data to the most recent time and forecast run."
]
},
{
"cell_type": "code",
2025-02-12 08:45:54 -07:00
"execution_count": 5,
2018-09-06 12:12:07 -06:00
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [],
"source": [
"cycles = DataAccessLayer.getAvailableTimes(request, True)\n",
"times = DataAccessLayer.getAvailableTimes(request)\n",
"\n",
"try:\n",
" fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times)\n",
" list(fcstRun)\n",
" response = DataAccessLayer.getGeometryData(request,[fcstRun[0]])\n",
"except:\n",
" print('No times available')\n",
" exit"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-08-18 15:59:45 -07:00
"<a href=\"#top\">Top</a>\n",
2018-09-05 15:52:38 -06:00
"\n",
2022-08-18 15:59:45 -07:00
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Get the Data!\n",
"\n",
"Here we can now request our data response from the EDEX server with our defined time filter.\n",
"Printing out some data about the response verifies we received the data we were interested in."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
2025-02-12 08:45:54 -07:00
"execution_count": 6,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2022-08-18 15:59:45 -07:00
"parms = ['temperature', 'pressure', 'vComp', 'uComp', 'specHum']\n",
2018-10-09 13:39:16 -06:00
"site = KFRM\n",
2025-01-23 14:31:31 -07:00
"geom = POINT (-94.41999816894531 43.650001525878906)\n",
2025-02-12 17:02:03 -07:00
"datetime = 2025-02-12 18:00:00 (0)\n",
"reftime = Feb 12 25 18:00:00 GMT\n",
2018-09-06 12:12:07 -06:00
"fcstHour = 0\n",
2025-02-12 17:02:03 -07:00
"period = (Feb 12 25 18:00:00 , Feb 12 25 18:00:00 )\n"
2018-09-05 15:52:38 -06:00
]
}
],
"source": [
2022-08-18 15:59:45 -07:00
"obj = response[0]\n",
"\n",
"print(\"parms = \" + str(obj.getParameters()))\n",
"print(\"site = \" + str(obj.getLocationName()))\n",
"print(\"geom = \" + str(obj.getGeometry()))\n",
"print(\"datetime = \" + str(obj.getDataTime()))\n",
"print(\"reftime = \" + str(obj.getDataTime().getRefTime()))\n",
"print(\"fcstHour = \" + str(obj.getDataTime().getFcstTime()))\n",
"print(\"period = \" + str(obj.getDataTime().getValidPeriod()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Use the Data!\n",
"\n",
"Since we filtered on time, and requested the data in the previous cell, we now have a `response` object we can work with."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Prepare data objects\n",
"\n",
"Here we construct arrays for each parameter to plot (temperature, pressure, moisture (spec. humidity), wind components, and cloud cover). We have two sets of arrays for temperature and pressure, where the second set only has values as long as the specific humidity is not zero. That is because we are going to do some calculations with specific humidity, temperature, and pressure and we need all those arrays to be the same length, and for the specific humidty to not equal zero."
]
},
{
"cell_type": "code",
2025-02-12 08:45:54 -07:00
"execution_count": 7,
2022-08-18 15:59:45 -07:00
"metadata": {},
"outputs": [],
"source": [
"# Create new arrays to populate from our response objects\n",
"tmp,prs,sh,prs2,tmp2 = np.array([]),np.array([]),np.array([]),np.array([]),np.array([])\n",
"uc,vc = np.array([]),np.array([])\n",
2018-09-05 15:52:38 -06:00
"\n",
2022-08-18 15:59:45 -07:00
"# Cycle through all response objects to populate new arrays\n",
2018-09-05 15:52:38 -06:00
"for ob in response:\n",
2018-10-05 17:09:43 -06:00
" tmp = np.append(tmp,ob.getNumber(\"temperature\"))\n",
" prs = np.append(prs,ob.getNumber(\"pressure\"))\n",
" uc = np.append(uc,ob.getNumber(\"uComp\"))\n",
" vc = np.append(vc,ob.getNumber(\"vComp\"))\n",
2022-08-18 15:59:45 -07:00
" # don't include data with 0 specific humidity\n",
" if(ob.getNumber(\"specHum\")==0):\n",
" continue\n",
" sh = np.append(sh,ob.getNumber(\"specHum\"))\n",
" prs2 = np.append(prs2,ob.getNumber(\"pressure\"))\n",
" tmp2 = np.append(tmp2,ob.getNumber(\"temperature\"))"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-08-18 15:59:45 -07:00
"### Calculate Dewpoint from Specific Humidity\n",
2018-09-05 15:52:38 -06:00
"\n",
"Because the modelsounding plugin does not return dewpoint values, we must calculate the profile ourselves. Here are three examples of dewpoint calculated from specific humidity, including a manual calculation following NCEP AWIPS/NSHARP. \n",
"\n",
2022-08-18 15:59:45 -07:00
"First, we'll set up variables that are used in all three methods (and later in the notebook)."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
2025-02-12 08:45:54 -07:00
"execution_count": 8,
2018-09-06 12:12:07 -06:00
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [],
"source": [
2022-08-18 15:59:45 -07:00
"tfull = (tmp-273.15) * units.degC\n",
"t = (tmp2-273.15) * units.degC\n",
"\n",
"pfull = prs/100 * units.mbar\n",
"p = prs2/100 * units.mbar\n",
2018-09-05 15:52:38 -06:00
"\n",
"u,v = uc*1.94384,vc*1.94384 # m/s to knots\n",
2020-09-04 10:34:52 -06:00
"spd = wind_speed(u*units.knots, v*units.knots)\n",
"dir = wind_direction(u*units.knots, v*units.knots) * units.deg"
2018-09-05 15:52:38 -06:00
]
},
2022-08-18 15:59:45 -07:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Method 1\n",
"\n",
"Here we'll calculate the dewpoint using MetPy calculated mixing ratio and the vapor pressure."
]
},
2018-09-05 15:52:38 -06:00
{
"cell_type": "code",
2025-02-12 17:02:03 -07:00
"execution_count": 9,
2018-09-06 12:12:07 -06:00
"metadata": {},
2025-02-12 08:45:54 -07:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-02-12 17:02:03 -07:00
"[-17.861027609224152 -18.296283305867178 -18.61873165139778 -18.956045264648424 -19.17502589815922 -19.67533661570917 -20.060517352662544 -20.60677624765424 -21.034562441122517 -20.47030103586505 -20.095639271448306 -19.765441774539482 -19.47765111329744 -19.118520675916415 -19.039256945399615 -19.220687869449876 -19.659848697746412 -20.35989694232248 -21.34132106267046 -22.510151905707176 -23.891435648286034 -25.377619126624808 -26.823631224180673 -28.373325286396692 -29.322811329792188 -29.28950476725845 -32.316697089981005 -37.609577734507525 -42.2249867107964 -46.4725928841666 -50.779120288769434 -59.06429640317202 -70.0497515867722 -70.71615305853982] degree_Celsius\n"
2025-02-12 08:45:54 -07:00
]
}
],
2018-09-05 15:52:38 -06:00
"source": [
"rmix = (sh/(1-sh)) *1000 * units('g/kg')\n",
"e = vapor_pressure(p, rmix)\n",
2025-02-12 08:45:54 -07:00
"td = dewpoint(e)\n",
"print(td)"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-08-18 15:59:45 -07:00
"#### Method 2\n",
"\n",
"Here we'll calculate dewpoint using MetPy while assuming the mixing ratio is equal to the specific humidity."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
2025-02-12 17:02:03 -07:00
"execution_count": 10,
2018-09-06 12:12:07 -06:00
"metadata": {},
2025-02-12 08:45:54 -07:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-02-12 17:02:03 -07:00
"[-17.872374594539878 -18.307233712088532 -18.62941615219512 -18.966463858936493 -19.185307466171594 -19.685223771445862 -20.07013889228719 -20.616005053394304 -21.04352622946604 -20.479887317174047 -20.105720862492916 -19.776017591322585 -19.4887197093349 -19.130208537923124 -19.051303531109 -19.23283161612025 -19.671828764230696 -20.371455840693898 -21.352206267145135 -22.520243304233674 -23.900618221790864 -25.385905205061363 -26.831154201846743 -28.38009666226398 -29.329310144996413 -29.296431567874123 -32.322083827390884 -37.61282774776876 -42.22705759872292 -46.4739459966614 -50.77998341031628 -59.064612626911355 -70.04982150804739 -70.7162224435676] degree_Celsius\n"
2025-02-12 08:45:54 -07:00
]
}
],
2018-09-05 15:52:38 -06:00
"source": [
2025-02-12 08:45:54 -07:00
"td2 = dewpoint(vapor_pressure(p, sh))\n",
"print(td2)"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-08-18 15:59:45 -07:00
"#### Method 3\n",
2018-09-05 15:52:38 -06:00
"\n",
2022-08-18 15:59:45 -07:00
"Here we use logic from the NCEP AWIPS soundingrequest plugin. This logic was based on [GEMPAK and NSHARP calculations](https://github.com/Unidata/awips2-ncep/blob/unidata_16.2.2/edex/gov.noaa.nws.ncep.edex.plugin.soundingrequest/src/gov/noaa/nws/ncep/edex/plugin/soundingrequest/handler/MergeSounding.java#L1783)."
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "code",
2025-02-12 17:02:03 -07:00
"execution_count": 11,
2018-09-05 15:52:38 -06:00
"metadata": {},
2025-02-12 08:45:54 -07:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2025-02-12 17:02:03 -07:00
"[-17.856866063572326 -18.292352624634983 -18.61495502652454 -18.95242234278033 -19.17148109212604 -19.67201981493028 -20.057352947508043 -20.603837750203628 -21.031774978696657 -20.467148227064524 -20.09219397247566 -19.76170356716989 -19.473619844784952 -19.11412104616787 -19.034640805389554 -19.21600817115405 -19.655258048229165 -20.355545859726377 -21.337356589010316 -22.5066427651069 -23.88844692083168 -25.37514098495366 -26.82158360694533 -28.3716989735814 -29.321328899510995 -29.287762680418876 -32.315822657544324 -37.609884107908435 -42.22590892550121 -46.47386041955892 -50.7805953411855 -59.065935666579605 -70.05132888695185 -70.71771826198025] degree_Celsius\n"
2025-02-12 08:45:54 -07:00
]
}
],
2018-09-05 15:52:38 -06:00
"source": [
"# new arrays\n",
2022-08-18 15:59:45 -07:00
"ntmp = tmp2\n",
2018-09-05 15:52:38 -06:00
"\n",
"# where p=pressure(pa), T=temp(C), T0=reference temp(273.16)\n",
2022-08-18 15:59:45 -07:00
"rh = 0.263*prs2*sh / (np.exp(17.67*ntmp/(ntmp+273.15-29.65)))\n",
2018-09-05 15:52:38 -06:00
"vaps = 6.112 * np.exp((17.67 * ntmp) / (ntmp + 243.5))\n",
"vapr = rh * vaps / 100\n",
2025-02-12 08:45:54 -07:00
"dwpc = np.array(243.5 * (np.log(6.112) - np.log(vapr)) / (np.log(vapr) - np.log(6.112) - 17.67)) * units.degC\n",
"print(dwpc)"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2022-08-18 15:59:45 -07:00
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
2018-09-05 15:52:38 -06:00
]
},
{
2022-08-18 15:59:45 -07:00
"cell_type": "markdown",
2018-09-05 15:52:38 -06:00
"metadata": {},
2022-08-18 15:59:45 -07:00
"source": [
"## Plot the Data!\n",
"\n",
"Create and display SkewT and Hodograph plots using MetPy.\n",
"\n",
"Since we're displaying all three dewpoint plots, we also create a \"zoomed in\" view to highlight the slight differences between the three calculations."
]
},
{
"cell_type": "code",
2025-02-12 17:02:03 -07:00
"execution_count": 12,
2025-01-23 14:31:31 -07:00
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [
{
"data": {
2025-02-12 17:02:03 -07:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAABFMAAAMpCAYAAADIOny4AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XdcFHf6B/DP0HtHmoCKVEGUYkEUezciUaPGXmKiMTHGS7kkxlxyySX5nWleitFEYzT2FkvEirGdYqf33jsLy7Jlfn9wuwEBpczu7C7P+155HSyzO99dYXfmmacwLMuyIIQQQgghhBBCCCEdosP3AgghhBBCCCGEEEI0CQVTCCGEEEIIIYQQQjqBgimEEEIIIYQQQgghnUDBFEIIIYQQQgghhJBOoGAKIYQQQgghhBBCSCdQMIUQQgghhBBCCCGkEyiYQgghhBBCCCGEENIJFEwhhBBCCCGEEEII6QQKphBCCCGEEEIIIYR0gh7fCyCEEEIIIYQQQtRJcXEx9u7dC09PTwQEBMDNzQ0Mw/C9LKJGGJZlWb4XQQghhBBCCCGEEKIpqMyHEEIIIYQQQgghpBMomEIIIYQQQgghhBDSCRRMIYQQQgghhBBCCOkECqYQQgghhBBCCCGEdAIFUwghhBBCCCGEEEI6gYIphBBCCCGEEEIIIZ1AwRRCCCGEEEIIIYSQTqBgCiGEEEIIIYQQQkgnUDCFEEIIIYQQQgghpBMomEIIIYQQQgghhBDSCRRMIYQQQgghhBBCCOkECqYQQgghhBBCCCGEdAIFUwghhBBCCCGEEEI6gYIphBBCCCGEEEIIIZ1AwRRCCCGEEEIIIYSQTqBgCiGEEEIIIYQQQkgnUDCFEEIIIYQQQgghpBMomEIIIYQQQgghhBDSCRRMIYQQQgghhBBCCOkECqYQQgghhBBCCCGEdAIFUwghhBBCCCGEEEI6gYIphBBCCCGEEEIIIZ1AwRRCCCGEEEIIIYSQTqBgCiGEEEIIIYQQQkgnUDCFEEIIIYQQQgghpBMomEIIIYQQQgghhHRAWloa9u7dy/cyiBpgWJZl+V4EIYQQQgghhBCibs6dOwcAmDBhAgAgMDAQDx8+xL179zBo0CAeV0b4RsEUQgghhBBCCCGkDWFhYUhISEB2djYsLS2RlZWFvn37AgDoVLpnozIfQgghhBBCCCGkDdnZ2aiursbnn38OAOjTpw/s7e0BAGfPnuVzaYRnlJlCCCGEEEIIIYQ8RiqVwsDAADKZDEZGRsjMzISjoyMqKipga2sLgLJTejLKTCGEEEIIIYQQQh5TWFgImUwGABCLxfjHP/4BALCxscGwYcMAAD/99BNv6yP8oswUQgghhBBCCCHkMTdu3EBYWJjie11dXSQlJaF///4QiUQwMjIC0DI7hWEYvPnmm/jXv/6l8vUS1aLMFEJIj3Xx4kUsX74cPj4+MDU1hYuLC2bOnIk7d+60uf3du3cxfvx4mJmZwcrKClFRUcjIyGixTUpKCjZu3Ijg4GBYWVnBxsYGI0aMwKFDh1o93s6dO8EwTJv/FRUVdfh5cL2u9tTW1uKNN97AxIkTYW9vD4ZhsHnz5lbbSaVSbNmyBZMnT0bv3r1hYmICX19fvPXWW6iqqurQvk6ePInFixcjICAA+vr6YBim3W3T0tKwaNEiuLm5wdjYGB4eHtiwYQPKy8s7/NzOnz+P4cOHw8TEBHZ2dli6dClKSkpabScWi/HBBx+gT58+MDQ0hI+PD7755psO7WPz5s3t/ns3/+9JLl++3O79Zs+erdhu9OjR8Pf3b/MxysrK2v23a8u+ffswaNAgGBkZwdnZGevXr4dAIOjQfZcuXYrRo0d3aFsAyMzMxCuvvAJfX1+YmprCyMgIffr0wcKFC3Hp0qUWB6tP+vvZuHGjYrvc3FysWbMGXl5eMDY2ho2NDQICArBq1Srk5uY+cT3y1/vxv5P6+npMmTIF+vr6+OWXXzq1nj59+rT4mampKYKCgrB169ZWqeLN/7137tzZ5hrHjh0LhmHQp0+fjrzEAIBx48bhxRdfbPfn58+fV+y3rKysxc9+++03jBo1Cg4ODjA0NISzszNmzJiB69evd3j/YrEYW7ZsQUBAAIyNjWFlZYWwsLBWj9He66mMExSWZfH111/Dx8cHhoaGcHJywksvvYTKyson3i8hIQGGhoZgGAaxsbGd3u+TXuvt27cjMjISffr0gbGxMfr374+XXnoJhYWFLbarrKyElZUVjh071un9E0KeLCcnp8X3DMPgnXfeAQAYGhpiwYIFAIBNmza12O7TTz9FQ0ODahZJeKPH9wIIIYQv3333HcrLy/Hqq6/Cz88PpaWl+Pe//41hw4bh7NmzGDt2rGLbpKQkjB49GoMGDcKBAwfQ0NCATZs2YeTIkbh//76iEVl0dDROnTqFRYsWITQ0FBKJBPv378ecOXPwwQcftPqwBYCff/4ZPj4+LW6T1+E+jTLX9bjy8nJs27YNgYGBiIyMxPbt29vcTigUYvPmzZg/fz5WrlwJOzs73L17Fx999BF+//13xMbGwtjY+In7Onr0KG7evInBgwfD0NCw3QBXaWkphg0bBgsLC3z44Ydwc3PDvXv38P777+PSpUu4c+cOdHSefN0gJiYGU6ZMwbRp03D8+HGUlJTgzTffxLhx4xAbGwtDQ0PFtmvWrMHu3bvx4YcfIjQ0FGfPnsWrr76K2tpa/P3vf3/iflauXInJkye3+bOzZ89i8+bNiIyMfOJjyH388ccYM2ZMi9s6+jvTGXv27MHChQuxcuVKfPHFF0hJScGbb76JhIQEREdHc7qvEydOYMGCBbCzs8OLL76IoKAgGBoaIi0tDYcOHcLYsWNx/vx5jBs3rsX92vr7cXZ2BgDk5eUhKCgIVlZWeP311+Ht7Y3q6mokJCTgwIEDyMjIgKura6fWWV1djWnTpiE2NhaHDh3CzJkzO7weuREjRuD//u//AAAFBQXYsmUL1q1bh5qamjZ/j8zNzbFjxw4sXbq0xe2ZmZm4fPkyLCwsOrz+48eP49q1a4og0OMEAgFWrVoFZ2dnFBQUtPp5eXk5RowYgVdffRV2dnYoLCzEli1bMGrUKFy4cAERERFP3L9UKsWsWbNw9epVvPHGGwgLC0NdXR3u3LmDurq6VtvPnj0br7/+eovb3NzcOvx8O2rjxo348ssvsXHjRowfPx4JCQnYtGkTbt++jRs3bkBfX7/N57J8+XLY2dm1+Vo9zdNe6/fffx9jxozBxx9/DBcXFyQnJ+PDDz/E8ePHce/ePTg4OAAArK2t8dprr+Fvf/sbpk6dCgMDg86/AISQNuXm5kJXVxdSqRQAIJFIcODAAbz55psICgrC7t27sXfvXnz44YfYvHkzdHR0sGPHDqxYsQIRERH473//y/MzIErFEkJID1VcXNzqttraWtbBwYEdN25ci9vnzJnD2tnZsdXV1YrbsrKyWH19ffaNN95Q3FZaWsrKZLJWjztt2jTWxMSEbWhoUNz2888/swDY27dvd/k5KGNd7ZHJZIrHKC0tZQGw77//fqvtJBIJW1ZW1ur2gwcPsgDY3bt3P3VfUqlU8fXatWvZ9j6ufvzxRxYAe/78+Ra3f/zxxywA9u7du0/dV2hoKOvn58eKxWLFbdeuXWMBsN9++63itri4OJZhGPbjjz9ucf9Vq1axxsbGbHl5+VP31Zb09HTW2tqa9fb2bvHv2JZLly6xANiDBw8+cbuIiAh2wIABbf7sSf92zUkkEtbJyYmdOHFii9v37NnDAmBPnz79xPuzLMsuWbKEjYiIeOp2aWlprImJCRsaGtrua3Dp0iX2/v37iu878vezadMmFgCbkZHR5s+b/561t8/mr3dxcTE7aNAg1tzcnL148WKLbTv69+zu7s5OmzatxW3V1dWspaUl6+bm1ub+V65cyQJgU1JSWvz83XffZXv37s1OmTKFdXd3f+J+5YYMGcLOmzev3Z+vXbuWHTx4MPvuu++yANjS0tKnPmZVVRWrr6/PLlq06KnbfvHFF6yOjg5748aNp24LgF27du1Tt+uuvLw8VldXl12
2018-09-05 15:52:38 -06:00
"text/plain": [
2025-02-12 08:45:54 -07:00
"<Figure size 1200x1400 with 3 Axes>"
2018-09-05 15:52:38 -06:00
]
},
2025-01-23 14:31:31 -07:00
"metadata": {},
2018-09-05 15:52:38 -06:00
"output_type": "display_data"
}
],
"source": [
2022-08-18 15:59:45 -07:00
"# Create a new figure and define the size\n",
"fig = plt.figure(figsize=(12, 14))\n",
2018-09-05 15:52:38 -06:00
"\n",
"# Create a skewT plot\n",
2022-08-18 15:59:45 -07:00
"skew = SkewT(fig)\n",
2018-09-05 15:52:38 -06:00
"\n",
"# Plot the data\n",
2022-08-18 15:59:45 -07:00
"skew.plot(pfull, tfull, 'r', linewidth=2)\n",
2018-09-05 15:52:38 -06:00
"skew.plot(p, td, 'b', linewidth=2)\n",
2022-08-18 15:59:45 -07:00
"skew.plot(p, td2, 'y', linewidth=2)\n",
2018-09-05 15:52:38 -06:00
"skew.plot(p, dwpc, 'g', linewidth=2)\n",
2022-08-18 15:59:45 -07:00
"skew.plot_barbs(pfull, u, v)\n",
"# set the domain and range (these may need to be adjusted\n",
"# depending on the exact data for best viewing purposes)\n",
2018-09-05 15:52:38 -06:00
"skew.ax.set_ylim(1000, 100)\n",
2022-08-18 15:59:45 -07:00
"skew.ax.set_xlim(-70, 40)\n",
2018-09-05 15:52:38 -06:00
"\n",
2022-08-19 12:58:37 -07:00
"# Add title to the plot\n",
"# format: \"2022-08-18 18Z FH 0 | GFS KFRM (43.65,-94.42)\"\n",
"datetime = str(ob.getDataTime())[0:-6]+\"Z\"\n",
"forecastHr = str(ob.getDataTime().getFcstTime())\n",
"site = ob.getLocationName()\n",
"lat = \"{:.2f}\".format(ob.getGeometry().y)\n",
"lon = \"{:.2f}\".format(ob.getGeometry().x)\n",
"coords = \"(\" + lat + \", \" + lon +\")\"\n",
"\n",
"title = datetime + \" FH \" + forecastHr + \" | \" + forecastModel + \" \" + site + \" \" + coords\n",
"plt.title(title)\n",
2022-08-18 15:59:45 -07:00
"\n",
"# Create a secondary axes for the \"zoomed in\" view\n",
2025-02-12 08:45:54 -07:00
"zoom_ax = inset_axes(skew.ax, '35%', '35%', loc=3,\n",
" bbox_to_anchor=(.05, .05, 1, 1),\n",
" bbox_transform=skew.ax.transAxes)\n",
2022-08-18 15:59:45 -07:00
"# create a secondary plot for zoomed in section\n",
"fig2 = plt.figure()\n",
"skew2 = SkewT(fig2)\n",
"skew2.ax = zoom_ax\n",
"skew2.plot(p, td, 'b', linewidth=2, label='MetPy calculated mixing ratio')\n",
"skew2.plot(p, td2, 'y', linewidth=2, label='MetPy spec. hum = mixing ratio')\n",
"skew2.plot(p, dwpc, 'g', linewidth=2, label='GEMPAK legacy caluclation')\n",
"# create a legend to explain the three lines\n",
"skew2.ax.legend(loc=1)\n",
"# remove the axis title on the zoomed plot since they\n",
"# are redundant and just clutter the plot\n",
"skew2.ax.set_xlabel(\"\")\n",
"skew2.ax.set_ylabel(\"\")\n",
"# these exact bounds may need to change depending on\n",
"# the most recent data\n",
"skew2.ax.set_ylim(970, 900)\n",
2025-02-12 08:45:54 -07:00
"skew2.ax.set_xlim(-29, -26)\n",
2022-08-18 15:59:45 -07:00
"\n",
"# draw an indicator in the main plot of the \"zoomed in\" region\n",
"skew.ax.indicate_inset_zoom(zoom_ax, edgecolor=\"black\")\n",
"\n",
"# dispose of the second figure, since creating a new\n",
"# skewt in metpy automatically creates a new figure\n",
"# which is unnecessary in this case\n",
"plt.close(fig2)\n",
2018-09-05 15:52:38 -06:00
"\n",
"# An example of a slanted line at constant T -- in this case the 0 isotherm\n",
"l = skew.ax.axvline(0, color='c', linestyle='--', linewidth=2)\n",
"\n",
"# Draw hodograph\n",
2020-09-04 10:51:12 -06:00
"ax_hod = inset_axes(skew.ax, '40%', '40%', loc=1)\n",
"h = Hodograph(ax_hod, component_range=spd.max()/units.knots)\n",
2018-09-05 15:52:38 -06:00
"h.add_grid(increment=20)\n",
"h.plot_colormapped(u, v, spd)\n",
"\n",
"# Show the plot\n",
"plt.show()"
]
2020-09-04 11:26:02 -06:00
},
{
2022-08-18 15:59:45 -07:00
"cell_type": "markdown",
2020-09-04 11:26:02 -06:00
"metadata": {},
2022-08-18 15:59:45 -07:00
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## See Also\n",
"\n",
"### Related Notebooks\n",
"\n",
"* [Grid Levels and Parameters](https://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html)\n",
"* [Upper Air BUFR Soundings](http://unidata.github.io/python-awips/examples/generated/Upper_Air_BUFR_Soundings.html)\n",
2022-08-18 16:07:02 -07:00
"* [Forecast Model Vertical Sounding](http://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html)\n",
2022-08-18 15:59:45 -07:00
"\n",
"### Additional Documentation\n",
"\n",
"**python-awips:**\n",
2022-08-22 18:27:48 -06:00
"\n",
2022-08-18 15:59:45 -07:00
"* [awips.DataAccessLayer](http://unidata.github.io/python-awips/api/DataAccessLayer.html)\n",
"* [awips.PyGeometryData](http://unidata.github.io/python-awips/api/PyGeometryData.html)\n",
"\n",
"**matplotlib:**\n",
2022-08-22 18:27:48 -06:00
"\n",
2022-08-18 15:59:45 -07:00
"* [matplotlib.pyplot](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html)\n",
2022-08-22 18:27:48 -06:00
"\n",
"**MetPy**\n",
"\n",
"* [metpy.wind_speed](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_speed.html)\n",
"* [metpy.wind_direction](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_direction.html)\n",
"* [metpy.vapor_pressure](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.vapor_pressure.html)\n",
"* [metpy.dewpoint](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.dewpoint.html)\n",
"* [metpy.skewt](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html)\n",
"* [metpy.hodograph](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.html)"
2022-08-18 15:59:45 -07:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
2018-09-05 15:52:38 -06:00
}
],
"metadata": {
"kernelspec": {
2023-08-24 12:49:20 -06:00
"display_name": "Python 3 (ipykernel)",
2018-09-05 15:52:38 -06:00
"language": "python",
2018-09-06 12:12:07 -06:00
"name": "python3"
2018-09-05 15:52:38 -06:00
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
2018-09-06 12:12:07 -06:00
"version": 3
2018-09-05 15:52:38 -06:00
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
2018-09-06 12:12:07 -06:00
"pygments_lexer": "ipython3",
2025-01-23 14:31:31 -07:00
"version": "3.13.1"
2022-08-18 15:59:45 -07:00
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": true,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": true,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
2018-09-05 15:52:38 -06:00
}
},
"nbformat": 4,
2025-01-23 14:31:31 -07:00
"nbformat_minor": 4
2018-09-05 15:52:38 -06:00
}