Recent Releases of Tropycal
Tropycal - Version 1.3 (06-17-2024)
This release of Tropycal includes many bug fixes, plus an overhauling of the recon interpolation functionality to more accurately interpolate data, include new options to control the method of interpolation, and fix outstanding bugs.
Key Highlights
- Overhauling of recon interpolation algorithm
- Many underlying bug fixes discussed in more detail below
New functionality
tracks.TrackDataset.ace_climo()
- added a new optional argumentmaximum_bounds
that calculates maximum ACE records for a separate year range thanclimo_bounds
(e.g., climatology is calculated from 1950-2020, but extremes from 1900-2020)tracks.TrackDataset.plot_models_wind()
- added the COAMPS model as an option.utils.dynamic_map_extent()
- added more options to control the aspect ratio
Recon interpolation updates
- Hovmollers, maps, and wind swaths: these functions no longer use observations above 475 hPa
- Hovmollers & wind swaths: added a new
missing_window
argument to ignore interpolation where data is missing beyond a certain hour threshold (default is 24 hours) - Hovmollers, maps, and wind swaths: added a new
filter_outer_obs
argument to ignore radii where only a single data point is available, as this interpolates that data point azimuthally even in portions of the cyclone where no data is available - Maps: Selecting a single time vs. a time range now create identical maps, whereas previously the maps varied depending on the time or time ranges passed.
- Maps: Added an optional
output_interval
argument to control how often to plot data in minutes, when plotting multiple maps. Plotting multiple maps now avoids a previous bug where output file names drifted off of the output interval. recon.hdobs.plot_points()
- added option to filter plots by pressure levels
Bug Fixes
tracks.TrackDataset.hurricane_days_climo()
- fixed to correctly handle storms crossing multiple basinstracks.TrackDataset.analogs_from_point()
- fixed bug in km to mile conversion- Fixed a bug with plotting geography order
- Fixed a bug with filtering recon data which sometimes caused the interpolation to fail
- Fixed a bug with reading latitudes for recon missions pre-1992
- Fixed a plotting bug where potential tropical cyclones were improperly labeled as post-tropical TCs
- Improved the method to correctly assign the correct basin to cross-dateline Pacific storms
- Optimized efficiency of reading in realtime JTWC storms from the JTWC ATCF
- Fixed a recon bug where time duplicates led to the interpolation failing
- Fixed a bug with reading IBTrACS data for the North Indian basin (#209)
- Fixed a bug with non-default map projections in gridded_stats (#207)
- Added NHC 2024 cone of uncertainty radii
Climate Change - Natural Hazard and Storm
- Python
Published by tropycal 10 months ago

Tropycal - Version 1.2.1 (09-07-2023)
This release of Tropycal includes bug fixes primarily applied to the rain and recon modules.
Underlying Code Improvements
- Users now need to provide an SSL certificate chain when attempting to access JTWC's ATCF server for realtime objects. The preferable method of accessing JTWC realtime data is using
source="ucar"
. - Realtime invests linked to TWO areas can now have their name labeled in the
realtime.Realtime.plot_summary()
function via thetwo_prop
keyword argument. - Using
pkwnd
for recon now allows for use of the default category windmap. - Removed redundant attempt to fetch online URL for storm objects when creating recon instances.
- Optimized code for the placement of the map legend in
recon.ReconDataset.hdobs.plot_points()
to avoid obscuring data as much as possible.
Bug Fixes
- Improved methodology to find the latest available multi-model forecast
- Recon wind speed colors, both dots and barbs, were previously incorrectly plotted for
recon.ReconDataset.hdobs.plot_points()
. This has now been corrected. - Fixed improper zorder of latitude & longitude lines for rain plots.
- Better filter out improper rain entries.
- Functions that require interpolated recon data now remove flagged entries.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg over 1 year ago

Tropycal - Version 1.2 (08-12-2023)
This release of Tropycal includes many bug fixes, some as a result of Hurricane Dora which crossed the international dateline in real time, while adding some new functionality.
It should be noted that due to an error in uploading this release to PyPI, version 1.1 was skipped such that this is the latest version.
Key Highlights
- The minimum Pandas requirement was changed from v0.23.0 to v1.3
- New SHIPS analyzing functionality was added to Storm objects
- Many underlying bug fixes discussed in more detail below
Contributors
Thanks to those that opened issues or PRs that were resolved with this release: @lisalenorelowe @gameskip @mguzelevich
New functionality
- Several new functions were added:
tracks.Storm.plot_models_wind()
- makes a plot of multi-model forecast sustained wind.tracks.Storm.get_ships_analysis()
- constructs a Storm object consisting of SHIPS analyses and their associated storm environmental parameters.realtime.RealtimeStorm.get_ships_realtime()
- fetches a SHIPS object containing the latest available SHIPS analysis for this storm.recon.hdobs.gridded_stats()
- this function now properly works after fixing numerous bugs, and rearranging plotting code to avert a circular import error from the recon module.
- The function
utils.generate_nhc_cone()
now allows the user to select a custom cone grid resolution. This has further been added as a customization option fortracks.Storm.plot_nhc_forecast()
andrealtime.RealtimeStorm.plot_forecast_realtime()
. - For the previously mentioned two plotting functions, new options are available for displaying the valid storm time in various time zones.
Underlying Code Improvements
- Improved time efficiency for creating multiple summary plots from a realtime object by storing all storm forecasts and TWO shapefiles within the object.
- Substantially cleaned up underlying plotting code, and removed file
plot.py
in the Rain module as this functionality is now handled through the Tracks module. This fix also ensures all plotting functions have access to the sameprop
arguments, such as the visibility of latitude & longitude lines.
Bug Fixes
- Due to Pandas removing a previously deprecated argument, the minimum Pandas version requirement has changed from v0.23.0 to v1.3 (Issue #188 and PR #187).
- Fixed bug where the setting to substitute in HURDATv2 data for Atlantic & Pacific basins within IBTrACS objects raised an error (Issue #190).
- Fixed a bug in plotting realtime JTWC forecasts which previously raised an error.
- Fixed a bug where providing custom properties for modifying the NHC cone would not modify the cone in
tracks.Storm.plot_nhc_forecast()
andrealtime.RealtimeStorm.plot_forecast_realtime()
. - Tweaked the threshold for shifting longitudes for plotting cross-dateline storms as a result of fast-moving Hurricane Dora.
- Fixed two bugs in
realtime.RealtimeStorm.get_realtime_info()
:- Storms which had just been initiated by NHC but without the public advisory files having been uploaded to ATCF would raise an error.
- If a storm only has a single coordinate to date, a value of N/A is now returned for the forward motion direction and speed.
- The
"basin"
attribute of realtime storms in JTWC's area of responsibility now represents its current basin, not its basin of origin. - Fixed several bugs for storms in JTWC's area of responsibility that crossed over from the East Pacific but retain an East Pacific identifier of "EP", as a result of Hurricane Dora.
- Improved error catching for parsing some erroneous a-deck files.
- Fixed bug where
tracks.TrackDataset.gridded_stats()
did not correctly interpolate some percentile thresholds. - Fixed bug for realtime JTWC invests through UCAR's archive such that for a given invest ID, previous invests with the same ID but from months earlier are discarded.
- Fixed bug in plotting multiple storms (e.g.,
tracks.TrackDataset.plot_storms()
ortracks.TrackDataset.plot_analogs_from_shape()
such that passing a prop key and value of"plot_names":True
now displays the storm label within the plot if the start and end points are outside of the plot domain. - All arguments of "save_path" now have consistent behavior (Issue #188).
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg over 1 year ago

Tropycal - Version 1.0.2 (07-11-2023)
This is an critical bug fix release due to failure of numerous functions to correctly plot the NHC cone of uncertainty.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg almost 2 years ago

Tropycal - Version 1.0.1 (07-11-2023)
This minor release includes numerous bug fixes.
Contributors
@tomerburg contributed code to this release.
Bug Fixes
- SHIPS parser now reads the storm name and forecast initialization directly from the provided text content.
- Fixed bug in plotting cross-dateline forecast track for SHIPS summary plot.
- Added Oceanic Heat Content (OHC) unit label in SHIPS summary plot.
- Fixed bug in summary plots where some Tropical Weather Outlook (TWO) probability labels would fail to plot.
- Increase distance threshold required to link invests to TWO points for rare cases where the point's coordinates are well removed from the most recent invest coordinates.
- Improved method to delineate North Atlantic vs. East Pacific basin for rare cases of multiple Central America landfalls from different basins, affecting a handful of storms (e.g., Julia 2022).
- Fixed bug in computing track density for
tracks.Storm.plot_ensembles()
. - Some unnamed storms (e.g., AL012023) previously named "INVEST" are now named "UNNAMED".
- Add credit to plots previously missing it.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg almost 2 years ago

Tropycal - Version 1.0 (07-02-2023)
This is the first major release of Tropycal. From this point onward, following semantic versioning, major releases (e.g., v2.0, v3.0) will consist of non-backwards compatible changes.
Key Highlights
- Non-backwards compatible changes include changing
date
totime
, and changing numerous function arguments - Added new module to read and analyze SHIPS data
- Added new standalone Cartopy plotting functionality
- Numerous major bug fixes, including NHC's new 7-day tropical weather outlooks and improved handling of IBTrACS data
Contributors
@tomerburg contributed code to this release. @splillo contributed code reviews to this release. Additional thanks to Jack Beven of the National Hurricane Center for feedback used to prepare this release, and to Matthew Onderlinde for help with the updated Tropical Weather Outlook (TWO) archive.
Additional thanks to those that opened issues that were resolved with this release: @Justin5999, @bmaschino, @lpulmano, @kylejgillett
Non-backwards compatible changes
- All attributes and function arguments of
date
have been changed totime
. For example,storm.date
is nowstorm.time
. - Numerous functions have arguments such as
year_range
. These have been changed toclimo_bounds
. - Plotting functions in
tracks.TrackDataset
no longer have aplot=True
argument, instead returning the axes by default.
New module
A new ships.Ships
class was added, aiding in storing and analyzing SHIPS data. These can be retrieved from Storm objects, which now have two new methods to assist with this:
tracks.Storm.search_ships()
- search for all available initialization times SHIPS is available.tracks.Storm.get_ships()
- retrieve instance of Ships for the requested initialization time.
New functionality
- The new HAFS-A and HAFS-B models became operational in June 2023. These models are now available in the
tracks.TrackDataset.plot_models()
function. tracks.TrackDataset.ace_climo()
plots can now be subset by month ranges.- Attributes are now available for
tracks.TrackDataset
objects. - Several new functions were added:
tracks.TrackDataset.search_time()
- search for all storms that existed at a requested time.utils.plot_two()
- standalone Cartopy functionality now allows for plotting Tropical Weather Outlooks (TWOs) on an axes instance.utils.plot_cone()
- standalone Cartopy functionality to plot a cone of uncertainty.utils.ships_parser()
- parse SHIPS text into formatted dictionaries.
Functionality Improvements
- By default,
tracks.TrackDataset
now automatically searches for the latest HURDATv2 dataset published on NHC's website, replacing the HRD version as the default HURDATv2 dataset. - Acceptable storm types now include 'TY' and 'ST', which are used in place of 'HU' outside of NHC's area of responsibility.
- Applied a fix to TrackDataset to attempt to objectively determine potential tropical cyclones that never became TCs.
Underlying Code Improvements
- Overhauled test scripts and added sample data to be used for tests.
- Consolidated duplicated functionality such as ACE calculations and custom storm dictionaries to use functions in the
utils
module. - Removed unused imports, deprecated imports, and applied basic autoformatting.
- Moved custom storm tracks such as Cyclone Catarina to a standalone text file format, allowing for potential future additions of custom storm data.
Major Bug Fixes
- A change to NHC's website in 2023 resulted in a change in where archived TWOs are stored. Tropycal code now uses their new locations on the website.
- NHC added new 7-day TWOs operationally in 2023. Summary plots now use these instead of expecting a 5-day TWO.
tracks.Season.summary()
now displays the correct number of overall storms that formed. Count of named storms, hurricanes and major hurricanes were not affected by this bug.- South Hemisphere basin handling was added for obtaining
tracks.Season
objects, as well as the following functions:tracks.TrackDataset.ace_climo()
tracks.TrackDataset.hurricane_days_climo()
tracks.TrackDataset.climatology()
tracks.TrackDataset.season_composite()
tracks.TrackDataset.ace_climo()
now correctly calculates global ACE per calendar year.- Corrected the current basin for realtime storms in JTWC's area of responsibility.
- Corrected IBTrACS parsing which in rare instances read duplicate entries, incorrectly merged storms and displayed incorrect storm IDs.
tracks.TrackDataset.plot_summary()
now works for IBTrACS datasets, and fixed a bug in cross-dateline storms.- Removed outdated references that caused plots in the
rain
module to fail. - Fixed an intermittent bug in parsing realtime JTWC forecasts.
- Analog functions now correctly use inclusive date ranges.
tracks.TrackDataset.rank_storm()
now correctly returns only the ACE for the requested date range and domain.
Minor Bug Fixes
tracks.Storm.plot_ensembles()
now works for times before a tropical cyclone officially formed.- Removed references to recently deprecated
np.int
that caused bugs with newer version of numpy. - Fixed a bug in plotting storms that completely lack sustained wind data.
- Fixed a bug in plotting cross-dateline storms.
- Fixed a bug in plotting
tracks.TrackDataset.wind_pres_relationship()
that had syntax deprecated in Python 3.11. - Using the
basin='both'
argument when creating an instance oftracks.TrackDataset
now correctly recognizes it as a basin in NHC's area of responsibility. - Correctly retrieve the most recent NHC discussion in
tracks.TrackDataset.get_nhc_discussion()
.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg almost 2 years ago

Tropycal - Version 0.6.1 (12-11-2022)
This release consists of a few bug fixes & cleaned up documentation, as well as new example code for Realtime using the active September 2022 Atlantic basin.
Contributors
@tomerburg contributed code to this release.
Bug fixes and underlying code revisions
- Used new function to greatly speed up ensemble track density calculations, allowing changing of the
tracks.Storm.plot_ensembles()
function to a default argument ofinterpolate=True
- Fix plotting ensemble track density for South Hemisphere cyclones, which previously failed to plot
- JTWC Best Track data adds tropical cyclone storm types (e.g., sub/tropical depression or storm) to active invests (e.g., Invest 97S). This fix ensures when plotting the storm track, the storm type in the title is "Invest" for such cases
- Fix storm type in the storm track plot title for IBTrACS using WMO data (
ibtracs_mode="wmo"
) for storms that lack a conventional ID string
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg over 2 years ago

Tropycal - Version 0.6 (09-24-2022)
Key Highlights
- Recon data is now available back to 1989
- Improved summary plot methodology and plotting
- Numerous bug fixes
Contributors
@tomerburg and contributed code to this release. @splillo contributed code reviews to this release. @kylejgillett contributed to issues that were resolved as part of this release.
New functionality
- Recon data can now be accessed back to 1989. This was previously available back to 2006.
- The default SSHWS colormap can now be used for flight-level wind as well as SFMR wind.
- A new utility function
utils.create_storm_dict()
is available to create storm dicts from custom user-input data.
Summary plot improvements
- Fixed NHC forecast initialization selection which was slightly offset from the actual time of the forecast issuance.
- Fixed bug in plotting cones crossing the international dateline.
- Function no longer crashes if a newly formed storm does not yet have a NHC/JTWC forecast issued.
Bug Fixes
- Erroneous recon HDOB obsevations are now removed by default.
- Fixed a bug in
tracks.Storm.plot_ensembles()
if coloring members by MSLP or sustained wind. - Fixed a bug where JTWC forecasts for super typhoons displayed an extratropical marker.
- Fixed the operational ID for an East Pacific storm in 2020 that was classified as a TS in post-season analysis.
- Fixed bug in reading recon HDOBs which would crash if the HDOBs file from NHC's archive was improperly formatted (issue #173).
- Fixed incorrect return type in
utils.get_hdobs_realtime()
.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg over 2 years ago

Tropycal - Version 0.5.2 (08-16-2022)
This release consists of a few important bug fixes.
Contributors
@tomerburg contributed code to this release. @More-Grace contributed to an issue addressed in this release.
TrackDataset.plot_summary()
method:
Bug fixes for - Fixed a bug where this function would crash if plotting a date where a storm had just formed.
- Changed the default plotting basin from global to the selected TrackDataset basin.
- Added the ability to plot TWOs between 2010 and 2014 using NHC's older TWO format.
- Added formation probability labels for TWO areas without an accompanying point label.
- Fixed display of storms with NaN forecast sustained wind.
Other bug fixes
- JTWC a-decks are now preferentially retrieved from NOAA SSD, falling back to UCAR if the former is not available. This extends the a-decks back to 2016 and adds many more models in realtime not available through the UCAR a-decks.
- Forecast dictionaries for invests retrieved from
tracks.Storm.get_operational_forecasts()
now remove a-deck data for previous designations of the same invest number. - Fixed a bug in creating a TrackDataset instance using the JTWC Neumann reanalysis (Issue #168).
utils.get_two_archive()
no longer crashes if a TWO is not available for prior years.utils.get_two_archive()
can now read in TWOs using NHC's older format between 2010 and 2014.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg over 2 years ago

Tropycal - Version 0.5.1 (07-22-2022)
This release includes multiple bug fixes. Note that one of the changes in this update is not backwards compatible, and some of the functions were slightly revised to add features not included in the v0.5 release.
Contributors
@tomerburg contributed code to this release. @splillo contributed reviews to this release.
Non-backwards compatible changes
- In
tracks.Storm.interp()
, the argumenttimeres
is nowhours
.
Modified functionality
tracks.Storm.plot_ensembles()
- theprop_members
property dict has new keywords"color_var"
("vmax" or "mslp"),"cmap"
, and"levels"
, which allow to color the ensemble members by either maximum sustained wind or MSLP.tracks.Storm.interp()
- a new "method" keyword argument is passed onto Scipy's interpolation method, allowing for non-linear interpolation methods such as "quadratic" or "cubic".tracks.Storm.plot_ensembles()
andtracks.Storm.plot_models()
now have a default "forecast=None" argument option, which plots the latest available forecast data. Provide a datetime object to plot any other forecast initialization time.tracks.TrackDataset.gridded_stats()
has a "smooth" property to apply a spatial Gaussian filter. This feature existed before but was not included in the documentation until now.
Bug fixes
- Corrected an error where the "south_atlantic" basin was erroneously referenced to as "south_america", and added a plotting domain for this basin. This addresses issues #164 and #165.
- Corrected the source for custom Cyclone Catarina data.
- Added an option to specify
basin="australia"
when creating an instance of TrackDataset, which fetches the full IBTrACS dataset and subsets data within the Australian basin. This addresses issue #164 and older issue #85. - Round JTWC sustained wind to the nearest increment of 5 where applicable.
- For
tracks.Storm.plot_models()
, improved method for searching which model(s) are available for earlier years. - Fixed bug in plotting recon dropsondes for earlier years.
- Fixed bug with plotting ensemble and model tracks and track density across the dateline. Note that the ensemble ellipse bug still exists in the dateline.
- Fixed bug where using any other window besides 1 hour for
tracks.Storm.interp()
resulted in inaccurate dvmax/dt, dmslp/dt and other derivatives. - Improved colorbar plotting for some functions.
- Fixed bug in using
fillcolor
for plotting storm dots.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg almost 3 years ago

Tropycal - Version 0.5 (07-11-2022)
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. Useget_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 missionMission
- 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 theMission.plot_points()
method. The latest status of the Mission object can be retrieved using theMission.status()
method.
- Mission objects do have a new
New functions
recon.hdobs.plot_time_series()
- plots time series of HDOB observations of one or two variables on the same axisrecon.ReconDataset.get_mission()
- retrieves a Mission object for a requested mission numbertracks.Storm.plot_ensembles()
- This function overhauls the now-removedplot_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 datautils.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 themap_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 astracks.TrackDataset.to_dataframe()
andace_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
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg almost 3 years ago

Tropycal - Version 0.4.2 (06-07-2022)
Both this update and the preceding v0.4.1 update incorporate important bug fixes.
Contributors
@tomerburg contributed code to this release.
Bug fixes
- The original v0.4 release didn't properly remove invests from Realtime objects once they are classified as tropical/potential tropical cyclones. This was fixed with v0.4.1.
- JTWC source for Realtime objects is now functioning again
- Fixed a bug where some recon plots crash for potential tropical cyclones
tracks.TrackDataset.to_dataframe()
previously crashed if a season solely contains a potential tropical cyclonerecon.hdobs.plot_swath()
inadvertently removed a variable reference causing it to crash, which v0.4.2 fixed- An infinite import loop was removed by rearranging numerous plotting functions
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg almost 3 years ago

Tropycal - Version 0.4 (06-02-2022)
Key Highlights
- Overhauled the Recon module with a new data source and vastly expanded functionality
- Added historical tropical cyclone track analogs by point or shape functionality to TrackDataset
- Added new utility functions, including retrieving NHC Tropical Weather Outlook probabilities and matching these to realtime invests
- New functions to plot current or archived global/regional tropical cyclone activity summary plots
- Many new example scripts have been added to documentation, as well as overall improved documentation
- Updated support for newest Matplotlib and Cartopy versions, alongside many bug fixes
Contributors
@tomerburg and @splillo contributed code and code reviews to this release.
Non backwards compatible changes
- Attributes of Storm and RealtimeStorm objects were previously accessed via
storm.coords
. They are now accessed viastorm.attrs
. - Variables/arguments previously named
doInterp
were renamed tointerpolate_data
. This will cause older code referring todoInterp
to return an error. - For
tropycal.tracks.TrackDataset.plot_storms()
, the keyword argumentlabels
has been removed. This has now been replaced by aplot_names
property option in theprop
kwarg. This can now be used for plotting Season objects as well with the option to remove plotting storm names on the map.
Recon module
The recon module was completely overhauled with a new infrastructure replacing the old one. As part of this, recon data is now read in from the National Hurricane Center (NHC) instead of Tropical Atlantic. Available classes within recon include:
- recon.ReconDataset
- Storm and RealtimeStorm objects are initialized with an empty ReconDataset instance stored as an attribute. This can be used to plot a summary of all recon missions for this storm, find active missions for any given time, or initialize any of the following sub-classes.
- recon.dropsondes
- This class contains all dropsonde data for this storm. The primary methods include:
dropsondes.plot_points()
- plot all dropsonde points by variable on a mapdropsondes.plot_skewt()
- plot one or more skew-T's for this stormdropsondes.to_pickle()
- convert to pickle file that can later be re-read instead of re-downloading data each timedropsondes.sel()
- select dropsondes by various thresholdsdropsondes.update()
- update this object with the latest data for realtime missions
- recon.hdobs
- This class contains all High Density Observations (HDOBs) data for this storm. The primary methods include:
hdobs.plot_points()
- plot all HDOB points by variable on a maphdobs.plot_hovmoller()
- plot an azimuthally averaged time-radius hovmoller derived from HDOBshdobs.plot_map()
- plot one or more map(s) of instantaneous HDOBs spatially interpolated to a gridhdobs.plot_swath()
- plot spatial cumulative swath of HDOBs on a maphdobs.gridded_stats()
- interpolate HDOB observations to a spatial gridhdobs.to_pickle()
- convert to pickle file that can later be re-read instead of re-downloading data each timehdobs.sel()
- select HDOBs by various thresholdshdobs.update()
- update this object with the latest data for realtime missions
- recon.vdms
- This class contains all Vortex Data Messages (VDMs) for this storm. The primary methods include:
vdms.plot_points()
- plot all VDM points by variable on a mapvdms.to_pickle()
- convert to pickle file that can later be re-read instead of re-downloading data each timevdms.sel()
- select VDMs by various thresholdsvdms.update()
- update this object with the latest data for realtime missions
New functions
- realtime.Realtime
Realtime.plot_summary()
- Plot summary of latest realtime tropical cyclone/invest/outlook activity
- realtime.RealtimeStorm
RealtimeStorm.get_realtime_formation_prob()
- Matches any invest in NHC's domain to NHC Tropical Weather Outlook (TWO) formation probability
- tracks.TrackDataset
TrackDataset.analogs_from_point()
- Retrieve storms within a radius of a point and their closest approach to the pointTrackDataset.analogs_from_shape()
- Retrieve storms within a bounded shape provided by a list of lat/lon coordinatesTrackDataset.plot_analogs_from_point()
- Plot output fromanalog_from_point()
TrackDataset.plot_analogs_from_shape()
- Plot output fromanalog_from_shape()
TrackDataset.plot_summary()
- Equivalent toRealtime.plot_summary()
but for any archived date
- tracks.Storm
Storm.get_nhc_forecast_dict()
- Retrieve NHC official forecast dictionary by time
- utils
utils.get_two_current()
- Retrieve current NHC Tropical Weather Outlook (TWO) shapefilesutils.get_two_archive()
- Retrieve archived NHC Tropical Weather Outlook (TWO) shapefilesutils.nhc_cone_radii()
- Retrieve NHC cone of uncertainty radii by year and basin (first released in v0.3.4)utils.generate_nhc_cone()
- Generate a gridded NHC cone of uncertainty (first released in v0.3.4)utils.dropsonde_mslp_estimate()
- Estimate the minimum MSLP from a dropsonde released in the eye
Matplotlib 3.5.1 and Cartopy 0.20.2 support
- Existing Tropycal code failed to plot meridians with the newest versions of Cartopy. This fix was tested back to Cartopy 0.17.0 to ensure backwards compatibility.
- Newest versions of Matplotlib changed the behavior of
pcolor
andpcolormesh
, which affected numerous functions such asTrackDataset.gridded_stats()
. This fix was tested back to Matplotlib 3.0.0 to ensure backwards compatibility.
Underlying code changes
- For plotting storm tracks, linecolor options now include
"dvmax_dt"
and"speed"
; storm objects must be interpolated first before these can be used - Interpolating storm data (used for functions such as analogs, gridded_stats and filter_storms) was optimized by ensuring each storm is only interpolated once when needed and stored in the TrackDataset object, avoiding the need to re-interpolate storms if multiple calls are made within the same kernel
- A generic file reading function was added to utils to reduce the number of lines associated with reading files.
Realtime.list_active_storms()
now has an optionalbasin
argument. Default is set to 'all', corresponding to all basins.- NHC cone of uncertainty generation code was completely migrated over to the
tropycal.utils
module - Plotting code was consolidated for easier readability, most notably
plot_storm()
andplot_storms()
were merged to have the same underlying plotting function - Moved all property dicts (e.g., "prop", "map_prop") to kwargs
- Moved
dynamic_map_extent
functionality to utils
Bug fixes
TrackDataset.filter_storms()
previously ignored thresholds such as pressure and wind change ifdoInterp=False
. This new behavior ensures if these thresholds are provided thatdoInterp
is automatically set toTrue
.- Realtime invests are automatically removed when transitioning to a tropical cyclone or potential tropical cyclone.
- NHC's ATCF HTTPS server SSL certificate occasionally expires, rendering it inaccessible via
requests
. This fix uses the FTP server if the HTTPS server cannot be accessed. - Added additional float and integer type checks for functions that previously only accepted integer types.
- Interpolating storms now creates a deep copy of the original storm object, no longer modifying the original object as a result of the interpolation
RealtimeStorm.get_realtime_info()
no longer outputs a warning when the default method is used for storms outside of NHC's domain.- Fixed a plotting bug in class
Tornado
referencing a non-existent variable. - Improved
utils.generate_nhc_cone()
by adding a basin error check and no longer altering the forecast dict's basin value. - Fixed a bug in plotting seasons and multiple storms where storm name labels failed to plot for non-PlateCarree projections.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg almost 3 years ago

Tropycal - Version 0.3.4 (05-04-2022)
Highlights
- Many bug fixes and underlying code cleanup.
Contributors
@tomerburg contributed code to this release. @splillo contributed code reviews to this release. @brianmapes and @cdeciampa contributed to issues that were addressed in this release.
New Functions
The NHC cone generation code was previously internal only. This has now been split into two functions accessible via utils:
utils.nhc_cone_radii()
- returns a dict of NHC cone of uncertainty radii by basin, year and forecast hour(s).utils.generate_nhc_cone()
- returns a gridded NHC cone of uncertainty given a forecast dict, basin, year and days.
Specific Bug Fixes
- The newest versions of matplotlib changed the syntax for certain legend axes functionality. This bug fix adds a check that should work for both newer and older versions of matplotlib (Issue #146).
- SSL certificate verification continues to be an issue with JTWC data. The previous release didn't address this for real-time forecasts from JTWC, which this update does.
- A few storms in the Atlantic HURDATv2 basin were affected by a bug that returned incorrect longitudes east of the Prime Meridian. This has been fixed with this release.
- Rain dataset objects previously had a hard-coded URL to WPC's database. This fix now allows users to input their own rainfall database (Issue #141).
utils.get_basin()
previously incorrectly returned 'North Pacific' instead of 'East Pacific'.- A bug fix was added for the time frame before the start of the hurricane season when the previous year's Best Track files were removed from the main ATCF directory, but have not yet been added into HURDATv2. This now reads in these storms from UCAR's archived best track repository to fill in that gap.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg almost 3 years ago

Tropycal - Version 0.3.3 (02-18-2022)
Highlights
- This urgent bug fix adds a workaround to recent issues with accessing data via the JTWC real-time server.
Contributors
@tomerburg contributed code to this release. @splillo contributed code reviews to this release.
Specific Bug Fixes
- Recent troubles with accessing real-time data from the JTWC server caused Tropycal code to crash when creating an instance of a Realtime object. This fix adds the option of adding a
ssl_certificate=False
argument when creating an instance of a realtime.Realtime object to get around this issue. - Some invests in the JTWC area of responsibility are assigned tropical depression status even if they haven't been classified as such. This bug fix ensures storm types are classified as "invest" for these cases.
- Some files in the JTWC real-time server include "future" storms (e.g., a file containing dates a year in the future). This bug fix removes these cases from being read into realtime.Realtime objects.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg about 3 years ago

Tropycal - Version 0.3.2 (02-15-2022)
Highlights
- Many bug fixes and cleaning up underlying code.
Contributors
@tomerburg contributed code to this release. @splillo contributed code reviews to this release. @srmullens and @raybellwaves contributed to issues that were addressed in this release.
Specific Bug Fixes
- Invest functionality was added previously to Realtime objects, but not to global invests. This update adds global invests.
- Geopy was removed as a dependence a while back, but was not entirely removed from the package configuration script. This bug fix removes any remaining Geopy mention.
- Fix a bug with storm ID length in the utility get_basin() function.
- Identified and fixed a bug where storms at the end of a calendar year in the Southern Hemisphere that had an ID for the following year (e.g., "SH012022" in November 2021) weren't identified in Realtime objects.
- Fixed a bug that prevented multiple functions from using the same axis.
- Fixed a bug with the Cartopy lat/lon label syntax that was changed in newer Cartopy versions.
- Hard-coded a fix for reading HURDATv2 data, as a recent change to the default URL used for HURDATv2 inadvertently created duplicate entries
- SPC's tornado database hasn't updated through 2020 nor 2021, as 2019 remains the most recent year available. This change to TornadoDataset ensures the last 5 years are checked for the most recent year containing tornado data.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg about 3 years ago

Tropycal - Version 0.3.1 (10-04-2021)
Highlights
- Many bug fixes and cleaning up underlying code.
- Multiple functions from
tropycal.tracks.TrackDataset
were previously inadvertently deleted, and have been restored with this update.
Contributors
@tomerburg contributed code to this release. @TomerAberbach contributed code reviews to this release.
Specific Bug Fixes
- Some post-tropical cyclones have had their storm type incorrectly assigned as a tropical cyclone in
realtime.RealtimeStorm.get_realtime_info()
. This has been changed to "Post-Tropical Cyclone". - Storm plotting functions are split between dashed lines for non-tropical cyclones and solid lines for tropical cyclones. The immediate timestep before a TC forms was plotted with a solid black line, but has been changed to a thin black line.
- When adding invest handling capability for Tropycal v0.3, a case that wasn't considered is a tropical cyclone which became post-tropical, then re-assigned as an invest to monitor the potential for re-transitioning into a tropical cyclone. The resulting unintended behavior was for Realtime objects to re-assign those as active tropical cyclones, even though no operational products are produced for such cases. This bug fix reassigns any post-tropical cyclone that has not been tropical for 18+ hours as an invest.
- Realtime objects now delete invests after 9 hours of inactivity, vs. 18 hours for tropical cyclones. In the future this can be optimized further to automatically delete invests that were re-classified as tropical cyclones.
- When reading in JTWC data into a Realtime object, the "TY" typhoon storm type is reassigned to "HU" (hurricane) for continuity purposes between different basins. For some data sources, a Super Typhoon "ST" storm type is included, which was previously not accounted for, resulting in an incorrect classification as an extratropical cyclone. This bug fixes ensures super typhoons are also reassigned to a "HU" storm type.
- When plotting a RealtimeStorm object via
realtime.RealtimeStorm.plot()
, the displayed name treated invests and post-tropical cyclones equally. This has now been fixed such that invests will have their names displayed following invest naming conventions (e.g., "Invest 91L"), while post-tropical cyclones that have been re-designated as invests retain their original name (e.g., "Tropical Storm Peter"). - Central Pacific storms can now have their previous operational forecast data (from the a-deck) accessed.
- The function
tracks.Storm.sel()
only accepted hard int or float types, and crashed if any other variation of int or float types (e.g., numpy.int32) were input. This bug fix ensures any type of integer or float, including all numpy variations, can be accepted as arguments. - Several functions from tracks.TrackDataset were discovered to have been inadvertedly removed in a PR last year, and were re-added:
tracks.TrackDataset.to_dataframe()
tracks.TrackDataset.climatology()
tracks.TrackDataset.season_composite()
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg over 3 years ago

Tropycal - Version 0.3 (09-08-2021)
Highlights
- New Rain module is available, incorporating the tropical cyclone rainfall database provided by the Weather Prediction Center (WPC).
- New Cartopy plotting utility is available for quickly plotting storms on an existing axes instance.
- Major bug fixes, some non-backwards compatible changes (more details below), and cleaned up underlying code.
tropycal.realtime
now provides multiple options for reading in data from the Joint Typhoon Warning Center (JTWC) given recent problems with this data source in Summer 2021.tropycal.realtime
now includes invest handling capabilities for areas under the National Hurricane Center (NHC)'s area of responsibility.- Documentation has now been updated and improved, with more sample code included.
- Tropycal can now be installed via conda-forge.
Contributors
@tomerburg, @TomerAberbach, @raybellwaves and @splillo contributed code to this release.
Specifics
Non backwards compatible changes:
- Plotting functions no longer have a
return_ax
argument, except for Tornado and Recon. By default, the axes instance is now returned, along with additional information if specified in the arguments where applicable. - All plotting functions that had the argument "plot_all" have been renamed to "plot_all_dots" to make the name more intuitive. If true, then all location dots of a tropical cyclone's observed location are plotted even if they fall outside of the standard 0/6/12/18z 6-hour increments.
- All plotting functions now have a "save_path" argument, to allow for saving the image generated. Some of these were previously a mix of only specifying the directory path or including the file name as part of the path; as of v0.3, this now expects to receive a relative or full path that includes the file name, making this consistent across all functions.
New modules:
- tropycal.rain
- Created a new module to read in, interpolate, and plot tropical cyclone rainfall data from the database provided by the Weather Prediction Center (WPC).
New features and updates:
-
tropycal.realtime.Realtime:
- Added several options for reading in JTWC data, or to not read it in at all, when initializing an instance of Realtime.
- Invests from the NHC area of responsibility can now be read in.
-
tropycal.utils:
- New Cartopy utilities were added, to allow for quick plotting of Storm objects on existing axes.
-
General plotting capability
- New options were added for customizing plotting storm tracks, such as using a customized colormap or coloring by wind or minimum pressure
- Storm track labels can now be added for
TrackDataset.plot_storms()
Notable bug fixes:
- Fixed bug in filter_storms where lon values were only accepted from 0 to 360
- Fixed bug in storm plotting options where extratropical points were a mix of solid and dash line
- Removed arguments from multiple functions that were either unused or would break the code if not used in a very specific manner (the latter can be added back later after more thorough testing)
- Fixed bug when plotting seasons directly from an instance of Season
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg over 3 years ago

Tropycal - Version 0.2.1 (05-26-2020)
Highlights
- Many minor bug fixes.
tropycal.realtime
now retrieves all global active tropical cyclones, includes forecast tracks from the Joint Typhoon Warning Center (JTWC), and improved several functions.- Cleaned up underlying code for tool functions and moved many into a single
tropycal.utils
directory.
Specifics
New functions:
- tropycal.utils
- Created a new collection of utility functions that are used internally and are of use to the average user.
New features and updates:
-
tropycal.realtime.RealtimeStorm:
- Added JTWC active tropical cyclones and forecasts.
- Renamed
plot_nhc_forecast_realtime()
asplot_forecast_realtime()
to account for the inclusion of JTWC forecasts. - Improved and fixed bugs in
get_realtime_info()
function. - Added new function
download_graphic_realtime()
to download real time forecast graphics from NHC and JTWC.
-
tropycal.tracks.Dataset:
- In
gridded_stats
, composite difference plots between different ranges of years can now be created.
- In
Notable Bug fixes:
-
Overall:
- Cleaned up documentation for numerous functions.
-
tropycal.recon:
- Fixed bugs for colorbar and contouring in
plot_swath
andplot_hovmoller
.
- Fixed bugs for colorbar and contouring in
-
tropycal.tracks:
- Fixed bugs for colorbar and contouring in
gridded_stats
.
- Fixed bugs for colorbar and contouring in
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg almost 5 years ago

Tropycal - Version 0.2.0 (05-17-2020)
Highlights
tropycal.recon
has been substantially revised, with capabilities of plotting recon data in various formats such as hovmollers and storm-centered data.- New class
tropycal.realtime
was added, with realtime storm handling capabilities. Currently this is only available for storms under NHC's area of responsibility. - Substantial usability improvements, detailed further below.
- Documentation has been improved, with more detailed information on map domains and customization properties.
Specifics
New functions:
-
tropycal.tracks.Dataset:
download_tcr
: Downloads the NHC offical Tropical Cyclone Report (TCR) for the requested storm to the requested directory.
-
tropycal.tracks.Storm:
sel_time
: Subset this storm's data by a range of times or for a single time.query_nhc_discussions
: Searches for the given word or phrase through all NHC forecast discussions for this storm.
-
tropycal.tracks.Season:
get_storm
: Retrieves a Storm object for the requested storm.
New features and updates:
-
Overall:
- For plotting functions, the keyword argument "zoom" has been replaced with "domain".
-
tropycal.tracks.Dataset:
- Updated the default HURDATv2 source to reference the latest release through 2019.
- In
gridded_stats
, the gridded 2D array can now be returned from the function as an xarray DataArray. get_season
can now retrieve a composite of multiple seasons for HURDATv2 data.
-
tropycal.tracks.Storm:
- Storm objects now have variables included as attributes. For example, type "storm.lon" to retrieve all longitude points.
- Added official NHC cone of uncertainty sizes for the 2020 Atlantic & Pacific Hurricane Seasons.
- Added a "dynamic_tropical" domain for plotting storms, only zooming on the portion of the storm when it was a tropical or subtropical cyclone.
-
tropycal.tracks.Season:
- Season objects can now be added together using HURDATv2 data, for uses such as compositing seasons.
- Renamed the
annual_summary
function assummary
, in part to reflect the use of multiple seasons.
Notable Bug fixes:
-
Overall:
- Cleaned up documentation for numerous functions.
-
tropycal.tracks.Storm:
- When printing instance of Storm object, peak intensity statistics no longer include time spent as extratropical.
- Fixed a bug for retrieving operational NHC forecasts for 2019.
- An error message now appears when trying to download a tropical cyclone report (TCR) that doesn't exist.
-
tropycal.tracks.Season:
- Fixed the calculation for the ending time of the season.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg almost 5 years ago

Tropycal - Version 0.1.1 (02-10-2020)
Version 0.1.1 of Tropycal features numerous minor bug fixes, as well as adding a plot_storms()
function to TrackDataset allowing for plotting multiple storms in a single figure.
Climate Change - Natural Hazard and Storm
- Python
Published by tomerburg about 5 years ago

Tropycal - Version 0.1.0 (10-25-2019)
This is the first release of Tropycal! This package offers capability to analyze and plot global tropical cyclone data, as well as tornado data associated with hurricanes in the United States and the ability to retrieve past National Hurricane Center (NHC) forecasts and discussions for Atlantic and Pacific hurricanes.
Climate Change - Natural Hazard and Storm
- Python
Published by tropycal over 5 years ago
