wxdata 1.2.7__tar.gz → 1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. wxdata-1.4/PKG-INFO +536 -0
  2. wxdata-1.4/README.md +507 -0
  3. {wxdata-1.2.7 → wxdata-1.4}/pyproject.toml +4 -2
  4. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/__init__.py +40 -8
  5. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/aigefs/aigefs.py +94 -75
  6. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/aigefs/url_scanners.py +3 -3
  7. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/aigfs/aigfs.py +44 -33
  8. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/aigfs/url_scanners.py +3 -3
  9. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/client/client.py +102 -88
  10. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/ecmwf/__init__.py +4 -2
  11. wxdata-1.4/src/wxdata/ecmwf/ecmwf.py +2795 -0
  12. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/ecmwf/file_funcs.py +3 -25
  13. wxdata-1.4/src/wxdata/ecmwf/keys.py +282 -0
  14. wxdata-1.4/src/wxdata/ecmwf/parsers.py +39 -0
  15. wxdata-1.4/src/wxdata/ecmwf/url_scanners.py +892 -0
  16. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/fems/fems.py +87 -74
  17. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gefs/gefs.py +121 -105
  18. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gefs/url_scanners.py +9 -9
  19. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gfs/gfs.py +89 -69
  20. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gfs/url_scanners.py +9 -9
  21. wxdata-1.4/src/wxdata/hgefs/__init__.py +1 -0
  22. wxdata-1.4/src/wxdata/hgefs/hgefs.py +241 -0
  23. wxdata-1.4/src/wxdata/hgefs/paths.py +47 -0
  24. wxdata-1.4/src/wxdata/hgefs/url_scanner.py +236 -0
  25. wxdata-1.4/src/wxdata/metars/metar_obs.py +132 -0
  26. wxdata-1.4/src/wxdata/noaa/__init__.py +6 -0
  27. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/noaa/nws.py +240 -48
  28. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/post_processors/__init__.py +1 -0
  29. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/post_processors/aigefs_post_processing.py +30 -78
  30. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/post_processors/aigfs_post_processing.py +19 -69
  31. wxdata-1.4/src/wxdata/post_processors/ecmwf_post_processing.py +1685 -0
  32. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/post_processors/gefs_post_processing.py +334 -384
  33. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/post_processors/gfs_post_processing.py +151 -202
  34. wxdata-1.4/src/wxdata/post_processors/hgefs_post_processing.py +193 -0
  35. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/post_processors/rtma_post_processing.py +69 -119
  36. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/rtma/rtma.py +65 -62
  37. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/rtma/url_scanners.py +8 -6
  38. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/soundings/wyoming_soundings.py +114 -98
  39. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/utils/__init__.py +5 -3
  40. wxdata-1.4/src/wxdata/utils/exceptions.py +25 -0
  41. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/utils/file_funcs.py +46 -0
  42. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/utils/file_scanner.py +5 -11
  43. wxdata-1.4/src/wxdata/utils/progress_bar.py +44 -0
  44. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/utils/scripts.py +7 -7
  45. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/utils/tools.py +96 -22
  46. wxdata-1.4/src/wxdata.egg-info/PKG-INFO +536 -0
  47. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata.egg-info/SOURCES.txt +9 -0
  48. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata.egg-info/requires.txt +3 -1
  49. wxdata-1.2.7/PKG-INFO +0 -474
  50. wxdata-1.2.7/README.md +0 -447
  51. wxdata-1.2.7/src/wxdata/ecmwf/ecmwf.py +0 -749
  52. wxdata-1.2.7/src/wxdata/ecmwf/url_scanners.py +0 -745
  53. wxdata-1.2.7/src/wxdata/metars/metar_obs.py +0 -115
  54. wxdata-1.2.7/src/wxdata/noaa/__init__.py +0 -3
  55. wxdata-1.2.7/src/wxdata/post_processors/ecmwf_post_processing.py +0 -1123
  56. wxdata-1.2.7/src/wxdata.egg-info/PKG-INFO +0 -474
  57. {wxdata-1.2.7 → wxdata-1.4}/LICENSE +0 -0
  58. {wxdata-1.2.7 → wxdata-1.4}/setup.cfg +0 -0
  59. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/aigefs/__init__.py +0 -0
  60. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/aigefs/paths.py +0 -0
  61. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/aigfs/__init__.py +0 -0
  62. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/aigfs/paths.py +0 -0
  63. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/calc/__init__.py +0 -0
  64. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/calc/derived_fields.py +0 -0
  65. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/calc/kinematics.py +0 -0
  66. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/calc/thermodynamics.py +0 -0
  67. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/calc/unit_conversion.py +0 -0
  68. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/client/__init__.py +0 -0
  69. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/ecmwf/paths.py +0 -0
  70. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/fems/__init__.py +0 -0
  71. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/fems/raws_sigs.py +0 -0
  72. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gefs/__init__.py +0 -0
  73. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gefs/exception_messages.py +0 -0
  74. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gefs/file_funcs.py +0 -0
  75. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gefs/paths.py +0 -0
  76. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gefs/process.py +0 -0
  77. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gfs/__init__.py +0 -0
  78. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gfs/exception_messages.py +0 -0
  79. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/gfs/paths.py +0 -0
  80. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/metars/__init__.py +0 -0
  81. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/metars/_clean_data.py +0 -0
  82. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/rtma/__init__.py +0 -0
  83. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/rtma/file_funcs.py +0 -0
  84. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/rtma/keys.py +0 -0
  85. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/rtma/process.py +0 -0
  86. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/soundings/__init__.py +0 -0
  87. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/soundings/_exceptions.py +0 -0
  88. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/utils/coords.py +0 -0
  89. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/utils/nomads_gribfilter.py +0 -0
  90. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/utils/recycle_bin.py +0 -0
  91. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata/utils/xmacis2_cleanup.py +0 -0
  92. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata.egg-info/dependency_links.txt +0 -0
  93. {wxdata-1.2.7 → wxdata-1.4}/src/wxdata.egg-info/top_level.txt +0 -0
wxdata-1.4/PKG-INFO ADDED
@@ -0,0 +1,536 @@
1
+ Metadata-Version: 2.4
2
+ Name: wxdata
3
+ Version: 1.4
4
+ Summary: A Python library that acts as a client to download, pre-process and post-process weather data. Friendly for users on VPN/PROXY connections.
5
+ Author: Eric J. Drewitz
6
+ Project-URL: Documentation, https://github.com/edrewitz/wxdata/blob/main/Documentation/Landing%20Page.md
7
+ Project-URL: Repository, https://github.com/edrewitz/wxdata/tree/main
8
+ Keywords: meteorology,atmospheric sciences
9
+ Classifier: Programming Language :: Python
10
+ Classifier: Topic :: Scientific/Engineering
11
+ Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
12
+ Classifier: Operating System :: OS Independent
13
+ Requires-Python: >=3.10
14
+ Description-Content-Type: text/markdown
15
+ License-File: LICENSE
16
+ Requires-Dist: metpy>=1.5.1
17
+ Requires-Dist: numpy>=1.24
18
+ Requires-Dist: pandas>=2.2
19
+ Requires-Dist: xarray>=2023.1.0
20
+ Requires-Dist: netcdf4>=1.7.1
21
+ Requires-Dist: shapeography>=1.0
22
+ Requires-Dist: beautifulsoup4>=4.13.4
23
+ Requires-Dist: requests>=2.32.4
24
+ Requires-Dist: cfgrib>=0.9.10.4
25
+ Requires-Dist: dask>=2025.5.1
26
+ Requires-Dist: tqdm>=4.67.3
27
+ Requires-Dist: ecmwf-opendata>=0.3.26
28
+ Dynamic: license-file
29
+
30
+ # WxData
31
+
32
+ <img src="https://github.com/edrewitz/WxData/blob/main/icons/weather%20icon.jpg?raw=true" width="200" alt="Alt text" /> <img src="https://github.com/edrewitz/WxData/blob/1be590e9a16033974a592d8cf99f3cd521f95e0b/icons/python%20logo.png?raw=true" width="200" alt="Alt text" />
33
+
34
+ [![Conda Recipe](https://img.shields.io/badge/recipe-wxdata-green.svg)](https://anaconda.org/conda-forge/wxdata) [![Conda Version](https://img.shields.io/conda/vn/conda-forge/wxdata.svg)](https://anaconda.org/conda-forge/wxdata) [![Conda Platforms](https://img.shields.io/conda/pn/conda-forge/wxdata.svg)](https://anaconda.org/conda-forge/wxdata) ![PyPI](https://img.shields.io/pypi/v/wxdata?label=pypi%20wxdata) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/wxdata/badges/license.svg)](https://anaconda.org/conda-forge/wxdata) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/wxdata/badges/latest_release_date.svg)](https://anaconda.org/conda-forge/wxdata)
35
+
36
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.17727621.svg)](https://doi.org/10.5281/zenodo.17727621)
37
+
38
+
39
+
40
+ Anaconda Downloads
41
+
42
+ [![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/wxdata.svg)](https://anaconda.org/conda-forge/wxdata)
43
+
44
+
45
+ PIP Downloads:
46
+
47
+ ![PyPI - Downloads](https://img.shields.io/pypi/dm/wxdata)
48
+
49
+
50
+
51
+ **(C) Eric J. Drewitz 2025-2026**
52
+
53
+ An open-source package that helps meteorologists and weather enthusiats download, pre-process and post-process various types of weather data.
54
+
55
+ This package only retrieves open-source publicly available weather data.
56
+
57
+ This package provides the following extra functionality compared to existing packages for downloading weather data:
58
+
59
+ **How To Install**
60
+
61
+ Copy and paste either command into your terminal or anaconda prompt:
62
+
63
+ *Install via Anaconda*
64
+
65
+ `conda install wxdata`
66
+
67
+ *Install via pip*
68
+
69
+ `pip install wxdata`
70
+
71
+ **How To Update To The Latest Version**
72
+
73
+ Copy and paste either command into your terminal or anaconda prompt:
74
+
75
+ *Update via Anaconda*
76
+
77
+ ***This is for users who initially installed WxData through Anaconda***
78
+
79
+ `conda update wxdata`
80
+
81
+ *Update via pip*
82
+
83
+ ***This is for users who initially installed WxData through pip***
84
+
85
+ `pip install --upgrade wxdata`
86
+
87
+ ***Important Compatibility Information***
88
+
89
+ When a new version of Python comes out, it might not be compatible with the C++ eccodes library immediately (especially on pip/pypi versions).
90
+
91
+ This issue arises when the user is post-processing GRIB data.
92
+
93
+ There are two options to resolve this issue:
94
+
95
+ i) Install wxdata via Anaconda/Miniconda3 --> `conda install wxdata`
96
+
97
+ ii) Set up a new environment with an earlier version of Python (must be Python >= 3.10) and then `pip install wxdata`
98
+
99
+ ***Friendly for users working on VPN/PROXY connections***
100
+
101
+ Depending on which client, the proxy-address:port must be entered as either a dictionary or a string.
102
+
103
+ The clients that use a string for proxies are:
104
+
105
+ 1) All ECMWF clients
106
+
107
+ 2) METAR Observations Client
108
+
109
+ 3) `pixel_query()` tool if the user needs to download the airport station codes list.
110
+
111
+ All other clients use proxies as a dictionary
112
+
113
+ Example: We want to download the latest Observed Sounding Data for San Diego, CA (NKX)
114
+
115
+ proxies=None ---> proxies={
116
+ 'http':'http://your-proxy-address:port',
117
+ 'https':'http://your-proxy-address:port'
118
+ }
119
+
120
+ sounding_data = get_observed_sounding_data('nkx', proxies=proxies)
121
+
122
+ Example: We want to download the ECMWF IFS Data:
123
+
124
+ proxies=None ---> proxies="http://your-proxy-address:port" ---> ds = ecmwf_ifs(proxies=proxies)
125
+
126
+ <img src="https://github.com/edrewitz/WxData/blob/main/diagrams/proxy.png?raw=true" width="500" alt="Alt text" />
127
+
128
+
129
+ For more information on configuring proxies: https://requests.readthedocs.io/en/latest/user/advanced/#proxies
130
+
131
+ - Some data access functions work on VPN/PROXY connections without needing to define VPN/PROXY settings:
132
+ - METARs
133
+ - NOAA Storm Prediction Center/National Weather Service Products
134
+ - FEMS
135
+
136
+ - Data access methods that users need to define VPN/PROXY IP addresses if using a VPN/PROXY connection:
137
+ - Various Forecast Models
138
+ - Observed Sounding Data from University of Wyoming
139
+ - Real-Time Mesoscale Analysis
140
+
141
+ 1) Converts GRIB variable keys into variable keys that are in plain language.
142
+ - (e.g. 'r2' ---> '2m_relative_humidity')
143
+
144
+ 2) Has a scanner that checks if the data files on your PC are up to date with those on the data server.
145
+ - This is a safeguard to protect newer developers from getting temporary IP address bans from the various data servers.
146
+ - Improves performance by preventing the potential of repetative downloading the same dataset.
147
+
148
+ 3) Preserves system memory via the following methods:
149
+ - Clears out old data files before each new data download.
150
+ - Optional setting `clear_recycle_bin` in all functions.
151
+ - When `clear_recycle_bin=True` the computer's recycle/trash bin is cleared with each run of the script using any WxData function.
152
+ - If a user wishes to not clear out their recycle bin `set clear_recycle_bin=False`.
153
+ - Default: `clear_recycle_bin=False`.
154
+
155
+ ## WxData Examples
156
+
157
+ *Regular Users*
158
+ 1) [Downloading METAR Data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/metars.ipynb)
159
+ 2) [Downloading Observed Sounding Data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/soundings.ipynb)
160
+ 3) [Downloading the first 72 hours of the ECMWF IFS and ECMWF AIFS](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/ecmwf.ipynb)
161
+ 4) [Downloading the GEFS members p01 and p02 for only Temperature](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/gefs.ipynb)
162
+ 5) [Downloading the Real-Time Mesoscale Analysis (RTMA)](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/rtma.ipynb)
163
+ 6) [Downloading the RAWS SIG Group Fuels Data and the NFDRS Forecast for the RAWS SIG Groups for the South Ops Geographic Area Coordination Center](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/fems.ipynb)
164
+ 7) [Downloading the SPC Convective Outlook for CONUS](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/spc.ipynb)
165
+ 8) [Downloading NWS Maximum Temperature Forecast for Hawaii](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/nws_hi.ipynb)
166
+ 9) [Downloading the GFS0P25 then performing pixel and line queries on the data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/GFS.ipynb)
167
+ 10) [Downloading various datasets from the Applied Climate Information System (ACIS)](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/xmacis2.ipynb)
168
+ 11) [Downloading AIGFS Data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/aigfs.ipynb)
169
+ 12) [Downloading AIGEFS Data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/aigefs.ipynb)
170
+ 13) [Downloading and plotting the Climate Prediction Center 6-10 Day Precipitation Outlook](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/cpc_precip_outlook.ipynb)
171
+ 14) [Downloading OUN Sounding Data and Using The WxData Linear Anti Aliasing Tool To Interpolate 100 Points Between Each Observed Data Point And Visualize Both Data Sets](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/linear_anti_aliasing.ipynb)
172
+ 15) [Downloading Subsets Of ECMWF IFS Ensemble and AIFS Ensemble Data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/ecmwf_ens.ipynb)
173
+ 16) [Downloading the ECMWF IFS 500 mb Geopotential Height Initial Analysis And Plot A North Pole Stereographic Resolving The Meridian With The WxData Cyclic Point Tool](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/cyclic.ipynb)
174
+
175
+ *Advanced Users*
176
+ 1) [Using the `client` module to download the latest HadCRUT5 Analysis netCDF file and open this dataset in xarray](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/hadcrut5.ipynb)
177
+ 2) [Downloading the GFS0P25 for temperature fields and using run_external_scripts() to post-process this GFS0P25 dataset in an external Python script](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/external_scripts.ipynb)
178
+
179
+ ## WxData Documentation
180
+
181
+ ***Global Forecast System (GFS)***
182
+ 1. [GFS0P25](https://github.com/edrewitz/WxData/blob/main/Documentation/GFS0P25.md)
183
+ 2. [GFS0P25 SECONDARY PARAMETERS](https://github.com/edrewitz/WxData/blob/main/Documentation/GFS0P25%20Secondary%20Parameters.md)
184
+ 3. [GFS0P50](https://github.com/edrewitz/WxData/blob/main/Documentation/GEFS0P50.md)
185
+
186
+ ***AI Global Forecast System (AIGFS)***
187
+ 1. [AIGFS](https://github.com/edrewitz/WxData/blob/main/Documentation/aigfs.md)
188
+
189
+ ***Hybrid Global Ensemble Forecast System (HGEFS)***
190
+ 1. [HGEFS](https://github.com/edrewitz/WxData/blob/main/Documentation/hgefs.md#hybrid-global-ensemble-forecast-system-hgefs)
191
+
192
+ ***Global Ensemble Forecast System (GEFS)***
193
+ 1. [GEFS0P50](https://github.com/edrewitz/wxdata/blob/main/Documentation/GEFS0P50.md#global-ensemble-forecast-system-050-x-050-degree-gefs0p50)
194
+ 2. [GEFS0P50 SECONDARY PARAMETERS](https://github.com/edrewitz/wxdata/blob/main/Documentation/GEFS0P50%20Secondary%20Parameters.md#global-ensemble-forecast-system-050-x-050-degree-secondary-parameters-gefs0p50-secondary-parameters)
195
+ 3. [GEFS0P25](https://github.com/edrewitz/wxdata/blob/main/Documentation/GEFS0P25.md#global-ensemble-forecast-system-025-x-025-degree-gefs0p25)
196
+
197
+ ***AI Global Ensemble Forecast System (AIGEFS)***
198
+ 1. [AIGEFS Members (Pressure Parameters)](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_pressure_members.md)
199
+ 2. [AIGEFS Members (Surface Parameters)](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_surface_members.md)
200
+ 3. [AIGEFS Ensemble Mean & Ensemble Spread](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_single.md)
201
+
202
+ ***ECMWF Open Data***
203
+ 1. [ECMWF IFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_IFS.md)
204
+ 2. [ECMWF IFS Ensemble](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20IFS%20Ensemble.md#ecmwf-ifs-ensemble)
205
+ 3. [ECMWF AIFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_AIFS.md)
206
+ 4. [ECMWF AIFS Ensemble](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20AIFS%20Ensemble.md#ecmwf-aifs-ensemble)
207
+ 5. [ECMWF IFS Wave](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_IFS_Wave.md)
208
+ 6. [ECMWF IFS Wave Ensemble](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20IFS%20Wave%20Ensemble.md#ecmwf-ifs-wave-ensemble)
209
+
210
+ ***Real-Time Mesoscale Analysis (RTMA)***
211
+ 1. [RTMA](https://github.com/edrewitz/wxdata/blob/main/Documentation/rtma.md#real-time-mesoscale-analysis-rtma)
212
+ 2. [RTMA Comparison](https://github.com/edrewitz/wxdata/blob/main/Documentation/rtma%20comparison.md#real-time-mesoscale-analysis-rtma-24-hour-comparison)
213
+
214
+ ***NOAA Storm Prediction Center Outlooks/Climate Prediction Center Outlooks/National Weather Service Forecasts***
215
+ 1. [Get NDFD Grids](https://github.com/edrewitz/wxdata/blob/main/Documentation/noaa.md#noaa-get-storm-prediction-center-outlooks-and-national-weather-service-forecasts-ndfd-grids)
216
+ 2. [Climate Prediction Center Outlooks](https://github.com/edrewitz/WxData/blob/main/Documentation/cpc_outlooks.md#noaanws-climate-prediction-center-outlooks)
217
+
218
+ ***METAR Observations***
219
+ 1. [METAR Observations](https://github.com/edrewitz/wxdata/blob/main/Documentation/metars.md#metar-observations)
220
+
221
+ ***FEMS RAWS Network***
222
+ 1. [Get Single Station RAWS Data](https://github.com/edrewitz/wxdata/blob/main/Documentation/single_raws.md#fems-get-single-raws-station-data)
223
+ 2. [Get Each SIG of RAWS Data for a Geographic Area Coordination Center](https://github.com/edrewitz/wxdata/blob/main/Documentation/raws%20sig.md#fems-get-raws-sig-data-for-a-geographic-area-coordination-center-region)
224
+ 3. [Get NFDRS Forecast Data for Each SIG for a Geographic Area Coordination Center](https://github.com/edrewitz/wxdata/blob/main/Documentation/nfdrs%20forecast.md#fems-get-nfdrs-forecast-data-for-a-raws-sig-for-a-geographic-area-coordination-center-region)
225
+
226
+ ***Observed Atmospheric Soundings***
227
+ 1. [University Of Wyoming Soundings](https://github.com/edrewitz/wxdata/blob/main/Documentation/wyoming_soundings.md)
228
+
229
+ ***GFS Post-Processing***
230
+ 1. [Primary GFS Post-Processing](https://github.com/edrewitz/WxData/blob/main/Documentation/Primary%20GFS%20Post%20Processing.md)
231
+ 2. [Secondary GFS Post-Processing](https://github.com/edrewitz/WxData/blob/main/Documentation/Secondary%20GFS%20Post%20Processing.md)
232
+
233
+ ***AIGFS Post-Processing***
234
+ 1. [AIGFS Post-Processing](https://github.com/edrewitz/WxData/blob/main/Documentation/aigfs_post_processing.md)
235
+
236
+ ***GEFS Post-Processing***
237
+ 1. [Primary GEFS Post-Processing](https://github.com/edrewitz/WxData/blob/main/Documentation/Primary%20GEFS%20Post-Processing.md)
238
+ 2. [Secondary GEFS Post-Processing](https://github.com/edrewitz/WxData/blob/main/Documentation/Secondary%20GEFS%20Post%20Processing.md)
239
+
240
+ ***AIGEFS Post-Processing***
241
+ 1. [AIGEFS Members Post-Processing](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_members_post_processing.md)
242
+ 2. [AIGEFS Single Post-Processing](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_single_post_processing.md)
243
+
244
+ ***HGEFS Post-Processing***
245
+ 1. [HGEFS Post-Processing](https://github.com/edrewitz/WxData/blob/main/Documentation/hgefs_post_processing.md#hybrid-global-ensemble-forecast-system-hgefs-post-processing)
246
+
247
+ ***ECMWF Post-Processing***
248
+ 1. [ECMWF IFS and IFS Ensemble](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20IFS%20Post%20Processing.md#ecmwf-ifs-and-ifs-ensemble-post-processing)
249
+ 2. [ECMWF AIFS and AIFS Ensemble](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20AIFS%20Post%20Processing.md#ecmwf-aifs-and-aifs-ensemble-post-processing)
250
+ 3. [ECMWF IFS Wave and IFS Wave Ensemble](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20IFS%20Wave%20Post%20Processing.md#ecmwf-ifs-wave-and-ifs-wave-ensemble-post-processing)
251
+
252
+ ***Real-Time Mesoscale Analysis Post-Processing***
253
+ 1. [RTMA](https://github.com/edrewitz/WxData/blob/main/Documentation/RTMA%20Post%20Processing.md)
254
+
255
+ ***xmACIS2 Climate Data***
256
+ 1. [xmACIS2 Client](https://github.com/edrewitz/WxData/blob/main/Documentation/xmacis2_client.md)
257
+
258
+ ***Custom Gridded Data***
259
+ 1. [Gridded Data Client](https://github.com/edrewitz/WxData/blob/main/Documentation/get_gridded_data.md#get-gridded-data)
260
+
261
+ ***Custom CSV Data***
262
+ 1. [CSV Data Client](https://github.com/edrewitz/WxData/blob/main/Documentation/get_csv_data.md#get-csv-data)
263
+
264
+ ***Cyclic Points For Hemispheric Plots***
265
+ 1. [Cyclic Points](https://github.com/edrewitz/wxdata/blob/main/Documentation/cyclic_point.md#using-wxdata-to-add-cyclic-points-for-hemispheric-plots)
266
+
267
+ ***Shifting Longitude From 0 to 360 --> -180 to 180***
268
+ 1. [shift_longitude](https://github.com/edrewitz/WxData/blob/main/Documentation/shift_longitude.md)
269
+
270
+ ***Pixel Query***
271
+ 1. [pixel_query](https://github.com/edrewitz/WxData/blob/main/Documentation/pixel_query.md)
272
+
273
+ ***Line Query***
274
+ 1. [line_query](https://github.com/edrewitz/WxData/blob/main/Documentation/line_query.md)
275
+
276
+ ***Linear Anti-Aliasing Between Two Points***
277
+ 1. [linear_anti_aliasing](https://github.com/edrewitz/WxData/blob/main/Documentation/linear_anti_aliasing.md#linear-anti-aliasing-between-points)
278
+
279
+ ***Running External Python Scripts In Your Workflow***
280
+
281
+ 1 [run_external_scripts](https://github.com/edrewitz/WxData/blob/main/Documentation/run_external_scripts.md)
282
+
283
+ ## Importing Functions from WxData
284
+
285
+ """
286
+ This file hosts all of the functions in the WxData Python library that directly interact with the user.
287
+
288
+ (C) Eric J. Drewitz 2025-2026
289
+ """
290
+
291
+
292
+ """
293
+ This section of functions are for users who want full wxdata functionality.
294
+
295
+ These functions do the following:
296
+
297
+ 1) Scan for the latest available data.
298
+ - If the data on your local machine is not up to date, new data will download automatically.
299
+ - If the data on your local machine is up to date, new data download is bypassed.
300
+ - This is a safeguard that prevents excessive requests on the data servers.
301
+
302
+ 2) Builds the wxdata directory to store the weather data files.
303
+ - Scans for the directory branch and builds the branch if it does not exist.
304
+
305
+ 3) Downloads the data.
306
+ - Users can define their VPN/PROXY IP Address as a (dict) in their script and pass their
307
+ VPN/PROXY IP address into the function to avoid SSL Certificate errors when requesting data.
308
+ - Algorithm allows for up to 5 retries with a 30 second break between each retry to resolve connection
309
+ interruptions while not overburdening the data servers.
310
+
311
+ 4) Pre-processes the data via filename formatting and correctly filing in the wxdata directory.
312
+
313
+ 5) Post-processing by doing the following tasks:
314
+ - Remapping GRIB2 variable keys into plain language variable keys.
315
+ - Fixing dataset build errors and grouping all variables together.
316
+ - Transforms longitude from 0 to 360 degrees into -180 to 180 degrees.
317
+ - Subsetting the data to the latitude/longitude boundaries specified by the user.
318
+ - Converting temperature from kelvin to units the user wants (default is Celsius).
319
+ - Returning a post-processed xarray.array to the user.
320
+
321
+ 6) Preserves system memory by doing the following:
322
+ - Deleting old data files before each new download.
323
+ - When clear_recycle_bin=True, the user's recycle bin is also cleared.
324
+ """
325
+
326
+ # Global Forecast System (GFS)
327
+ # - GFS 0.25x0.25 Degree Primary Parameters
328
+ # - GFS 0.25x0.25 Degree Secondary Parameters
329
+ # - GFS 0.5x0.5 Degree
330
+ from wxdata.gfs.gfs import(
331
+ gfs_0p25,
332
+ gfs_0p25_secondary_parameters,
333
+ gfs_0p50
334
+ )
335
+
336
+ # AI Global Forecast System (AIGFS)
337
+ from wxdata.aigfs.aigfs import aigfs
338
+
339
+ # Hybrid Global Ensemble Forecast System (HGEFS)
340
+ from wxdata.hgefs.hgefs import hgefs_mean_spread
341
+
342
+ # Global Ensemble Forecast System (GEFS)
343
+ # - GEFS 0.5x0.5 Degree Primary Parameters
344
+ # - GEFS 0.5x0.5 Degree Secondary Parameters
345
+ # - GEFS 0.25x0.25 Degree
346
+ from wxdata.gefs.gefs import(
347
+ gefs_0p50,
348
+ gefs_0p50_secondary_parameters,
349
+ gefs_0p25
350
+ )
351
+
352
+ # AI Global Ensemble Forecast System (AIGEFS)
353
+ # - AIGEFS Pressure Members (Pressure Level Variables)
354
+ # - AIGEFS Surface Members (Surface Level Variables)
355
+ # - AIGEFS Single (AIGEFS Ensemble Mean & AIGEFS Ensemble Spread)
356
+ from wxdata.aigefs.aigefs import(
357
+ aigefs_pressure_members,
358
+ aigefs_surface_members,
359
+ aigefs_single
360
+ )
361
+
362
+ # European Centre for Medium-Range Weather Forecasts (ECMWF)
363
+ # - ECMWF IFS
364
+ # - ECMWF IFS Ensemble
365
+ # - ECMWF AIFS
366
+ # - ECMWF AIFS Ensemble
367
+ # - ECMWF IFS Wave
368
+ # - ECMWF IFS Wave Ensemble
369
+ from wxdata.ecmwf.ecmwf import(
370
+ ecmwf_ifs,
371
+ ecmwf_ifs_ens,
372
+ ecmwf_aifs,
373
+ ecmwf_aifs_ens,
374
+ ecmwf_ifs_wave,
375
+ ecmwf_ifs_wave_ens
376
+ )
377
+
378
+ # FEMS RAWS Network
379
+ # - Single RAWS Station Data
380
+ # - A SIG Group of RAWS Data by GACC
381
+ # - NFDRS Forecast Data For a RAWS Station
382
+ from wxdata.fems.fems import(
383
+ get_single_station_data,
384
+ get_raws_sig_data,
385
+ get_nfdrs_forecast_data
386
+ )
387
+
388
+ # Real-Time Mesoscale Analysis (RTMA)
389
+ # - RTMA Latest
390
+ # - RTMA Comparison Between Two Times
391
+ from wxdata.rtma.rtma import(
392
+ rtma,
393
+ rtma_comparison
394
+ )
395
+
396
+ # NOAA
397
+ # - Storm Prediction Center Outlooks
398
+ # - Climate Prediction Center Outlooks
399
+ # - National Weather Service Forecasts
400
+ from wxdata.noaa.nws import(
401
+ get_ndfd_grids,
402
+ get_cpc_outlook
403
+ )
404
+
405
+ # Observed Upper-Air Soundings
406
+ # (University of Wyoming Database)
407
+ from wxdata.soundings.wyoming_soundings import get_observed_sounding_data
408
+
409
+ # METAR Observational Data (From NOAA)
410
+ from wxdata.metars.metar_obs import download_metar_data
411
+
412
+ """
413
+ This section hosts all the functions and modules that involve post-processing the data.
414
+ These are the functions and modules that:
415
+
416
+ 1) Re-map the GRIB2 Variable Keys into Plain Language Keys
417
+ 2) Build the xarray.array of the various datasets.
418
+
419
+ """
420
+
421
+
422
+ # Global Forecast System (GFS)
423
+ import wxdata.post_processors.gfs_post_processing as gfs_post_processing
424
+
425
+ # AI Global Forecast System (AIGFS)
426
+ import wxdata.post_processors.aigfs_post_processing as aigfs_post_processing
427
+
428
+ # Hybrid Global Ensemble Forecast System (HGEFS)
429
+ import wxdata.post_processors.hgefs_post_processing as hgefs_post_processing
430
+
431
+ # Global Ensemble Forecast System (GEFS)
432
+ import wxdata.post_processors.gefs_post_processing as gefs_post_processing
433
+
434
+ # AI Global Ensemble Forecast System (AIGEFS)
435
+ import wxdata.post_processors.aigefs_post_processing as aigefs_post_processing
436
+
437
+ # European Centre for Medium-Range Weather Forecasts (ECMWF)
438
+ import wxdata.post_processors.ecmwf_post_processing as ecmwf_post_processing
439
+
440
+ # Real-Time Mesoscale Analysis (RTMA)
441
+ from wxdata.post_processors.rtma_post_processing import process_rtma_data
442
+
443
+
444
+ """
445
+ This section hosts the utility functions accessable to the user.
446
+
447
+ These functions provide helpful utilities when analyzing weather data.
448
+
449
+ Utility functions are geared towards the following types of users:
450
+
451
+ 1) Users who want to use their own scripts to download the data however, they
452
+ would like to use the wxdata post-processing capabilities.
453
+
454
+ 2) Users who want to make hemispheric graphics or any graphics where cyclic points
455
+ resolve missing data along the prime meridian or international dateline.
456
+ """
457
+ # WxData function using cartopy to make cyclic points
458
+ # This is for users who wish to make graphics that cross the -180/180 degree longitude line
459
+ # This is commonly used for Hemispheric graphics
460
+ # Function that converts the longitude dimension in an xarray.array
461
+ # From 0 to 360 to -180 to 180
462
+ from wxdata.utils.coords import(
463
+ cyclic_point,
464
+ shift_longitude
465
+ )
466
+
467
+ # Functions to pixel query and query pixels along a line between points A and B
468
+ # Function to interpolate to n amount of points in between x and y values respectively
469
+ from wxdata.utils.tools import(
470
+ pixel_query,
471
+ line_query,
472
+ linear_anti_aliasing
473
+ )
474
+
475
+ """
476
+ This section hosts the various data clients that retrieve various types of data.
477
+
478
+ These clients can be easily configured to work on VPN/PROXY connections.
479
+ """
480
+
481
+ # These are the wxdata HTTPS Clients with full VPN/PROXY Support
482
+ # Client List:
483
+ # - get_gridded_data()
484
+ # - get_csv_data()
485
+ # - get_xmacis_data()
486
+ import wxdata.client.client as client
487
+
488
+ # This function executes a list of Python scripts in the order the user lists them
489
+ from wxdata.utils.scripts import run_external_scripts
490
+
491
+
492
+
493
+
494
+
495
+
496
+
497
+ ## Citations
498
+
499
+ **MetPy**: May, R. M., Goebbert, K. H., Thielen, J. E., Leeman, J. R., Camron, M. D., Bruick, Z.,
500
+ Bruning, E. C., Manser, R. P., Arms, S. C., and Marsh, P. T., 2022: MetPy: A
501
+ Meteorological Python Library for Data Analysis and Visualization. Bull. Amer. Meteor.
502
+ Soc., 103, E2273-E2284, https://doi.org/10.1175/BAMS-D-21-0125.1.
503
+
504
+ **xarray**: Hoyer, S., Hamman, J. (In revision). Xarray: N-D labeled arrays and datasets in Python. Journal of Open Research Software.
505
+
506
+ **cartopy**: Phil Elson, Elliott Sales de Andrade, Greg Lucas, Ryan May, Richard Hattersley, Ed Campbell, Andrew Dawson, Bill Little, Stephane Raynaud, scmc72, Alan D. Snow, Ruth Comer, Kevin Donkers, Byron Blay, Peter Killick, Nat Wilson, Patrick Peglar, lgolston, lbdreyer, … Chris Havlin. (2023). SciTools/cartopy: v0.22.0 (v0.22.0). Zenodo. https://doi.org/10.5281/zenodo.8216315
507
+
508
+ **NumPy**: Harris, C.R., Millman, K.J., van der Walt, S.J. et al. Array programming with NumPy. Nature 585, 357–362 (2020). DOI: 10.1038/s41586-020-2649-2. (Publisher link).
509
+
510
+ **Pandas**: Pandas: McKinney, W., & others. (2010). Data structures for statistical computing in python. In Proceedings of the 9th Python in Science Conference (Vol. 445, pp. 51–56).
511
+
512
+ **dask**: Dask Development Team (2016). Dask: Library for dynamic task scheduling. URL http://dask.pydata.org
513
+
514
+ **cfgrib**: Author: ECMWF, Year: (2025), Title: cfgrib: A Python interface to map GRIB files to xarray, Source: https://github.com/ecmwf/cfgrib
515
+
516
+ **requests**: K. Reitz, "Requests: HTTP for Humans". Available: https://requests.readthedocs.io/.
517
+
518
+ **shapeography**: Eric J. Drewitz. (2026). edrewitz/shapeography: shapeography 1.0 Released (shapeography1.0). Zenodo. https://doi.org/10.5281/zenodo.18676845
519
+
520
+ **geopandas**: Kelsey Jordahl, Joris Van den Bossche, Martin Fleischmann, Jacob Wasserman, James McBride, Jeffrey Gerard, … François Leblanc. (2020, July 15). geopandas/geopandas: v0.8.1 (Version v0.8.1). Zenodo. http://doi.org/10.5281/zenodo.3946761
521
+
522
+ **tqdm**: da Costa-Luis, (2019). tqdm: A Fast, Extensible Progress Meter for Python and CLI. Journal of Open Source Software, 4(37), 1277, https://doi.org/10.21105/joss.01277
523
+
524
+ **ecmwf-opendata**: European Centre for Medium-Range Weather Forecasts (2026). ecmwf-opendata[Computer software]. GitHub. https://github.com/ecmwf/ecmwf-opendata
525
+
526
+ ## Data Sources
527
+
528
+ 1) [National Oceanic and Atmospheric Administration/National Center for Environmental Prediction](https://nomads.ncep.noaa.gov/)
529
+ 2) [European Centre for Medium-Range Weather Forecasts](https://data.ecmwf.int/forecasts/)
530
+ 3) [University of Wyoming](http://www.weather.uwyo.edu/upperair/sounding.shtml)
531
+ 4) [National Oceanic and Atmospheric Administration/National Weather Service](https://tgftp.nws.noaa.gov/)
532
+ 5) [National Oceanic and Atmospheric Administration/Aviation Weather Center](https://aviationweather.gov/)
533
+ 6) [National Oceanic and Atmospheric Administration/Climate Prediction Center](https://www.cpc.ncep.noaa.gov/products/GIS/GIS_DATA/us_tempprcpfcst/index.php)
534
+ 7) [Applied Climate Information System (ACIS)](https://www.rcc-acis.org/docs_webservices.html)
535
+
536
+