python-awips/examples/notebooks/Grid_Levels_and_Parameters.ipynb

992 lines
518 KiB
Text
Raw Normal View History

2018-09-05 15:52:38 -06:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This example covers the callable methods of the Python AWIPS DAF when working with gridded data. We start with a connection to an EDEX server, then query data types, then grid names, parameters, levels, and other information. Finally the gridded data is plotted for its domain using Matplotlib and Cartopy."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## DataAccessLayer.getSupportedDatatypes()\n",
"\n",
"getSupportedDatatypes() returns a list of available data types offered by the EDEX server defined above. "
]
},
{
"cell_type": "code",
"execution_count": 1,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['acars',\n",
" 'airep',\n",
" 'binlightning',\n",
" 'bufrmosAVN',\n",
" 'bufrmosETA',\n",
" 'bufrmosGFS',\n",
" 'bufrmosHPC',\n",
" 'bufrmosLAMP',\n",
" 'bufrmosMRF',\n",
" 'bufrua',\n",
" 'climate',\n",
" 'common_obs_spatial',\n",
" 'gfe',\n",
" 'gfeEditArea',\n",
" 'grid',\n",
" 'maps',\n",
" 'modelsounding',\n",
" 'obs',\n",
" 'pirep',\n",
" 'practicewarning',\n",
" 'profiler',\n",
" 'radar',\n",
" 'radar_spatial',\n",
" 'satellite',\n",
" 'sfcobs',\n",
" 'topo',\n",
" 'warning']"
2018-09-05 15:52:38 -06:00
]
},
"execution_count": 1,
2018-09-05 15:52:38 -06:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from awips.dataaccess import DataAccessLayer\n",
"import unittest\n",
"\n",
2018-09-06 13:05:37 -06:00
"DataAccessLayer.changeEDEXHost(\"edex-cloud.unidata.ucar.edu\")\n",
2018-09-05 15:52:38 -06:00
"dataTypes = DataAccessLayer.getSupportedDatatypes()\n",
"dataTypes.sort()\n",
2018-09-05 15:52:38 -06:00
"list(dataTypes)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## DataAccessLayer.getAvailableLocationNames()\n",
"\n",
"Now create a new data request, and set the data type to **grid** to request all available grids with **getAvailableLocationNames()**"
]
},
{
"cell_type": "code",
"execution_count": 2,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['AUTOSPE',\n",
" 'CMC',\n",
" 'ESTOFS',\n",
" 'ETSS',\n",
" 'FFG-ALR',\n",
" 'FFG-FWR',\n",
" 'FFG-KRF',\n",
" 'FFG-MSR',\n",
" 'FFG-ORN',\n",
" 'FFG-PTR',\n",
" 'FFG-RHA',\n",
" 'FFG-RSA',\n",
" 'FFG-STR',\n",
" 'FFG-TAR',\n",
" 'FFG-TIR',\n",
" 'FFG-TUA',\n",
" 'GEFS',\n",
" 'GFS',\n",
" 'GFS20',\n",
" 'HFR-EAST_6KM',\n",
" 'HFR-EAST_PR_6KM',\n",
" 'HFR-US_EAST_DELAWARE_1KM',\n",
" 'HFR-US_EAST_FLORIDA_2KM',\n",
" 'HFR-US_EAST_NORTH_2KM',\n",
" 'HFR-US_EAST_SOUTH_2KM',\n",
" 'HFR-US_EAST_VIRGINIA_1KM',\n",
" 'HFR-US_HAWAII_1KM',\n",
" 'HFR-US_HAWAII_2KM',\n",
" 'HFR-US_HAWAII_6KM',\n",
" 'HFR-US_WEST_500M',\n",
" 'HFR-US_WEST_CENCAL_2KM',\n",
" 'HFR-US_WEST_LOSANGELES_1KM',\n",
" 'HFR-US_WEST_LOSOSOS_1KM',\n",
" 'HFR-US_WEST_NORTH_2KM',\n",
" 'HFR-US_WEST_SANFRAN_1KM',\n",
" 'HFR-US_WEST_SOCAL_2KM',\n",
" 'HFR-US_WEST_WASHINGTON_1KM',\n",
" 'HFR-WEST_6KM',\n",
" 'HPCGuide',\n",
" 'HPCqpfNDFD',\n",
" 'HRRR',\n",
" 'LAMP2p5',\n",
" 'MRMS_0500',\n",
" 'MRMS_1000',\n",
" 'NAM12',\n",
" 'NAM40',\n",
" 'NOHRSC-SNOW',\n",
" 'NationalBlend',\n",
" 'RAP13',\n",
" 'RTMA',\n",
" 'RTOFS-Now-WestAtl',\n",
" 'RTOFS-Now-WestConus',\n",
" 'RTOFS-WestAtl',\n",
" 'RTOFS-WestConus',\n",
" 'SPCGuide',\n",
" 'SeaIce',\n",
" 'TPCWindProb',\n",
" 'URMA25',\n",
" 'WaveWatch']"
2018-09-05 15:52:38 -06:00
]
},
"execution_count": 2,
2018-09-05 15:52:38 -06:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"request = DataAccessLayer.newDataRequest()\n",
"request.setDatatype(\"grid\")\n",
"available_grids = DataAccessLayer.getAvailableLocationNames(request)\n",
"available_grids.sort()\n",
"list(available_grids)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## DataAccessLayer.getAvailableParameters()\n",
"\n",
"After datatype and model name (locationName) are set, you can query all available parameters with **getAvailableParameters()**"
]
},
{
"cell_type": "code",
"execution_count": 3,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['36SHRMi',\n",
" '50dbzZ',\n",
" 'AV',\n",
" 'Along',\n",
" 'AppT',\n",
" 'BLI',\n",
" 'BRN',\n",
" 'BRNEHIi',\n",
" 'BRNSHR',\n",
" 'BRNmag',\n",
" 'BRNvec',\n",
" 'BdEPT06',\n",
" 'BlkMag',\n",
" 'BlkShr',\n",
" 'CAPE',\n",
" 'CFRZR',\n",
" 'CICEP',\n",
" 'CIn',\n",
" 'CP',\n",
" 'CP1hr',\n",
" 'CPr',\n",
" 'CPrD',\n",
" 'CRAIN',\n",
" 'CSNOW',\n",
" 'CURU',\n",
" 'CXR',\n",
" 'CapeStk',\n",
" 'Corf',\n",
" 'CorfF',\n",
" 'CorfFM',\n",
" 'CorfM',\n",
" 'CritT1',\n",
" 'CumNrm',\n",
" 'CumShr',\n",
" 'DivF',\n",
" 'DivFn',\n",
" 'DivFs',\n",
" 'DpD',\n",
" 'DpT',\n",
" 'EHI',\n",
" 'EHI01',\n",
" 'EHIi',\n",
" 'EPT',\n",
" 'EPTA',\n",
" 'EPTC',\n",
" 'EPTGrd',\n",
" 'EPTGrdM',\n",
" 'EPTs',\n",
" 'EPVg',\n",
" 'EPVs',\n",
" 'EPVt1',\n",
" 'EPVt2',\n",
" 'ESP',\n",
" 'ESP2',\n",
" 'FVecs',\n",
" 'FeatMot',\n",
" 'FnVecs',\n",
" 'FsVecs',\n",
" 'Fzra1',\n",
" 'Fzra2',\n",
" 'GH',\n",
" 'GHxSM',\n",
" 'GHxSM2',\n",
" 'Gust',\n",
" 'HI',\n",
" 'HI1',\n",
" 'HI3',\n",
" 'HI4',\n",
" 'HIdx',\n",
" 'HPBL',\n",
" 'Heli',\n",
" 'HeliC',\n",
" 'INV',\n",
" 'IPLayer',\n",
" 'Into',\n",
" 'KI',\n",
" 'L-I',\n",
" 'LIsfc2x',\n",
" 'LM5',\n",
" 'LM6',\n",
" 'MAdv',\n",
" 'MCon',\n",
" 'MCon2',\n",
" 'MLLCL',\n",
" 'MMP',\n",
" 'MMSP',\n",
" 'MSFDi',\n",
" 'MSFi',\n",
" 'MSFmi',\n",
" 'MSG',\n",
" 'MTV',\n",
" 'Mix1',\n",
" 'Mix2',\n",
" 'Mmag',\n",
" 'MpV',\n",
" 'NBE',\n",
" 'NST',\n",
" 'NST1',\n",
" 'NST2',\n",
" 'OmDiff',\n",
" 'P',\n",
" 'PAdv',\n",
" 'PBE',\n",
" 'PEC',\n",
" 'PFrnt',\n",
" 'PGrd',\n",
" 'PGrd1',\n",
" 'PGrdM',\n",
" 'PIVA',\n",
" 'PR',\n",
" 'PTvA',\n",
" 'PTyp',\n",
" 'PVV',\n",
" 'PW',\n",
" 'PW2',\n",
" 'PoT',\n",
" 'PoTA',\n",
" 'QPV1',\n",
" 'QPV2',\n",
" 'QPV3',\n",
" 'QPV4',\n",
" 'REFC',\n",
" 'RH',\n",
" 'RH_001_bin',\n",
" 'RH_002_bin',\n",
" 'RM5',\n",
" 'RM6',\n",
" 'RMprop',\n",
" 'RMprop2',\n",
" 'RRtype',\n",
" 'RV',\n",
" 'Rain1',\n",
" 'Rain2',\n",
" 'Rain3',\n",
" 'Ro',\n",
" 'SH',\n",
" 'SHx',\n",
" 'SLI',\n",
" 'SNSQ',\n",
" 'SNW',\n",
" 'SNWA',\n",
" 'SRMl',\n",
" 'SRMlM',\n",
" 'SRMm',\n",
" 'SRMmM',\n",
" 'SRMr',\n",
" 'SRMrM',\n",
" 'SSP',\n",
" 'SSi',\n",
" 'STP',\n",
" 'STP1',\n",
" 'Shear',\n",
" 'ShrMag',\n",
" 'SnD',\n",
" 'Snow1',\n",
" 'Snow2',\n",
" 'Snow3',\n",
" 'SnowT',\n",
" 'St-Pr',\n",
" 'StrTP',\n",
" 'StrmMot',\n",
" 'SuCP',\n",
" 'T',\n",
" 'TAdv',\n",
" 'TGrd',\n",
" 'TGrdM',\n",
" 'TORi',\n",
" 'TORi2',\n",
" 'TP',\n",
" 'TP1hr',\n",
" 'TQIND',\n",
" 'TShrMi',\n",
" 'TV',\n",
" 'TW',\n",
" 'T_001_bin',\n",
" 'Tdef',\n",
" 'Tdend',\n",
" 'ThGrd',\n",
" 'Thom5',\n",
" 'Thom5a',\n",
" 'Thom6',\n",
" 'TmDpD',\n",
" 'Tmax',\n",
" 'Tmin',\n",
" 'Topo',\n",
" 'TotQi',\n",
" 'Tstk',\n",
" 'TwMax',\n",
" 'TwMin',\n",
" 'Twstk',\n",
" 'TxSM',\n",
" 'USTM',\n",
" 'VAdv',\n",
" 'VAdvAdvection',\n",
" 'VGP',\n",
" 'VSTM',\n",
" 'Vis',\n",
" 'WCD',\n",
" 'WD',\n",
" 'WEASD',\n",
" 'WEASD1hr',\n",
" 'WGS',\n",
" 'Wind',\n",
" 'WndChl',\n",
" 'ageoVC',\n",
" 'ageoW',\n",
" 'ageoWM',\n",
" 'cCape',\n",
" 'cCin',\n",
" 'cTOT',\n",
" 'capeToLvl',\n",
" 'dCape',\n",
" 'dP',\n",
" 'dT',\n",
" 'dVAdv',\n",
" 'dZ',\n",
" 'defV',\n",
" 'del2gH',\n",
" 'df',\n",
" 'fGen',\n",
" 'fnD',\n",
" 'fsD',\n",
" 'gamma',\n",
" 'gammaE',\n",
" 'geoVort',\n",
" 'geoW',\n",
" 'geoWM',\n",
" 'loCape',\n",
" 'maxEPT',\n",
" 'minEPT',\n",
" 'mixRat',\n",
" 'msl-P',\n",
" 'muCape',\n",
" 'pV',\n",
" 'pVeq',\n",
" 'qDiv',\n",
" 'qVec',\n",
" 'qnVec',\n",
" 'qsVec',\n",
" 'shWlt',\n",
" 'snoRat',\n",
" 'snoRatCrocus',\n",
" 'snoRatEMCSREF',\n",
" 'snoRatOv2',\n",
" 'snoRatSPC',\n",
" 'snoRatSPCdeep',\n",
" 'snoRatSPCsurface',\n",
" 'staticCoriolis',\n",
" 'staticSpacing',\n",
" 'staticTopo',\n",
" 'swtIdx',\n",
" 'tTOT',\n",
" 'tWind',\n",
" 'tWindU',\n",
" 'tWindV',\n",
" 'uFX',\n",
" 'uW',\n",
" 'uWStk',\n",
" 'ulSnoRat',\n",
" 'vSmthW',\n",
" 'vTOT',\n",
" 'vW',\n",
" 'vWStk',\n",
" 'vertCirc',\n",
" 'wDiv',\n",
" 'wSp',\n",
" 'wSp_001_bin',\n",
" 'wSp_002_bin',\n",
" 'wSp_003_bin',\n",
" 'wSp_004_bin',\n",
" 'zAGL']"
2018-09-05 15:52:38 -06:00
]
},
"execution_count": 3,
2018-09-05 15:52:38 -06:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"request.setLocationNames(\"RAP13\")\n",
"availableParms = DataAccessLayer.getAvailableParameters(request)\n",
"availableParms.sort()\n",
"list(availableParms)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## DataAccessLayer.getAvailableLevels()\n",
"\n",
"Selecting **\"T\"** for temperature."
]
},
{
"cell_type": "code",
"execution_count": 4,
2018-09-05 15:52:38 -06:00
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"0.0SFC\n",
"350.0MB\n",
"475.0MB\n",
"610.0_40000.0FHAG\n",
"225.0MB\n",
"120.0_150.0BL\n",
"900.0MB\n",
"125.0MB\n",
"0.0_610.0FHAG\n",
"450.0MB\n",
"575.0MB\n",
"325.0MB\n",
"100.0MB\n",
"1000.0MB\n",
"60.0_90.0BL\n",
"275.0MB\n",
"1.0PV\n",
"950.0MB\n",
"150.0MB\n",
"1.5PV\n",
"700.0MB\n",
"825.0MB\n",
"150.0_180.0BL\n",
"250.0MB\n",
"375.0MB\n",
"1000.0_500.0MB\n",
"800.0MB\n",
"4000.0FHAG\n",
"925.0MB\n",
"2.0PV\n",
"0.5PV\n",
"0.0TROP\n",
"750.0MB\n",
"500.0MB\n",
"625.0MB\n",
"400.0MB\n",
"0.0FHAG\n",
"2.0FHAG\n",
"875.0MB\n",
"175.0MB\n",
"0.0_1000.0FHAG\n",
"850.0MB\n",
"600.0MB\n",
"725.0MB\n",
"0.0_6000.0FHAG\n",
"975.0MB\n",
"550.0MB\n",
"0.0_3000.0FHAG\n",
"675.0MB\n",
"425.0MB\n",
"200.0MB\n",
"0.0_30.0BL\n",
"30.0_60.0BL\n",
"650.0MB\n",
"525.0MB\n",
"300.0MB\n",
"90.0_120.0BL\n",
"1000.0FHAG\n",
"775.0MB\n",
"340.0_350.0K\n",
"290.0_300.0K\n",
"700.0_600.0MB\n",
"700.0_300.0MB\n",
"320.0Ke\n",
"800.0_750.0MB\n",
"60.0TILT\n",
"5.3TILT\n",
"1000.0_900.0MB\n",
"340.0K\n",
"5500.0_6000.0FHAG\n",
"255.0K\n",
"255.0_265.0K\n",
"3000.0_6000.0FHAG\n",
"25.0TILT\n",
"2000.0FHAG\n",
"0.0_500.0FHAG\n",
"1000.0_850.0MB\n",
"850.0_250.0MB\n",
"280.0_290.0Ke\n",
"1524.0FHAG\n",
"320.0_330.0K\n",
"0.0TILT\n",
"310.0_320.0Ke\n",
"310.0Ke\n",
"330.0K\n",
"900.0_800.0MB\n",
"550.0_500.0MB\n",
"2.4TILT\n",
"50.0TILT\n",
"3500.0FHAG\n",
"35.0TILT\n",
"12.0TILT\n",
"300.0_310.0K\n",
"3000.0_12000.0FHAG\n",
"0.9TILT\n",
"320.0K\n",
"400.0_350.0MB\n",
"500.0FHAG\n",
"750.0_700.0MB\n",
"1000.0_400.0MB\n",
"345.0K\n",
"250.0_260.0K\n",
"300.0Ke\n",
"290.0Ke\n",
"950.0_900.0MB\n",
"4572.0FHAG\n",
"275.0_285.0Ke\n",
"335.0Ke\n",
"295.0_305.0Ke\n",
"275.0_285.0K\n",
"600.0_550.0MB\n",
"310.0K\n",
"9000.0FHAG\n",
"335.0K\n",
"1000.0_7000.0FHAG\n",
"700.0_500.0MB\n",
"9144.0FHAG\n",
"325.0_335.0K\n",
"2000.0_8000.0FHAG\n",
"0.0_609.6FHAG\n",
"300.0K\n",
"0.0MAXOMEGA\n",
"315.0_325.0K\n",
"325.0K\n",
"340.0Ke\n",
"0.0_4000.0FHAG\n",
"5000.0_5500.0FHAG\n",
"300.0_250.0MB\n",
"1.5TILT\n",
"335.0_345.0K\n",
"315.0K\n",
"3.4TILT\n",
"2500.0FHAG\n",
"10000.0FHAG\n",
"0.0_2000.0FHAG\n",
"7000.0FHAG\n",
"5000.0FHAG\n",
"330.0Ke\n",
"500.0_400.0MB\n",
"1000.0_1500.0FHAG\n",
"305.0K\n",
"285.0_295.0Ke\n",
"14.0TILT\n",
"3000.0_3500.0FHAG\n",
"325.0_335.0Ke\n",
"2000.0_5000.0FHAG\n",
"7620.0FHAG\n",
"850.0_800.0MB\n",
"6096.0FHAG\n",
"6000.0_7000.0FHAG\n",
"2000.0_7000.0FHAG\n",
"9000.0_10000.0FHAG\n",
"295.0Ke\n",
"305.0Ke\n",
"265.0_275.0K\n",
"7000.0_8000.0FHAG\n",
"3000.0_8000.0FHAG\n",
"700.0_650.0MB\n",
"1000.0_6000.0FHAG\n",
"0.5TILT\n",
"450.0_400.0MB\n",
"1.8TILT\n",
"330.0_340.0K\n",
"800.0_700.0MB\n",
"850.0_300.0MB\n",
"6.0TILT\n",
"900.0_850.0MB\n",
"3657.6FHAG\n",
"0.0_5000.0FHAG\n",
"320.0_330.0Ke\n",
"8.7TILT\n",
"650.0_600.0MB\n",
"600.0_400.0MB\n",
"55.0TILT\n",
"270.0_280.0Ke\n",
"30.0TILT\n",
"310.0_320.0K\n",
"1500.0FHAG\n",
"1000.0_950.0MB\n",
"5500.0FHAG\n",
"250.0_200.0MB\n",
"500.0_1000.0FHAG\n",
"400.0_300.0MB\n",
"500.0_100.0MB\n",
"1000.0_3000.0FHAG\n",
"8000.0FHAG\n",
"285.0Ke\n",
"290.0K\n",
"305.0_315.0K\n",
"285.0_295.0K\n",
"0.0_2500.0FHAG\n",
"925.0_850.0MB\n",
"275.0Ke\n",
"1500.0_2000.0FHAG\n",
"300.0_200.0MB\n",
"260.0_270.0K\n",
"2743.2FHAG\n",
"3000.0FHAG\n",
"315.0_325.0Ke\n",
"600.0_500.0MB\n",
"16.7TILT\n",
"280.0K\n",
"500.0_250.0MB\n",
"40.0TILT\n",
"3048.0FHAG\n",
"400.0_200.0MB\n",
"300.0_310.0Ke\n",
"270.0_280.0K\n",
"1000.0_700.0MB\n",
"45.0TILT\n",
"850.0_500.0MB\n",
"2500.0_3000.0FHAG\n",
"609.6FHAG\n",
"0.0_8000.0FHAG\n",
"295.0K\n",
"4.3TILT\n",
"295.0_305.0K\n",
"330.0_340.0Ke\n",
"270.0K\n",
"4000.0_4500.0FHAG\n",
"280.0_290.0K\n",
"925.0_700.0MB\n",
"0.0_1500.0FHAG\n",
"260.0K\n",
"10.0TILT\n",
"3500.0_4000.0FHAG\n",
"325.0Ke\n",
"285.0K\n",
"290.0_300.0Ke\n",
"7.5TILT\n",
"1828.8FHAG\n",
"280.0Ke\n",
"500.0_450.0MB\n",
"305.0_315.0Ke\n",
"250.0K\n",
"4500.0FHAG\n",
"1250.0FHAG\n",
"0.0_10000.0FHAG\n",
"4500.0_5000.0FHAG\n",
"250.0_350.0K\n",
"270.0Ke\n",
"275.0K\n",
"315.0Ke\n",
"500.0_300.0MB\n",
"350.0_300.0MB\n",
"750.0FHAG\n",
"19.5TILT\n",
"2000.0_2500.0FHAG\n",
"850.0_700.0MB\n",
"350.0K\n",
"265.0K\n",
"6000.0FHAG\n",
"8000.0_9000.0FHAG\n",
"700.0_300.0LYRMB\n",
"850.0_700.0LYRMB\n"
2018-09-05 15:52:38 -06:00
]
}
],
"source": [
"request.setParameters(\"T\")\n",
"availableLevels = DataAccessLayer.getAvailableLevels(request)\n",
"for lvl in availableLevels:\n",
" print(lvl)"
2018-09-05 15:52:38 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* **0.0SFC** is the Surface level\n",
"* **FHAG** stands for Fixed Height Above Ground (in meters)\n",
"* **NTAT** stands for Nominal Top of the ATmosphere\n",
"* **BL** stands for Boundary Layer, where **0.0_30.0BL** reads as *0-30 mb above ground level* \n",
"* **TROP** is the Tropopause level\n",
"\n",
"**request.setLevels()**\n",
"\n",
"For this example we will use Surface Temperature"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
2018-09-05 15:52:38 -06:00
"outputs": [],
"source": [
"request.setLevels(\"2.0FHAG\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## DataAccessLayer.getAvailableTimes()\n",
"\n",
"* **getAvailableTimes(request, True)** will return an object of *run times* - formatted as `YYYY-MM-DD HH:MM:SS`\n",
"* **getAvailableTimes(request)** will return an object of all times - formatted as `YYYY-MM-DD HH:MM:SS (F:ff)`\n",
"* **getForecastRun(cycle, times)** will return a DataTime array for a single forecast cycle."
]
},
{
"cell_type": "code",
"execution_count": 6,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >,\n",
" <DataTime instance: 2020-09-04 16:00:00 >]"
2018-09-05 15:52:38 -06:00
]
},
"execution_count": 6,
2018-09-05 15:52:38 -06:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cycles = DataAccessLayer.getAvailableTimes(request, True)\n",
"times = DataAccessLayer.getAvailableTimes(request)\n",
"fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times)\n",
"list(fcstRun)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## DataAccessLayer.getGridData()\n",
"\n",
"Now that we have our `request` and DataTime `fcstRun` arrays ready, it's time to request the data array from EDEX."
]
},
{
"cell_type": "code",
"execution_count": 7,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Time : 2020-09-04 16:00:00\n",
"Model: RAP13\n",
"Parm : T\n",
"Unit : K\n",
2018-09-05 15:52:38 -06:00
"(337, 451)\n"
]
}
],
"source": [
"response = DataAccessLayer.getGridData(request, [fcstRun[-1]])\n",
"for grid in response:\n",
" data = grid.getRawData()\n",
" lons, lats = grid.getLatLonCoords()\n",
" print('Time :', str(grid.getDataTime()))\n",
"\n",
"print('Model:', str(grid.getLocationName()))\n",
"print('Parm :', str(grid.getParameter()))\n",
"print('Unit :', str(grid.getUnit()))\n",
"print(data.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plotting with Matplotlib and Cartopy\n",
"\n",
"**1. pcolormesh**"
]
},
{
"cell_type": "code",
2018-09-06 13:05:37 -06:00
"execution_count": 8,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Matplotlib is building the font cache; this may take a moment.\n"
]
},
2018-09-05 15:52:38 -06:00
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAm4AAAHhCAYAAADXpjKDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOydd5gV1f3GP9Nu3b6w9F5ExQICduxdLGCNNcaoiYom9hhNYmzRmMTy0ySKiibWaGzRxB7siiIiKmAB6WV7uWXK+f1x5szMvbsgKk1z3+fZZ3ennDnTznnnW96vJoSghBJKKKGEEkoooYRNH/rG7kAJJZRQQgkllFBCCWuHEnEroYQSSiihhBJK+I6gRNxKKKGEEkoooYQSviMoEbcSSiihhBJKKKGE7whKxK2EEkoooYQSSijhO4IScSuhhBJKKKGEEkr4jsDc2B1YHfbff3+xatWqjd2NEr4DyOfzxGKxjd2NEr4jKD0v6x/Nzc3Mnz+fYcOGkUqlCtZ9+OGHDBkyhGQy+Y3bF0KQz+fp6Ohg8eLFpNNpamtrKS8vR9O0b9v9Anzd50UIwfz582lpaaGqqopUKkU6ne50Hb4KS5cuZcmSJWiaxujRo79ut79zsG2bRYsW0dzcTFlZGbFYjJqaGsrKyta6jVwuh23bJBIJli1bhhCCeDzO8uXLqa6uprm5mdraWnr27LnezmNdji/vvvvuf4QQ+3daIYTYJH+22247UUIJa4OXXnppY3ehhO8QSs/L+sWDDz4o6urqxOuvv95p3ZtvvikGDBggXNddZ8drbW0VV1xxhdhxxx1FTU2N+OlPfypef/110dHRsU7a/7rPy6OPPiq22267b338a6+9VgBi4sSJwbI333xT3HbbbeKiiy4S9fX136r9TRV77LGHAMQ111wjevfuLaqqqsT5558v6urqxHbbbSfuvPNO4Xne12pzwYIF4swzz/xG+35drMvxBZguuuBHG52gre6nRNxKWFuUJuISvg5Kz8v6QUtLizjllFPEkCFDxLvvvtvlNgceeKC49dZb11sfFixYIK644gqx1VZbiXg8Lnr27Cn22WcfMWXKFGHb9jdq8+s+L6NHjxb/+Mc/vtGxovA8T7z55ptixYoVwbIxY8YIQOywww7ikEMOEdOnTxcff/zxNz63TRELFy4UU6ZMEUII8cADDwTnO2fOHPHCCy+IbbfdVowYMUIcfvjhYv78+Ru5t52xIYhbKcathBJKKKGEb4U33niDbbfdFk3TeP/997t07S1fvpzXX3+dU045Zb31o3///lx22WV88MEHdHR08Pbbb3PGGWdwzz33MH78eFauXLnejq0wcOBAHn/8cfL5/DduY/78+VxzzTU89thjvPHGG6xatQohBNOmTePII49k5syZ1NXV8eMf/5hdd92V008/nZNOOolx48bRrVs3+vfvj6ZpXHfddevwzDYM+vbtGzwjRx99NIsXL2batGkMHz6cPffck7fffhvbtvnnP//JgQceyNy5czdyjzc8NtkYtxJKKKGEEjZ9XH/99dxwww3cdtttHH744avdLpfLkUwmN1h8oa7r9OvXj379+nHYYYdx+eWXs9tuu/Hee++RSCTW23HvvfdeTjjhBLbYYgvOO+88+vXrxxZbbMHgwYNXu08+n+ett95i+vTpZDIZHnroIYYPH86WW27JjTfeyIknnkhbWxsgyempp57KTTfdBMAXX3zB4MGD6dGjB/fddx9Dhgzhjjvu4Morr2TcuHHr7Tw3FHr37l3wv2EYVFdX079/fyorK9lss82wbRvT/N+hM/87Z1pCCSWUUMIaIYRY6+B+IQT33HMPt956K++9916nCbYYffv2paKigqeffpqDDjpoXXR3raHrOldeeSWzZs3itttu42c/+9l6O1YqleKRRx5h2rRp3HbbbTQ1NTFjxgyqq6vp0aMHZWVlbLbZZvTq1YsXXniBzz77jKVLl7LZZpux4447UlZWxsSJEzn//PMLEhoUOSm+P4MGDWL69On07duXHj16AHDIIYcwe/ZsjjzySH79619zxhlnYBjGejvnDYl77rmH6dOnA/Dll19yzTXX/E+RNigRtxJKKKGETRbPPvssEydOZNq0aestszCfz1NdXU1HRwf9+vXjnXfeoa6uDs/z+MMf/sDEiRMZMmQIIMnarFmzePzxx3nggQdwXZeHHnroK0kbQDabZfz48dxzzz3rhLjV19dz11138d///pd58+aRzWZ5/PHH2Wabbbrcvr29nX79+vHQQw9xyCGHMH/+fHr16sXAgQO577776NOnD/vttx+6vm4iiMaPH8+uu+6K67pomsYHH3xAY2Mjra2tzJ49m8WLF3P88cczatQo+vTpQ2Vl5Rrbsyxrteu22267gv/Hjh3Lo48+yocffsgZZ5zB3/72N6699lrGjx+/zrNuNzSOPvpoUqkUDz74IM899xz77rvvxu7ShkdXgW+bwk8pOaGEtUUp2LyEr4Pv0vPy8ccfCyD42XLLLcW1114rXn75ZZHNZtfJMe6+++6g/d13311UVlaKqqoqUVlZGSzfZpttxG677SZ69+4tBg0aJCZPnixee+21r8wOnTNnjrjuuuvE3nvvLcrKysQ+++yz2sSFr4udd95ZHHvsseLhhx8Ws2fPFuPGjRO9evUSRx11lDjvvPPE/fffX9C/ffbZJzifgQMHivHjx4thw4YJTdPE7rvvLrbddlsxZMgQ8fnnnxcc55s8L4sWLSq4b3/84x+/5dl+c7iuK+666y4xbNgwsc022wTZqOsys3dj4eijjxaA6NGjhwBEPB7f6IkaGyI5oWRxK6GEEkrYRNG9e3fKy8tpbW0FYPbs2Vx88cXBek3TOPfcc9l9992pq6vj/fffp7m5mQsuuGCtLUfKhbbHHntw8803M3jwYJqbmxFC8MwzzzBs2DCSySTNzc0MHDiQwYMHf6XVRgjBr3/9a/785z8zadIkzjrrLB555BEqKiq+4ZUobPu+++5j7ty5vPjii0HM3EsvvcSMGTP48ssvWbhwIZdddhmJRILDDjsMgH/+85+0tLRQU1NDPB4P2vM8D13XZbaerjN48GCOPvpoLrzwwm9s5aytreWSSy5hyZIlHHzwwUyYMOFbn/c3ha7rnHzyyZx00kmcddZZHHzwwSSTSV588UUeffTRNcYlfhuo67o+ce+993LddddhGAYjR46kqamJAw88kGeeeeZ74xruEl2xuU3hp2RxK2Ft8V2yoJSw8fFde15aWlrE008/Lf70pz+JpUuXikWLFol//OMf4sc//nGBVaern5133ln84he/EM8++6xobW0N2nz55ZfFQw89JGbOnCl+/etfi5qaGvHpp5+usz6ff/75Yty4cWLZsmUim82KZ555Rtx+++3i7rvvFjfeeKO4+OKLxYknniiOPvpoMW/evLVqM5/PiyeeeEJst912YtSoUeLtt99e4/Y33XSTGDJkiDj++OPFRRddJKZOnSo+/vjjNVqaPvroI3HYYYcJQNxyyy1CiHX3vORyOfHggw+KP/3pT2LOnDnrpM2vC8dxxK233hpopY0bN05su+22YuzYseKSSy4Rq1atWifHOeeccwQgUqmUGDp0qDj77LPFO++8I4QQ4sorrxTpdFosXLjwWx9n1113FYCYNWuWECK0dE6ePPlbt/1NsSEsbppct+lhzJgxQgUgllDCmvDyyy+z++67b+xulPAdwffteTnuuOO47777ANh666055phjyOfz/OEPf6ClpYVevXrR0tJCe3s7AwYMCAb/kSNHMn/+fLbbbjuuuuoq+vfvv876NHr0aFpbW+nVqxezZs1iyy23DLL/Kioq6N27N7169WLGjBnU19fz97//fbVtrVq1ihNOOIEXXniB0aNHc9555zFp0qSvtOY4jsNzzz3HihUrWLhwIR9++CFvv/02DQ0NjB07lh122IH99tuP0aNH88Ybb3D11Vcze/Zsjj/+eH76058GWaBr+7wIIVi2bBmrVq0iFotRXl5Or1690DQNIQRbb701c+fO5eCDD+bNN98knU5z3XXXBRbBDYl
2018-09-05 15:52:38 -06:00
"text/plain": [
"<Figure size 1152x648 with 2 Axes>"
2018-09-05 15:52:38 -06:00
]
},
"metadata": {
"needs_background": "light"
},
2018-09-05 15:52:38 -06:00
"output_type": "display_data"
}
],
"source": [
"%matplotlib notebook\n",
2018-09-05 15:52:38 -06:00
"import matplotlib.pyplot as plt\n",
"import matplotlib\n",
"import cartopy.crs as ccrs\n",
"import cartopy.feature as cfeature\n",
"from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER\n",
"import numpy as np\n",
"import numpy.ma as ma\n",
"from scipy.io import loadmat\n",
"def make_map(bbox, projection=ccrs.PlateCarree()):\n",
" fig, ax = plt.subplots(figsize=(16, 9),\n",
" subplot_kw=dict(projection=projection))\n",
" ax.set_extent(bbox)\n",
" ax.coastlines(resolution='50m')\n",
" gl = ax.gridlines(draw_labels=True)\n",
" gl.top_labels = gl.right_labels = False\n",
2018-09-05 15:52:38 -06:00
" gl.xformatter = LONGITUDE_FORMATTER\n",
" gl.yformatter = LATITUDE_FORMATTER\n",
" return fig, ax\n",
"\n",
"cmap = plt.get_cmap('rainbow')\n",
"bbox = [lons.min(), lons.max(), lats.min(), lats.max()]\n",
"fig, ax = make_map(bbox=bbox)\n",
"cs = ax.pcolormesh(lons, lats, data, cmap=cmap)\n",
"cbar = fig.colorbar(cs, extend='both', shrink=0.5, orientation='horizontal')\n",
"cbar.set_label(grid.getLocationName() +\" \" + grid.getLevel() + \" \" \\\n",
" + grid.getParameter() + \" (\" + grid.getUnit() + \") \" \\\n",
2018-09-05 15:52:38 -06:00
" + \"valid \" + str(grid.getDataTime().getRefTime()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**2. contourf**"
]
},
{
"cell_type": "code",
2018-09-06 13:05:37 -06:00
"execution_count": 9,
2018-09-05 15:52:38 -06:00
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAm4AAAHhCAYAAADXpjKDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAAEAAElEQVR4nOydd7jUVP7GP5k+t/dL51IFRHpTFAUUKxawYe+6FtTFupa113V3Las/VxHRXbuunVWsqIgIKgJKkd65vU8/vz8yySSZZGZuobnzPg8PdybJOSfJmZw33/J+JSEEaaSRRhpppJFGGmns/bDt6QGkkUYaaaSRRhpppJEa0sQtjTTSSCONNNJIYx9BmrilkUYaaaSRRhpp7CNIE7c00kgjjTTSSCONfQRp4pZGGmmkkUYaaaSxjyBN3NJII4000kgjjTT2ETj29ACscNRRR4mKioo9PYw09gEEAgFcLteeHkYa+wjS82XXo7a2lvXr19OnTx8yMjJ025YtW0avXr3wer2tbl8IQSAQoKmpiS1btpCZmUlhYSHZ2dlIktTW4evQ0vkihGD9+vXU1dWRl5dHRkYGmZmZcdchGbZt28bWrVuRJIlhw4a1dNj7HILBIJs3b6a2tpasrCxcLhcFBQVkZWWl3Ibf7ycYDOLxeNi+fTtCCNxuNzt27CA/P5/a2loKCwvp0KHDLjuP9ny+LF68+CMhxFFxG4QQe+W/4cOHizTSSAWff/75nh5CGvsQ0vNl1+LVV18VJSUlYv78+XHbFixYILp37y7C4XC79VdfXy/uuusuceCBB4qCggJx+eWXi/nz54umpqZ2ab+l8+Wtt94Sw4cPb3P/DzzwgADElClT1O8WLFggnnrqKXHjjTeKysrKNrW/t2L8+PECEPfff7/o1KmTyMvLE9ddd50oKSkRw4cPF88995yIRCItanPDhg3iiiuuaNWxLUV7Pl+ARcKEH+1xgmb1L03c0kgV6YU4jZYgPV92Derq6sQFF1wgevXqJRYvXmy6zzHHHCOefPLJXTaGDRs2iLvuuksccMABwu12iw4dOogjjjhCzJw5UwSDwVa12dL5MmzYMPHGG2+0qi8tIpGIWLBggdi5c6f63YgRIwQgxowZI44//nixaNEi8euvv7b63PZGbNq0ScycOVMIIcQrr7yinu/KlSvFp59+KoYMGSL69esnTjrpJLF+/fo9PNp47A7ilo5xSyONNNJIo0349ttvGTJkCJIk8dNPP5m69nbs2MH8+fO54IILdtk4unXrxm233cbPP/9MU1MTCxcu5LLLLuOFF15g3LhxlJeX77K+FZSVlfHOO+8QCARa3cb69eu5//77efvtt/n222+pqKhACMG8efM45ZRTWLJkCSUlJVx88cUccsghXHrppZx77rmMGjWKoqIiunXrhiRJPPTQQ+14ZrsHXbp0UefIaaedxpYtW5g3bx59+/ZlwoQJLFy4kGAwyH/+8x+OOeYYVq1atYdHvPux18a4pZFGGmmksffj4Ycf5pFHHuGpp57ipJNOstzP7/fj9Xp3W3yhzWaja9eudO3alRNPPJHbb7+dQw89lB9++AGPx7PL+n3xxRc5++yzGTBgADNmzKBr164MGDCAnj17Wh4TCAT47rvvWLRoEc3Nzbz22mv07duX/fffn0cffZRzzjmHhoYGQCanF110EY899hgA69ato2fPnpSWlvLSSy/Rq1cvnn32We655x5GjRq1y85zd6FTp066z3a7nfz8fLp160Zubi777bcfwWAQh+N/h87875xpGmmkkUYaCSGESDm4XwjBCy+8wJNPPskPP/wQt8Aa0aVLF3Jycvjwww859thj22O4KcNms3HPPfewdOlSnnrqKa699tpd1ldGRgZvvvkm8+bN46mnnqKmpoYff/yR/Px8SktLycrKYr/99qNjx458+umnrFmzhm3btrHffvtx4IEHkpWVxZQpU7juuut0CQ0KOTHenx49erBo0SK6dOlCaWkpAMcffzzLly/nlFNO4Y477uCyyy7DbrfvsnPenXjhhRdYtGgRABs3buT+++//nyJtkCZuaaSRRhp7LT7++GOmTJnCvHnzdllmYSAQID8/n6amJrp27cr3339PSUkJkUiEv/71r0yZMoVevXoBMllbunQp77zzDq+88grhcJjXXnstKWkD8Pl8jBs3jhdeeKFdiFtlZSWzZs3iyy+/ZPXq1fh8Pt555x0GDx5sun9jYyNdu3bltdde4/jjj2f9+vV07NiRsrIyXnrpJTp37syRRx6JzdY+EUTjxo3jkEMOIRwOI0kSP//8M9XV1dTX17N8+XK2bNnCWWedxdChQ+ncuTO5ubkJ23M6nZbbhg8frvs8cuRI3nrrLZYtW8Zll13Gv/71Lx544AHGjRvX7lm3uxunnXYaGRkZvPrqq8ydO5dJkybt6SHtfpgFvu0N/9LJCWmkinSweRotwb40X3799VcBqP/2339/8cADD4gvvvhC+Hy+dunj+eefV9s/7LDDRG5ursjLyxO5ubnq94MHDxaHHnqo6NSpk+jRo4eYPn26+Oabb5Jmh65cuVI89NBD4vDDDxdZWVniiCOOsExcaCnGjh0rpk2bJl5//XWxfPlyMWrUKNGxY0dx6qmnihkzZoiXX35ZN74jjjhCPZ+ysjIxbtw40adPHyFJkjjssMPEkCFDRK9evcTatWt1/bRmvmzevFl33/72t7+18Wxbj3A4LGbNmiX69OkjBg8erGajtmdm757CaaedJgBRWloqAOF2u/d4osbuSE5IW9zSSCONNPZSFBcXk52dTX19PQDLly/npptuUrdLksQ111zDYYcdRklJCT/99BO1tbVcf/31KVuOFBfa+PHjefzxx+nZsye1tbUIIZgzZw59+vTB6/VSW1tLWVkZPXv2TGq1EUJwxx138H//939MnTqVK6+8kjfffJOcnJxWXgl92y+99BKrVq3is88+U2PmPv/8c3788Uc2btzIpk2buO222/B4PJx44okA/Oc//6Guro6CggLcbrfaXiQSwWazydl6Nhs9e/bktNNO44Ybbmi1lbOwsJCbb76ZrVu3ctxxxzF58uQ2n3drYbPZOO+88zj33HO58sorOe644/B6vXz22We89dZbCeMS2wLluu5KvPjiizz00EPY7XYGDhxITU0NxxxzDHPmzPnduIZNYcbm9oZ/aYtbGqliX7KgpLHnsa/Nl7q6OvHhhx+Kv//972Lbtm1i8+bN4o033hAXX3yxzqpj9m/s2LHiT3/6k/j4449FfX292uYXX3whXnvtNbFkyRJxxx13iIKCAvHbb7+125ivu+46MWrUKLF9+3bh8/nEnDlzxDPPPCOef/558eijj4qbbrpJnHPOOeK0004Tq1evTqnNQCAg3n33XTF8+HAxdOhQsXDhwoT7P/bYY6JXr17irLPOEjfeeKOYPXu2+PXXXxNamn755Rdx4oknCkA88cQTQoj2my9+v1+8+uqr4u9//7tYuXJlu7TZUoRCIfHkk0+qWmmjRo0SQ4YMESNHjhQ333yzqKioaJd+rr76agGIjIwM0bt3b3HVVVeJ77//XgghxD333CMyMzPFpk2b2tzPIYccIgCxdOlSIUTM0jl9+vQ2t91a7A6LmyRv2/swYsQIoQQgppFGInzxxRccdthhe3oYaewj+L3NlzPPPJOXXnoJgEGDBnH66acTCAT461//Sl1dHR07dqSuro7Gxka6d++uPvwHDhzI+vXrGT58OPfeey/dunVrtzENGzaM+vp6OnbsyNKlS9l///3V7L+cnBw6depEx44d+fHHH6msrOTf//63ZVsVFRWcffbZfPrppwwbNowZM2YwderUpNacUCjE3Llz2blzJ5s2bWLZsmUsXLiQqqoqRo4cyZgxYzjyyCMZNmwY3377Lffddx/Lly/nrLPO4vLLL1ezQFOdL0IItm/fTkVFBS6Xi+zsbDp27IgkSQghGDRoEKtWreK4445jwYIFZGZm8tBDD6kWwd0Jv9/PggULsNlsZGZm4vP5eP7553nmmWc4+uij+fDDD9vU/vvvv8+ZZ57Jrbf
2018-09-05 15:52:38 -06:00
"text/plain": [
"<Figure size 1152x648 with 2 Axes>"
2018-09-05 15:52:38 -06:00
]
},
"metadata": {
"needs_background": "light"
},
2018-09-05 15:52:38 -06:00
"output_type": "display_data"
}
],
"source": [
"fig2, ax2 = make_map(bbox=bbox)\n",
"cs2 = ax2.contourf(lons, lats, data, 80, cmap=cmap,\n",
" vmin=data.min(), vmax=data.max(), extend='both')\n",
"cbar2 = fig2.colorbar(cs2, shrink=0.5, orientation='horizontal')\n",
"cbar2.set_label(grid.getLocationName() +\" \" + grid.getLevel() + \" \" \\\n",
" + grid.getParameter() + \" (\" + grid.getUnit() + \") \" \\\n",
2018-09-05 15:52:38 -06:00
" + \"valid \" + str(grid.getDataTime().getRefTime()))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
2018-09-05 15:52:38 -06:00
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
2018-09-05 15:52:38 -06:00
"language": "python",
"name": "python3"
2018-09-05 15:52:38 -06:00
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
2018-09-05 15:52:38 -06:00
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
2018-09-05 15:52:38 -06:00
}
},
"nbformat": 4,
"nbformat_minor": 1
}