Key Highlights
- Added new realtime and mission-centric functionality to the recon module
- Recon data is now available back to 2006, and for the East and Central Pacific basins, with faster performance for reading in data
- Improved methodology of ``utils.get_basin()``, allowing for more accurate ACE calculations and Season objects within a basin
- New support for cross-basin storms between the North Atlantic and East Pacific basins
- New functionality to plot GEFS ensembles and operational models for Storm objects
- Added forecast wind radii for storms where this data is available
Contributors
tomerburg and splillo contributed code and code reviews to this release. GC-OCEAN, scaparotta and carolakaiser contributed to issues that were resolved as part of this release.
Non backwards compatible changes
- Previously deprecated function ``realtime.RealtimeStorm.get_nhc_discussion_realtime()`` has been removed. Use ``get_discussion_realtime()`` instead.
- ``tracks.TrackDataset.ace_climo()`` removed a previously non-functional argument "date_range" and replaced it with "month_range".
New classes
- `RealtimeRecon` - retrieves for the latest active recon missions and allows to retrieve a Mission object for each mission
- `Mission` - unlike ReconDataset and its accompanying subclasses (hdobs, dropsondes, vdms), Mission objects are not storm-centric, meaning there is no underlying storm track that recon observations are centered relative to. This means Mission objects have far fewer capabilities, but can be much quicker to use.
- Mission objects do have a new `status` variable for HDOBs that determines the status of the mission (e.g., "En Route", "In Storm"), and can be used to spatially subset the `Mission.plot_points()` method. The latest status of the Mission object can be retrieved using the `Mission.status()` method.
New functions
- `recon.hdobs.plot_time_series()` - plots time series of HDOB observations of one or two variables on the same axis
- `recon.ReconDataset.get_mission()` - retrieves a Mission object for a requested mission number
- `tracks.Storm.plot_ensembles()` - This function overhauls the now-removed `plot_gefs_ensembles()` function, fixing many bugs in data retrieval in that prior function and adding cumulative track density. This also addresses 123.
- `tracks.Storm.plot_models()` - This function plots all operational models initialized at a requested time, in addition to optionally overlaying Best Track verification.
- `tracks.Storm.get_recon()` - This function overhauls the previous iteration of this function, now set to retrieve all recon observations for the storm and store the resulting ReconDataset object as an attribute of Storm.
- `realtime.Realtime.update()` - updates Realtime objects with the latest data
- `utils.calc_ensemble_ellipse()` - This function calculates an ensemble location spread ellipse following the methodology of Hamill et al. (2011).
Code Improvements
- urllib3 is now used to read in recon data from NHC, substantially speeding up runtime
- Realtime objects now have attributes that can be accessed as a dictionary via the `attrs` attribute
- Added new `plot_gridlines` argument to the `map_prop` dict to disable/enable plotting gridlines
- Added an option of plotting wind barbs for recon `plot_points()` method
- Added a new colormap `category_recon` for select recon plots, detailed in the documentation, adding a new color between 50-64 knots
- VDMs can now be optionally plotted in ``Mission.plot_points()``
- Added a separate HDOBs parser for 2006 data, the ability to parse VDMs and dropsondes going back to 2006, and hard-code HDOBs URLs prior to 2014 to allow for recon data to be fully read in back to 2006
- Added the ability to read in recon missions in the East and Central Pacific basins
- Added the option to determine whether a recon mission is "in storm" based on height instead of pressure, as pressure data is not available prior to 2007
- Added shapefiles delineating the North Atlantic & East Pacific basins to more accurately reflect whether a tropical cyclone is in either basin. This improves the results from ``utils.get_basin()``. This now means cross-basin Storm objects no longer have a constant value for "wmo_basin" regardless of which basin they're in.
- If reading in TrackDataset with ``basin='both'``, cross-basin storms are merged into a single storm if they were previously split with 2 separate names (e.g., Cesar-Douglas 1996), and any cross-basin storm with duplicate entries (e.g., Otto 2016) is filtered with duplicates removed.
- Improved rounding of storm data with lat/lon rounded to nearest tenth, MSLP to nearest integer, and ACE to nearest 0.001.
- Season objects are now supported for global data (``basin='all'``) and for combined Atlantic/East Pacific data (``basin='both'``).
- ``tracks.TrackDataset.ace_climo()`` is now supported for IBTrACS in the West Pacific, North Indian & global basins. South Hemisphere only basins are not fully supported yet.
Bug Fixes
- Fixed bug where summary plots had a mismatch between the cone of uncertainty days
- Fixed bug where a newly formed tropical cyclone continued to carry TWO formation outlook probability
- Added pyshp as a requirement (Issue 156)
- Fixed bug where ReconDataset crashes for newly formed storms without any recon missions yet
- Fixed bug in summary plots where marker size wasn't included in `two_prop`
- Fixed bug where HDOBs weren't sorted by time for some storms
- Fixed bug where some VDMs and dropsondes weren't successfully parsed thus crashing the code
- Fixed bug where summary plots crash if using JTWC as source
- Re-added option to parse JTWC forecasts from NOAA SSD as JTWC server is experiencing issues again
- Fixed bug in parsing HDOBs where extra data in the file causes the parser to crash
- Fixed a bug where recon missions could not be read in for years where a storm was added to HURDATv2 post-operationally (e.g., 2006)
- Added a filter to set erroneous or missing SFMR observations to NaN
- Fixed a bug where dropsondes didn't plot in ``ReconDataset.plot_summary()`` for earlier years where no information on the top lat/lon is available
- Accumulated Cyclone Energy (ACE) is now calculated only within the selected basin(s). Previously storms that existed/entered a basin had their ACE from outside the basin incorrectly counted as part of that basin's ACE.
- For cross-basin storms, the ``Season.summary()`` method, and accordingly any function that relies on it (e.g., season statistics, basin climatology) now displays the cyclone statistics only within the selected basin(s). For example, if a storm peaked at 50 kt within the selected basin but intensified to 120 kt outside of the basin, its peak intensity within a Season object is now listed as 50 kt instead of 120 kt.
- Fixed a bug with erroneous "operational_id" values for Central Pacific storms.
- Add JTWC a-deck archived forecast retrieval from 2020 onwards
- Add multi-dimension support for `utils.accumulated_cyclone_energy()`
- Season objects now display the proper number of storms & storm ACE regardless of NaNs in wind data
- Manually removed references to an erroneous storm in the North Indian IBTrACS dataset
- Fixed functions relying on `tracks.Season.summary()` such as `tracks.TrackDataset.to_dataframe()` and `ace_climo()` where attempts to retrieve seasons without storms caused an error. This addresses 160.
- For `realtime.Realtime.plot_summary()`, forecasts are no longer plotted if they are outdated by over 12 hours
- Fixed season start date calculations for multi-basin TrackDataset instances