wxdata 1.3__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 (87) hide show
  1. {wxdata-1.3/src/wxdata.egg-info → wxdata-1.4}/PKG-INFO +79 -42
  2. {wxdata-1.3 → wxdata-1.4}/README.md +76 -41
  3. {wxdata-1.3 → wxdata-1.4}/pyproject.toml +3 -1
  4. {wxdata-1.3 → wxdata-1.4}/src/wxdata/__init__.py +27 -5
  5. {wxdata-1.3 → wxdata-1.4}/src/wxdata/aigefs/aigefs.py +39 -25
  6. {wxdata-1.3 → wxdata-1.4}/src/wxdata/aigefs/url_scanners.py +3 -3
  7. {wxdata-1.3 → wxdata-1.4}/src/wxdata/aigfs/aigfs.py +17 -11
  8. {wxdata-1.3 → wxdata-1.4}/src/wxdata/aigfs/url_scanners.py +3 -3
  9. {wxdata-1.3 → wxdata-1.4}/src/wxdata/client/client.py +26 -21
  10. {wxdata-1.3 → wxdata-1.4}/src/wxdata/ecmwf/__init__.py +4 -2
  11. wxdata-1.4/src/wxdata/ecmwf/ecmwf.py +2795 -0
  12. {wxdata-1.3 → 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.3 → wxdata-1.4}/src/wxdata/fems/fems.py +9 -9
  17. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gefs/gefs.py +44 -32
  18. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gefs/url_scanners.py +9 -9
  19. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gfs/gfs.py +43 -27
  20. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gfs/url_scanners.py +9 -9
  21. {wxdata-1.3 → wxdata-1.4}/src/wxdata/hgefs/hgefs.py +18 -11
  22. {wxdata-1.3 → wxdata-1.4}/src/wxdata/hgefs/url_scanner.py +3 -3
  23. {wxdata-1.3 → wxdata-1.4}/src/wxdata/metars/metar_obs.py +15 -2
  24. {wxdata-1.3 → wxdata-1.4}/src/wxdata/noaa/nws.py +8 -6
  25. {wxdata-1.3 → wxdata-1.4}/src/wxdata/post_processors/aigefs_post_processing.py +4 -52
  26. {wxdata-1.3 → wxdata-1.4}/src/wxdata/post_processors/aigfs_post_processing.py +2 -52
  27. {wxdata-1.3 → wxdata-1.4}/src/wxdata/post_processors/ecmwf_post_processing.py +770 -208
  28. {wxdata-1.3 → wxdata-1.4}/src/wxdata/post_processors/gefs_post_processing.py +3 -53
  29. {wxdata-1.3 → wxdata-1.4}/src/wxdata/post_processors/gfs_post_processing.py +3 -54
  30. {wxdata-1.3 → wxdata-1.4}/src/wxdata/post_processors/hgefs_post_processing.py +2 -51
  31. {wxdata-1.3 → wxdata-1.4}/src/wxdata/post_processors/rtma_post_processing.py +2 -52
  32. {wxdata-1.3 → wxdata-1.4}/src/wxdata/rtma/rtma.py +4 -3
  33. {wxdata-1.3 → wxdata-1.4}/src/wxdata/rtma/url_scanners.py +8 -6
  34. {wxdata-1.3 → wxdata-1.4}/src/wxdata/soundings/wyoming_soundings.py +5 -0
  35. {wxdata-1.3 → wxdata-1.4}/src/wxdata/utils/__init__.py +3 -2
  36. wxdata-1.4/src/wxdata/utils/exceptions.py +25 -0
  37. {wxdata-1.3 → wxdata-1.4}/src/wxdata/utils/file_funcs.py +46 -0
  38. {wxdata-1.3 → wxdata-1.4}/src/wxdata/utils/file_scanner.py +4 -10
  39. wxdata-1.4/src/wxdata/utils/progress_bar.py +44 -0
  40. {wxdata-1.3 → wxdata-1.4}/src/wxdata/utils/tools.py +30 -6
  41. {wxdata-1.3 → wxdata-1.4/src/wxdata.egg-info}/PKG-INFO +79 -42
  42. {wxdata-1.3 → wxdata-1.4}/src/wxdata.egg-info/SOURCES.txt +4 -0
  43. {wxdata-1.3 → wxdata-1.4}/src/wxdata.egg-info/requires.txt +2 -0
  44. wxdata-1.3/src/wxdata/ecmwf/ecmwf.py +0 -753
  45. wxdata-1.3/src/wxdata/ecmwf/url_scanners.py +0 -745
  46. {wxdata-1.3 → wxdata-1.4}/LICENSE +0 -0
  47. {wxdata-1.3 → wxdata-1.4}/setup.cfg +0 -0
  48. {wxdata-1.3 → wxdata-1.4}/src/wxdata/aigefs/__init__.py +0 -0
  49. {wxdata-1.3 → wxdata-1.4}/src/wxdata/aigefs/paths.py +0 -0
  50. {wxdata-1.3 → wxdata-1.4}/src/wxdata/aigfs/__init__.py +0 -0
  51. {wxdata-1.3 → wxdata-1.4}/src/wxdata/aigfs/paths.py +0 -0
  52. {wxdata-1.3 → wxdata-1.4}/src/wxdata/calc/__init__.py +0 -0
  53. {wxdata-1.3 → wxdata-1.4}/src/wxdata/calc/derived_fields.py +0 -0
  54. {wxdata-1.3 → wxdata-1.4}/src/wxdata/calc/kinematics.py +0 -0
  55. {wxdata-1.3 → wxdata-1.4}/src/wxdata/calc/thermodynamics.py +0 -0
  56. {wxdata-1.3 → wxdata-1.4}/src/wxdata/calc/unit_conversion.py +0 -0
  57. {wxdata-1.3 → wxdata-1.4}/src/wxdata/client/__init__.py +0 -0
  58. {wxdata-1.3 → wxdata-1.4}/src/wxdata/ecmwf/paths.py +0 -0
  59. {wxdata-1.3 → wxdata-1.4}/src/wxdata/fems/__init__.py +0 -0
  60. {wxdata-1.3 → wxdata-1.4}/src/wxdata/fems/raws_sigs.py +0 -0
  61. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gefs/__init__.py +0 -0
  62. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gefs/exception_messages.py +0 -0
  63. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gefs/file_funcs.py +0 -0
  64. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gefs/paths.py +0 -0
  65. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gefs/process.py +0 -0
  66. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gfs/__init__.py +0 -0
  67. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gfs/exception_messages.py +0 -0
  68. {wxdata-1.3 → wxdata-1.4}/src/wxdata/gfs/paths.py +0 -0
  69. {wxdata-1.3 → wxdata-1.4}/src/wxdata/hgefs/__init__.py +0 -0
  70. {wxdata-1.3 → wxdata-1.4}/src/wxdata/hgefs/paths.py +0 -0
  71. {wxdata-1.3 → wxdata-1.4}/src/wxdata/metars/__init__.py +0 -0
  72. {wxdata-1.3 → wxdata-1.4}/src/wxdata/metars/_clean_data.py +0 -0
  73. {wxdata-1.3 → wxdata-1.4}/src/wxdata/noaa/__init__.py +0 -0
  74. {wxdata-1.3 → wxdata-1.4}/src/wxdata/post_processors/__init__.py +0 -0
  75. {wxdata-1.3 → wxdata-1.4}/src/wxdata/rtma/__init__.py +0 -0
  76. {wxdata-1.3 → wxdata-1.4}/src/wxdata/rtma/file_funcs.py +0 -0
  77. {wxdata-1.3 → wxdata-1.4}/src/wxdata/rtma/keys.py +0 -0
  78. {wxdata-1.3 → wxdata-1.4}/src/wxdata/rtma/process.py +0 -0
  79. {wxdata-1.3 → wxdata-1.4}/src/wxdata/soundings/__init__.py +0 -0
  80. {wxdata-1.3 → wxdata-1.4}/src/wxdata/soundings/_exceptions.py +0 -0
  81. {wxdata-1.3 → wxdata-1.4}/src/wxdata/utils/coords.py +0 -0
  82. {wxdata-1.3 → wxdata-1.4}/src/wxdata/utils/nomads_gribfilter.py +0 -0
  83. {wxdata-1.3 → wxdata-1.4}/src/wxdata/utils/recycle_bin.py +0 -0
  84. {wxdata-1.3 → wxdata-1.4}/src/wxdata/utils/scripts.py +0 -0
  85. {wxdata-1.3 → wxdata-1.4}/src/wxdata/utils/xmacis2_cleanup.py +0 -0
  86. {wxdata-1.3 → wxdata-1.4}/src/wxdata.egg-info/dependency_links.txt +0 -0
  87. {wxdata-1.3 → wxdata-1.4}/src/wxdata.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wxdata
3
- Version: 1.3
3
+ Version: 1.4
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
5
  Author: Eric J. Drewitz
6
6
  Project-URL: Documentation, https://github.com/edrewitz/wxdata/blob/main/Documentation/Landing%20Page.md
@@ -23,6 +23,8 @@ Requires-Dist: beautifulsoup4>=4.13.4
23
23
  Requires-Dist: requests>=2.32.4
24
24
  Requires-Dist: cfgrib>=0.9.10.4
25
25
  Requires-Dist: dask>=2025.5.1
26
+ Requires-Dist: tqdm>=4.67.3
27
+ Requires-Dist: ecmwf-opendata>=0.3.26
26
28
  Dynamic: license-file
27
29
 
28
30
  # WxData
@@ -84,45 +86,44 @@ Copy and paste either command into your terminal or anaconda prompt:
84
86
 
85
87
  ***Important Compatibility Information***
86
88
 
87
- *Python 3.14 is not compatible with the pip version of the eccodes library*
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).
88
90
 
89
- Methods to fix eccodes compatibility with Python 3.14:
91
+ This issue arises when the user is post-processing GRIB data.
90
92
 
91
- 1) Uninstall the pip version of WxData and install WxData via Anaconda
92
-
93
- *Steps For Method 1*
94
- 1) pip uninstall wxdata
95
- 2) conda install wxdata
93
+ There are two options to resolve this issue:
96
94
 
95
+ i) Install wxdata via Anaconda/Miniconda3 --> `conda install wxdata`
97
96
 
98
- 2) If the user is unable to use Anaconda as a package manager, the user must set up a new Python environment with the following specifications:
97
+ ii) Set up a new environment with an earlier version of Python (must be Python >= 3.10) and then `pip install wxdata`
99
98
 
100
- *Specifications*
99
+ ***Friendly for users working on VPN/PROXY connections***
101
100
 
102
- Python >= 3.10 and Python <= 3.13
101
+ Depending on which client, the proxy-address:port must be entered as either a dictionary or a string.
103
102
 
104
- Python 3.10 is compatible.
103
+ The clients that use a string for proxies are:
105
104
 
106
- Python 3.11 is compatible.
105
+ 1) All ECMWF clients
107
106
 
108
- Python 3.12 is compatible.
109
-
110
- Python 3.13 is compatible
111
-
112
- Then pip install wxdata after the new Python environment is set up.
107
+ 2) METAR Observations Client
108
+
109
+ 3) `pixel_query()` tool if the user needs to download the airport station codes list.
113
110
 
114
- 1) Friendly for users working on VPN/PROXY connections.
115
- - Users input their PROXY IP address as a dictionary and pass it into the function to avoid SSL errors
116
- - If the user is on a VPN/PROXY Connection the following is needed:
117
-
118
- proxies=None ---> proxies={
119
- 'http':'http://url',
120
- 'https':'https://url'
121
- }
111
+ All other clients use proxies as a dictionary
122
112
 
123
- [e.g. get_observed_sounding_data('nkx', proxies=proxies)]
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)
124
125
 
125
- <img src="https://github.com/edrewitz/WxData/blob/main/diagrams/proxy.png?raw=true" width="500" alt="Alt text" />
126
+ <img src="https://github.com/edrewitz/WxData/blob/main/diagrams/proxy.png?raw=true" width="500" alt="Alt text" />
126
127
 
127
128
 
128
129
  For more information on configuring proxies: https://requests.readthedocs.io/en/latest/user/advanced/#proxies
@@ -146,9 +147,10 @@ Then pip install wxdata after the new Python environment is set up.
146
147
 
147
148
  3) Preserves system memory via the following methods:
148
149
  - Clears out old data files before each new data download.
149
- - Optional setting `clear_recycle_bin=True` in all functions.
150
+ - Optional setting `clear_recycle_bin` in all functions.
150
151
  - When `clear_recycle_bin=True` the computer's recycle/trash bin is cleared with each run of the script using any WxData function.
151
152
  - If a user wishes to not clear out their recycle bin `set clear_recycle_bin=False`.
153
+ - Default: `clear_recycle_bin=False`.
152
154
 
153
155
  ## WxData Examples
154
156
 
@@ -166,6 +168,9 @@ Then pip install wxdata after the new Python environment is set up.
166
168
  11) [Downloading AIGFS Data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/aigfs.ipynb)
167
169
  12) [Downloading AIGEFS Data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/aigefs.ipynb)
168
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)
169
174
 
170
175
  *Advanced Users*
171
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)
@@ -190,15 +195,17 @@ Then pip install wxdata after the new Python environment is set up.
190
195
  3. [GEFS0P25](https://github.com/edrewitz/wxdata/blob/main/Documentation/GEFS0P25.md#global-ensemble-forecast-system-025-x-025-degree-gefs0p25)
191
196
 
192
197
  ***AI Global Ensemble Forecast System (AIGEFS)***
193
- 1. [AIGEFS Members (Pressure Parameters](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_pressure_members.md)
194
- 2. [AIGEFS Members (Surface Parameters](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_surface_members.md)
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)
195
200
  3. [AIGEFS Ensemble Mean & Ensemble Spread](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_single.md)
196
201
 
197
202
  ***ECMWF Open Data***
198
203
  1. [ECMWF IFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_IFS.md)
199
- 2. [ECMWF AIFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_AIFS.md)
200
- 3. [ECMWF High Resolution IFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_High_Res_IFS.md)
201
- 4. [ECMWF IFS Wave](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_IFS_Wave.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)
202
209
 
203
210
  ***Real-Time Mesoscale Analysis (RTMA)***
204
211
  1. [RTMA](https://github.com/edrewitz/wxdata/blob/main/Documentation/rtma.md#real-time-mesoscale-analysis-rtma)
@@ -238,9 +245,9 @@ Then pip install wxdata after the new Python environment is set up.
238
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)
239
246
 
240
247
  ***ECMWF Post-Processing***
241
- 1. [ECMWF IFS and ECMWF High Resolution IFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20IFS%20Post%20Processing.md)
242
- 2. [ECMWF AIFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20AIFS%20Post%20Processing.md)
243
- 3. [ECMWF IFS Wave](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20IFS%20Wave%20Post%20Processing.md)
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)
244
251
 
245
252
  ***Real-Time Mesoscale Analysis Post-Processing***
246
253
  1. [RTMA](https://github.com/edrewitz/WxData/blob/main/Documentation/RTMA%20Post%20Processing.md)
@@ -266,6 +273,9 @@ Then pip install wxdata after the new Python environment is set up.
266
273
  ***Line Query***
267
274
  1. [line_query](https://github.com/edrewitz/WxData/blob/main/Documentation/line_query.md)
268
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
+
269
279
  ***Running External Python Scripts In Your Workflow***
270
280
 
271
281
  1 [run_external_scripts](https://github.com/edrewitz/WxData/blob/main/Documentation/run_external_scripts.md)
@@ -314,6 +324,9 @@ Then pip install wxdata after the new Python environment is set up.
314
324
  """
315
325
 
316
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
317
330
  from wxdata.gfs.gfs import(
318
331
  gfs_0p25,
319
332
  gfs_0p25_secondary_parameters,
@@ -327,6 +340,9 @@ Then pip install wxdata after the new Python environment is set up.
327
340
  from wxdata.hgefs.hgefs import hgefs_mean_spread
328
341
 
329
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
330
346
  from wxdata.gefs.gefs import(
331
347
  gefs_0p50,
332
348
  gefs_0p50_secondary_parameters,
@@ -334,6 +350,9 @@ Then pip install wxdata after the new Python environment is set up.
334
350
  )
335
351
 
336
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)
337
356
  from wxdata.aigefs.aigefs import(
338
357
  aigefs_pressure_members,
339
358
  aigefs_surface_members,
@@ -341,14 +360,25 @@ Then pip install wxdata after the new Python environment is set up.
341
360
  )
342
361
 
343
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
344
369
  from wxdata.ecmwf.ecmwf import(
345
370
  ecmwf_ifs,
371
+ ecmwf_ifs_ens,
346
372
  ecmwf_aifs,
347
- ecmwf_ifs_high_res,
348
- ecmwf_ifs_wave
373
+ ecmwf_aifs_ens,
374
+ ecmwf_ifs_wave,
375
+ ecmwf_ifs_wave_ens
349
376
  )
350
377
 
351
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
352
382
  from wxdata.fems.fems import(
353
383
  get_single_station_data,
354
384
  get_raws_sig_data,
@@ -356,15 +386,17 @@ Then pip install wxdata after the new Python environment is set up.
356
386
  )
357
387
 
358
388
  # Real-Time Mesoscale Analysis (RTMA)
389
+ # - RTMA Latest
390
+ # - RTMA Comparison Between Two Times
359
391
  from wxdata.rtma.rtma import(
360
392
  rtma,
361
393
  rtma_comparison
362
394
  )
363
395
 
364
396
  # NOAA
365
- # Storm Prediction Center Outlooks
366
- # Climate Prediction Center Outlooks
367
- # National Weather Service Forecasts
397
+ # - Storm Prediction Center Outlooks
398
+ # - Climate Prediction Center Outlooks
399
+ # - National Weather Service Forecasts
368
400
  from wxdata.noaa.nws import(
369
401
  get_ndfd_grids,
370
402
  get_cpc_outlook
@@ -457,6 +489,7 @@ Then pip install wxdata after the new Python environment is set up.
457
489
  from wxdata.utils.scripts import run_external_scripts
458
490
 
459
491
 
492
+
460
493
 
461
494
 
462
495
 
@@ -486,6 +519,10 @@ Then pip install wxdata after the new Python environment is set up.
486
519
 
487
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
488
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
+
489
526
  ## Data Sources
490
527
 
491
528
  1) [National Oceanic and Atmospheric Administration/National Center for Environmental Prediction](https://nomads.ncep.noaa.gov/)
@@ -57,45 +57,44 @@ Copy and paste either command into your terminal or anaconda prompt:
57
57
 
58
58
  ***Important Compatibility Information***
59
59
 
60
- *Python 3.14 is not compatible with the pip version of the eccodes library*
60
+ When a new version of Python comes out, it might not be compatible with the C++ eccodes library immediately (especially on pip/pypi versions).
61
61
 
62
- Methods to fix eccodes compatibility with Python 3.14:
62
+ This issue arises when the user is post-processing GRIB data.
63
63
 
64
- 1) Uninstall the pip version of WxData and install WxData via Anaconda
65
-
66
- *Steps For Method 1*
67
- 1) pip uninstall wxdata
68
- 2) conda install wxdata
64
+ There are two options to resolve this issue:
69
65
 
66
+ i) Install wxdata via Anaconda/Miniconda3 --> `conda install wxdata`
70
67
 
71
- 2) If the user is unable to use Anaconda as a package manager, the user must set up a new Python environment with the following specifications:
68
+ ii) Set up a new environment with an earlier version of Python (must be Python >= 3.10) and then `pip install wxdata`
72
69
 
73
- *Specifications*
70
+ ***Friendly for users working on VPN/PROXY connections***
74
71
 
75
- Python >= 3.10 and Python <= 3.13
72
+ Depending on which client, the proxy-address:port must be entered as either a dictionary or a string.
76
73
 
77
- Python 3.10 is compatible.
74
+ The clients that use a string for proxies are:
78
75
 
79
- Python 3.11 is compatible.
76
+ 1) All ECMWF clients
80
77
 
81
- Python 3.12 is compatible.
82
-
83
- Python 3.13 is compatible
84
-
85
- Then pip install wxdata after the new Python environment is set up.
78
+ 2) METAR Observations Client
79
+
80
+ 3) `pixel_query()` tool if the user needs to download the airport station codes list.
86
81
 
87
- 1) Friendly for users working on VPN/PROXY connections.
88
- - Users input their PROXY IP address as a dictionary and pass it into the function to avoid SSL errors
89
- - If the user is on a VPN/PROXY Connection the following is needed:
90
-
91
- proxies=None ---> proxies={
92
- 'http':'http://url',
93
- 'https':'https://url'
94
- }
82
+ All other clients use proxies as a dictionary
95
83
 
96
- [e.g. get_observed_sounding_data('nkx', proxies=proxies)]
84
+ Example: We want to download the latest Observed Sounding Data for San Diego, CA (NKX)
85
+
86
+ proxies=None ---> proxies={
87
+ 'http':'http://your-proxy-address:port',
88
+ 'https':'http://your-proxy-address:port'
89
+ }
90
+
91
+ sounding_data = get_observed_sounding_data('nkx', proxies=proxies)
92
+
93
+ Example: We want to download the ECMWF IFS Data:
94
+
95
+ proxies=None ---> proxies="http://your-proxy-address:port" ---> ds = ecmwf_ifs(proxies=proxies)
97
96
 
98
- <img src="https://github.com/edrewitz/WxData/blob/main/diagrams/proxy.png?raw=true" width="500" alt="Alt text" />
97
+ <img src="https://github.com/edrewitz/WxData/blob/main/diagrams/proxy.png?raw=true" width="500" alt="Alt text" />
99
98
 
100
99
 
101
100
  For more information on configuring proxies: https://requests.readthedocs.io/en/latest/user/advanced/#proxies
@@ -119,9 +118,10 @@ Then pip install wxdata after the new Python environment is set up.
119
118
 
120
119
  3) Preserves system memory via the following methods:
121
120
  - Clears out old data files before each new data download.
122
- - Optional setting `clear_recycle_bin=True` in all functions.
121
+ - Optional setting `clear_recycle_bin` in all functions.
123
122
  - When `clear_recycle_bin=True` the computer's recycle/trash bin is cleared with each run of the script using any WxData function.
124
123
  - If a user wishes to not clear out their recycle bin `set clear_recycle_bin=False`.
124
+ - Default: `clear_recycle_bin=False`.
125
125
 
126
126
  ## WxData Examples
127
127
 
@@ -139,6 +139,9 @@ Then pip install wxdata after the new Python environment is set up.
139
139
  11) [Downloading AIGFS Data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/aigfs.ipynb)
140
140
  12) [Downloading AIGEFS Data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/aigefs.ipynb)
141
141
  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)
142
+ 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)
143
+ 15) [Downloading Subsets Of ECMWF IFS Ensemble and AIFS Ensemble Data](https://github.com/edrewitz/WxData-JupyterLab-Examples/blob/main/ecmwf_ens.ipynb)
144
+ 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)
142
145
 
143
146
  *Advanced Users*
144
147
  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)
@@ -163,15 +166,17 @@ Then pip install wxdata after the new Python environment is set up.
163
166
  3. [GEFS0P25](https://github.com/edrewitz/wxdata/blob/main/Documentation/GEFS0P25.md#global-ensemble-forecast-system-025-x-025-degree-gefs0p25)
164
167
 
165
168
  ***AI Global Ensemble Forecast System (AIGEFS)***
166
- 1. [AIGEFS Members (Pressure Parameters](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_pressure_members.md)
167
- 2. [AIGEFS Members (Surface Parameters](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_surface_members.md)
169
+ 1. [AIGEFS Members (Pressure Parameters)](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_pressure_members.md)
170
+ 2. [AIGEFS Members (Surface Parameters)](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_surface_members.md)
168
171
  3. [AIGEFS Ensemble Mean & Ensemble Spread](https://github.com/edrewitz/WxData/blob/main/Documentation/aigefs_single.md)
169
172
 
170
173
  ***ECMWF Open Data***
171
174
  1. [ECMWF IFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_IFS.md)
172
- 2. [ECMWF AIFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_AIFS.md)
173
- 3. [ECMWF High Resolution IFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_High_Res_IFS.md)
174
- 4. [ECMWF IFS Wave](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_IFS_Wave.md)
175
+ 2. [ECMWF IFS Ensemble](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20IFS%20Ensemble.md#ecmwf-ifs-ensemble)
176
+ 3. [ECMWF AIFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_AIFS.md)
177
+ 4. [ECMWF AIFS Ensemble](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20AIFS%20Ensemble.md#ecmwf-aifs-ensemble)
178
+ 5. [ECMWF IFS Wave](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF_IFS_Wave.md)
179
+ 6. [ECMWF IFS Wave Ensemble](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20IFS%20Wave%20Ensemble.md#ecmwf-ifs-wave-ensemble)
175
180
 
176
181
  ***Real-Time Mesoscale Analysis (RTMA)***
177
182
  1. [RTMA](https://github.com/edrewitz/wxdata/blob/main/Documentation/rtma.md#real-time-mesoscale-analysis-rtma)
@@ -211,9 +216,9 @@ Then pip install wxdata after the new Python environment is set up.
211
216
  1. [HGEFS Post-Processing](https://github.com/edrewitz/WxData/blob/main/Documentation/hgefs_post_processing.md#hybrid-global-ensemble-forecast-system-hgefs-post-processing)
212
217
 
213
218
  ***ECMWF Post-Processing***
214
- 1. [ECMWF IFS and ECMWF High Resolution IFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20IFS%20Post%20Processing.md)
215
- 2. [ECMWF AIFS](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20AIFS%20Post%20Processing.md)
216
- 3. [ECMWF IFS Wave](https://github.com/edrewitz/WxData/blob/main/Documentation/ECMWF%20IFS%20Wave%20Post%20Processing.md)
219
+ 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)
220
+ 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)
221
+ 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)
217
222
 
218
223
  ***Real-Time Mesoscale Analysis Post-Processing***
219
224
  1. [RTMA](https://github.com/edrewitz/WxData/blob/main/Documentation/RTMA%20Post%20Processing.md)
@@ -239,6 +244,9 @@ Then pip install wxdata after the new Python environment is set up.
239
244
  ***Line Query***
240
245
  1. [line_query](https://github.com/edrewitz/WxData/blob/main/Documentation/line_query.md)
241
246
 
247
+ ***Linear Anti-Aliasing Between Two Points***
248
+ 1. [linear_anti_aliasing](https://github.com/edrewitz/WxData/blob/main/Documentation/linear_anti_aliasing.md#linear-anti-aliasing-between-points)
249
+
242
250
  ***Running External Python Scripts In Your Workflow***
243
251
 
244
252
  1 [run_external_scripts](https://github.com/edrewitz/WxData/blob/main/Documentation/run_external_scripts.md)
@@ -287,6 +295,9 @@ Then pip install wxdata after the new Python environment is set up.
287
295
  """
288
296
 
289
297
  # Global Forecast System (GFS)
298
+ # - GFS 0.25x0.25 Degree Primary Parameters
299
+ # - GFS 0.25x0.25 Degree Secondary Parameters
300
+ # - GFS 0.5x0.5 Degree
290
301
  from wxdata.gfs.gfs import(
291
302
  gfs_0p25,
292
303
  gfs_0p25_secondary_parameters,
@@ -300,6 +311,9 @@ Then pip install wxdata after the new Python environment is set up.
300
311
  from wxdata.hgefs.hgefs import hgefs_mean_spread
301
312
 
302
313
  # Global Ensemble Forecast System (GEFS)
314
+ # - GEFS 0.5x0.5 Degree Primary Parameters
315
+ # - GEFS 0.5x0.5 Degree Secondary Parameters
316
+ # - GEFS 0.25x0.25 Degree
303
317
  from wxdata.gefs.gefs import(
304
318
  gefs_0p50,
305
319
  gefs_0p50_secondary_parameters,
@@ -307,6 +321,9 @@ Then pip install wxdata after the new Python environment is set up.
307
321
  )
308
322
 
309
323
  # AI Global Ensemble Forecast System (AIGEFS)
324
+ # - AIGEFS Pressure Members (Pressure Level Variables)
325
+ # - AIGEFS Surface Members (Surface Level Variables)
326
+ # - AIGEFS Single (AIGEFS Ensemble Mean & AIGEFS Ensemble Spread)
310
327
  from wxdata.aigefs.aigefs import(
311
328
  aigefs_pressure_members,
312
329
  aigefs_surface_members,
@@ -314,14 +331,25 @@ Then pip install wxdata after the new Python environment is set up.
314
331
  )
315
332
 
316
333
  # European Centre for Medium-Range Weather Forecasts (ECMWF)
334
+ # - ECMWF IFS
335
+ # - ECMWF IFS Ensemble
336
+ # - ECMWF AIFS
337
+ # - ECMWF AIFS Ensemble
338
+ # - ECMWF IFS Wave
339
+ # - ECMWF IFS Wave Ensemble
317
340
  from wxdata.ecmwf.ecmwf import(
318
341
  ecmwf_ifs,
342
+ ecmwf_ifs_ens,
319
343
  ecmwf_aifs,
320
- ecmwf_ifs_high_res,
321
- ecmwf_ifs_wave
344
+ ecmwf_aifs_ens,
345
+ ecmwf_ifs_wave,
346
+ ecmwf_ifs_wave_ens
322
347
  )
323
348
 
324
349
  # FEMS RAWS Network
350
+ # - Single RAWS Station Data
351
+ # - A SIG Group of RAWS Data by GACC
352
+ # - NFDRS Forecast Data For a RAWS Station
325
353
  from wxdata.fems.fems import(
326
354
  get_single_station_data,
327
355
  get_raws_sig_data,
@@ -329,15 +357,17 @@ Then pip install wxdata after the new Python environment is set up.
329
357
  )
330
358
 
331
359
  # Real-Time Mesoscale Analysis (RTMA)
360
+ # - RTMA Latest
361
+ # - RTMA Comparison Between Two Times
332
362
  from wxdata.rtma.rtma import(
333
363
  rtma,
334
364
  rtma_comparison
335
365
  )
336
366
 
337
367
  # NOAA
338
- # Storm Prediction Center Outlooks
339
- # Climate Prediction Center Outlooks
340
- # National Weather Service Forecasts
368
+ # - Storm Prediction Center Outlooks
369
+ # - Climate Prediction Center Outlooks
370
+ # - National Weather Service Forecasts
341
371
  from wxdata.noaa.nws import(
342
372
  get_ndfd_grids,
343
373
  get_cpc_outlook
@@ -430,6 +460,7 @@ Then pip install wxdata after the new Python environment is set up.
430
460
  from wxdata.utils.scripts import run_external_scripts
431
461
 
432
462
 
463
+
433
464
 
434
465
 
435
466
 
@@ -459,6 +490,10 @@ Then pip install wxdata after the new Python environment is set up.
459
490
 
460
491
  **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
461
492
 
493
+ **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
494
+
495
+ **ecmwf-opendata**: European Centre for Medium-Range Weather Forecasts (2026). ecmwf-opendata[Computer software]. GitHub. https://github.com/ecmwf/ecmwf-opendata
496
+
462
497
  ## Data Sources
463
498
 
464
499
  1) [National Oceanic and Atmospheric Administration/National Center for Environmental Prediction](https://nomads.ncep.noaa.gov/)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "wxdata"
3
- version = "1.3"
3
+ version = "1.4"
4
4
  description = "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
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -27,6 +27,8 @@ dependencies = [
27
27
  "requests>=2.32.4",
28
28
  "cfgrib>=0.9.10.4",
29
29
  "dask>=2025.5.1",
30
+ "tqdm>=4.67.3",
31
+ "ecmwf-opendata>=0.3.26",
30
32
 
31
33
  ]
32
34
 
@@ -40,6 +40,9 @@ These functions do the following:
40
40
  """
41
41
 
42
42
  # Global Forecast System (GFS)
43
+ # - GFS 0.25x0.25 Degree Primary Parameters
44
+ # - GFS 0.25x0.25 Degree Secondary Parameters
45
+ # - GFS 0.5x0.5 Degree
43
46
  from wxdata.gfs.gfs import(
44
47
  gfs_0p25,
45
48
  gfs_0p25_secondary_parameters,
@@ -53,6 +56,9 @@ from wxdata.aigfs.aigfs import aigfs
53
56
  from wxdata.hgefs.hgefs import hgefs_mean_spread
54
57
 
55
58
  # Global Ensemble Forecast System (GEFS)
59
+ # - GEFS 0.5x0.5 Degree Primary Parameters
60
+ # - GEFS 0.5x0.5 Degree Secondary Parameters
61
+ # - GEFS 0.25x0.25 Degree
56
62
  from wxdata.gefs.gefs import(
57
63
  gefs_0p50,
58
64
  gefs_0p50_secondary_parameters,
@@ -60,6 +66,9 @@ from wxdata.gefs.gefs import(
60
66
  )
61
67
 
62
68
  # AI Global Ensemble Forecast System (AIGEFS)
69
+ # - AIGEFS Pressure Members (Pressure Level Variables)
70
+ # - AIGEFS Surface Members (Surface Level Variables)
71
+ # - AIGEFS Single (AIGEFS Ensemble Mean & AIGEFS Ensemble Spread)
63
72
  from wxdata.aigefs.aigefs import(
64
73
  aigefs_pressure_members,
65
74
  aigefs_surface_members,
@@ -67,14 +76,25 @@ from wxdata.aigefs.aigefs import(
67
76
  )
68
77
 
69
78
  # European Centre for Medium-Range Weather Forecasts (ECMWF)
79
+ # - ECMWF IFS
80
+ # - ECMWF IFS Ensemble
81
+ # - ECMWF AIFS
82
+ # - ECMWF AIFS Ensemble
83
+ # - ECMWF IFS Wave
84
+ # - ECMWF IFS Wave Ensemble
70
85
  from wxdata.ecmwf.ecmwf import(
71
86
  ecmwf_ifs,
87
+ ecmwf_ifs_ens,
72
88
  ecmwf_aifs,
73
- ecmwf_ifs_high_res,
74
- ecmwf_ifs_wave
89
+ ecmwf_aifs_ens,
90
+ ecmwf_ifs_wave,
91
+ ecmwf_ifs_wave_ens
75
92
  )
76
93
 
77
94
  # FEMS RAWS Network
95
+ # - Single RAWS Station Data
96
+ # - A SIG Group of RAWS Data by GACC
97
+ # - NFDRS Forecast Data For a RAWS Station
78
98
  from wxdata.fems.fems import(
79
99
  get_single_station_data,
80
100
  get_raws_sig_data,
@@ -82,15 +102,17 @@ from wxdata.fems.fems import(
82
102
  )
83
103
 
84
104
  # Real-Time Mesoscale Analysis (RTMA)
105
+ # - RTMA Latest
106
+ # - RTMA Comparison Between Two Times
85
107
  from wxdata.rtma.rtma import(
86
108
  rtma,
87
109
  rtma_comparison
88
110
  )
89
111
 
90
112
  # NOAA
91
- # Storm Prediction Center Outlooks
92
- # Climate Prediction Center Outlooks
93
- # National Weather Service Forecasts
113
+ # - Storm Prediction Center Outlooks
114
+ # - Climate Prediction Center Outlooks
115
+ # - National Weather Service Forecasts
94
116
  from wxdata.noaa.nws import(
95
117
  get_ndfd_grids,
96
118
  get_cpc_outlook