wxdata 1.7__tar.gz → 2.0__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 (104) hide show
  1. {wxdata-1.7/src/wxdata.egg-info → wxdata-2.0}/PKG-INFO +51 -9
  2. {wxdata-1.7 → wxdata-2.0}/README.md +50 -8
  3. {wxdata-1.7 → wxdata-2.0}/pyproject.toml +1 -1
  4. {wxdata-1.7 → wxdata-2.0}/src/wxdata/__init__.py +2 -2
  5. {wxdata-1.7 → wxdata-2.0}/src/wxdata/aigefs/aigefs.py +187 -51
  6. {wxdata-1.7 → wxdata-2.0}/src/wxdata/aigfs/aigfs.py +113 -31
  7. {wxdata-1.7 → wxdata-2.0}/src/wxdata/calc/unit_conversion.py +0 -1
  8. {wxdata-1.7 → wxdata-2.0}/src/wxdata/client/byte_range.py +6 -2
  9. {wxdata-1.7 → wxdata-2.0}/src/wxdata/client/client.py +6 -7
  10. {wxdata-1.7 → wxdata-2.0}/src/wxdata/client/level_coords.py +45 -4
  11. wxdata-2.0/src/wxdata/ecmwf/ecmwf.py +6179 -0
  12. {wxdata-1.7 → wxdata-2.0}/src/wxdata/ecmwf/url_scanners.py +362 -151
  13. {wxdata-1.7 → wxdata-2.0}/src/wxdata/gefs/__init__.py +0 -1
  14. wxdata-2.0/src/wxdata/gefs/gefs.py +3361 -0
  15. wxdata-2.0/src/wxdata/gefs/url_scanners.py +987 -0
  16. wxdata-2.0/src/wxdata/gfs/gfs.py +3206 -0
  17. wxdata-2.0/src/wxdata/gfs/url_scanners.py +882 -0
  18. {wxdata-1.7 → wxdata-2.0}/src/wxdata/hgefs/hgefs.py +120 -31
  19. {wxdata-1.7 → wxdata-2.0}/src/wxdata/noaa/nws.py +576 -13
  20. {wxdata-1.7 → wxdata-2.0}/src/wxdata/post_processors/aigefs_post_processing.py +4 -6
  21. {wxdata-1.7 → wxdata-2.0}/src/wxdata/post_processors/aigfs_post_processing.py +2 -3
  22. {wxdata-1.7 → wxdata-2.0}/src/wxdata/post_processors/cfs_post_processing.py +4 -4
  23. {wxdata-1.7 → wxdata-2.0}/src/wxdata/post_processors/ecmwf_post_processing.py +7 -6
  24. wxdata-2.0/src/wxdata/post_processors/gefs_post_processing.py +971 -0
  25. wxdata-2.0/src/wxdata/post_processors/gfs_post_processing.py +899 -0
  26. {wxdata-1.7 → wxdata-2.0}/src/wxdata/post_processors/hgefs_post_processing.py +2 -3
  27. wxdata-2.0/src/wxdata/post_processors/rtma_post_processing.py +678 -0
  28. {wxdata-1.7 → wxdata-2.0}/src/wxdata/radar/url_scanner.py +1 -0
  29. {wxdata-1.7 → wxdata-2.0}/src/wxdata/rtma/__init__.py +1 -1
  30. wxdata-2.0/src/wxdata/rtma/file_scanner.py +122 -0
  31. {wxdata-1.7 → wxdata-2.0}/src/wxdata/rtma/rtma.py +134 -111
  32. {wxdata-1.7 → wxdata-2.0}/src/wxdata/rtma/url_scanners.py +232 -190
  33. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/exceptions.py +29 -2
  34. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/nomads_gribfilter.py +3 -0
  35. {wxdata-1.7 → wxdata-2.0/src/wxdata.egg-info}/PKG-INFO +51 -9
  36. {wxdata-1.7 → wxdata-2.0}/src/wxdata.egg-info/SOURCES.txt +1 -2
  37. wxdata-1.7/src/wxdata/ecmwf/ecmwf.py +0 -2802
  38. wxdata-1.7/src/wxdata/gefs/gefs.py +0 -1193
  39. wxdata-1.7/src/wxdata/gefs/process.py +0 -3157
  40. wxdata-1.7/src/wxdata/gefs/url_scanners.py +0 -2532
  41. wxdata-1.7/src/wxdata/gfs/gfs.py +0 -1139
  42. wxdata-1.7/src/wxdata/gfs/url_scanners.py +0 -1609
  43. wxdata-1.7/src/wxdata/post_processors/gefs_post_processing.py +0 -3111
  44. wxdata-1.7/src/wxdata/post_processors/gfs_post_processing.py +0 -2022
  45. wxdata-1.7/src/wxdata/post_processors/rtma_post_processing.py +0 -332
  46. wxdata-1.7/src/wxdata/rtma/process.py +0 -320
  47. {wxdata-1.7 → wxdata-2.0}/LICENSE +0 -0
  48. {wxdata-1.7 → wxdata-2.0}/setup.cfg +0 -0
  49. {wxdata-1.7 → wxdata-2.0}/src/wxdata/aigefs/__init__.py +0 -0
  50. {wxdata-1.7 → wxdata-2.0}/src/wxdata/aigefs/paths.py +0 -0
  51. {wxdata-1.7 → wxdata-2.0}/src/wxdata/aigefs/url_scanners.py +0 -0
  52. {wxdata-1.7 → wxdata-2.0}/src/wxdata/aigfs/__init__.py +0 -0
  53. {wxdata-1.7 → wxdata-2.0}/src/wxdata/aigfs/paths.py +0 -0
  54. {wxdata-1.7 → wxdata-2.0}/src/wxdata/aigfs/url_scanners.py +0 -0
  55. {wxdata-1.7 → wxdata-2.0}/src/wxdata/calc/__init__.py +0 -0
  56. {wxdata-1.7 → wxdata-2.0}/src/wxdata/calc/derived_fields.py +0 -0
  57. {wxdata-1.7 → wxdata-2.0}/src/wxdata/calc/kinematics.py +0 -0
  58. {wxdata-1.7 → wxdata-2.0}/src/wxdata/calc/thermodynamics.py +0 -0
  59. {wxdata-1.7 → wxdata-2.0}/src/wxdata/cfs/__init__.py +0 -0
  60. {wxdata-1.7 → wxdata-2.0}/src/wxdata/cfs/cfs.py +0 -0
  61. {wxdata-1.7 → wxdata-2.0}/src/wxdata/cfs/file_scanner.py +0 -0
  62. {wxdata-1.7 → wxdata-2.0}/src/wxdata/cfs/url_scanners.py +0 -0
  63. {wxdata-1.7 → wxdata-2.0}/src/wxdata/client/__init__.py +0 -0
  64. {wxdata-1.7 → wxdata-2.0}/src/wxdata/ecmwf/__init__.py +0 -0
  65. {wxdata-1.7 → wxdata-2.0}/src/wxdata/ecmwf/file_funcs.py +0 -0
  66. {wxdata-1.7 → wxdata-2.0}/src/wxdata/ecmwf/keys.py +0 -0
  67. {wxdata-1.7 → wxdata-2.0}/src/wxdata/ecmwf/parsers.py +0 -0
  68. {wxdata-1.7 → wxdata-2.0}/src/wxdata/ecmwf/paths.py +0 -0
  69. {wxdata-1.7 → wxdata-2.0}/src/wxdata/fems/__init__.py +0 -0
  70. {wxdata-1.7 → wxdata-2.0}/src/wxdata/fems/meta_data.py +0 -0
  71. {wxdata-1.7 → wxdata-2.0}/src/wxdata/fems/observations.py +0 -0
  72. {wxdata-1.7 → wxdata-2.0}/src/wxdata/gefs/exception_messages.py +0 -0
  73. {wxdata-1.7 → wxdata-2.0}/src/wxdata/gefs/file_funcs.py +0 -0
  74. {wxdata-1.7 → wxdata-2.0}/src/wxdata/gefs/paths.py +0 -0
  75. {wxdata-1.7 → wxdata-2.0}/src/wxdata/gfs/__init__.py +0 -0
  76. {wxdata-1.7 → wxdata-2.0}/src/wxdata/gfs/exception_messages.py +0 -0
  77. {wxdata-1.7 → wxdata-2.0}/src/wxdata/gfs/paths.py +0 -0
  78. {wxdata-1.7 → wxdata-2.0}/src/wxdata/hgefs/__init__.py +0 -0
  79. {wxdata-1.7 → wxdata-2.0}/src/wxdata/hgefs/paths.py +0 -0
  80. {wxdata-1.7 → wxdata-2.0}/src/wxdata/hgefs/url_scanner.py +0 -0
  81. {wxdata-1.7 → wxdata-2.0}/src/wxdata/metars/__init__.py +0 -0
  82. {wxdata-1.7 → wxdata-2.0}/src/wxdata/metars/_clean_data.py +0 -0
  83. {wxdata-1.7 → wxdata-2.0}/src/wxdata/metars/metar_obs.py +0 -0
  84. {wxdata-1.7 → wxdata-2.0}/src/wxdata/noaa/__init__.py +0 -0
  85. {wxdata-1.7 → wxdata-2.0}/src/wxdata/post_processors/__init__.py +0 -0
  86. {wxdata-1.7 → wxdata-2.0}/src/wxdata/radar/__init__.py +0 -0
  87. {wxdata-1.7 → wxdata-2.0}/src/wxdata/radar/nexrad2.py +0 -0
  88. {wxdata-1.7 → wxdata-2.0}/src/wxdata/rtma/file_funcs.py +0 -0
  89. {wxdata-1.7 → wxdata-2.0}/src/wxdata/rtma/keys.py +0 -0
  90. {wxdata-1.7 → wxdata-2.0}/src/wxdata/soundings/__init__.py +0 -0
  91. {wxdata-1.7 → wxdata-2.0}/src/wxdata/soundings/_exceptions.py +0 -0
  92. {wxdata-1.7 → wxdata-2.0}/src/wxdata/soundings/wyoming_soundings.py +0 -0
  93. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/__init__.py +0 -0
  94. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/coords.py +0 -0
  95. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/file_funcs.py +0 -0
  96. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/file_scanner.py +0 -0
  97. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/progress_bar.py +0 -0
  98. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/recycle_bin.py +0 -0
  99. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/scripts.py +0 -0
  100. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/tools.py +0 -0
  101. {wxdata-1.7 → wxdata-2.0}/src/wxdata/utils/xmacis2_cleanup.py +0 -0
  102. {wxdata-1.7 → wxdata-2.0}/src/wxdata.egg-info/dependency_links.txt +0 -0
  103. {wxdata-1.7 → wxdata-2.0}/src/wxdata.egg-info/requires.txt +0 -0
  104. {wxdata-1.7 → wxdata-2.0}/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.7
3
+ Version: 2.0
4
4
  Summary: A Python package of end-to-end weather data clients & raw data clients with VPN/PROXY support, data processors that decode variable keys from GRIB format into a plain-language format & various tools for assisting Python automated workflows, querying meteorological datasets and filling gaps in meteorological data.
5
5
  Author: Eric J. Drewitz
6
6
  Project-URL: Documentation, https://github.com/edrewitz/wxdata/blob/main/Documentation/Landing%20Page.md
@@ -63,13 +63,14 @@ A Python package consisting of the following:
63
63
  # Table of Contents
64
64
 
65
65
  1) [Installation Instructions](https://github.com/edrewitz/WxData?tab=readme-ov-file#installation-instructions)
66
- 2) [Proxy Server Configuration](https://github.com/edrewitz/WxData?tab=readme-ov-file#proxy-server-configuration)
67
- 3) [What makes WxData unique among various meteorological Python packages?](https://github.com/edrewitz/WxData?tab=readme-ov-file#what-makes-wxdata-unique-among-various-meteorological-python-packages)
68
- 4) [WxData Tutorials](https://github.com/edrewitz/WxData?tab=readme-ov-file#wxdata-tutorials)
69
- 5) [WxData Documentation](https://github.com/edrewitz/WxData?tab=readme-ov-file#wxdata-documentation)
70
- 6) [Importing Functions from WxData](https://github.com/edrewitz/WxData?tab=readme-ov-file#importing-functions-from-wxdata)
71
- 7) [Citations](https://github.com/edrewitz/WxData?tab=readme-ov-file#citations)
72
- 8) [Data Sources](https://github.com/edrewitz/WxData?tab=readme-ov-file#data-sources)
66
+ 2) [Server List (For End-To-End Clients That Can Rotate Between Servers)](https://github.com/edrewitz/WxData/blob/main/README.md#server-list)
67
+ 3) [Proxy Server Configuration](https://github.com/edrewitz/WxData?tab=readme-ov-file#proxy-server-configuration)
68
+ 4) [What makes WxData unique among various meteorological Python packages?](https://github.com/edrewitz/WxData?tab=readme-ov-file#what-makes-wxdata-unique-among-various-meteorological-python-packages)
69
+ 5) [WxData Tutorials](https://github.com/edrewitz/WxData?tab=readme-ov-file#wxdata-tutorials)
70
+ 6) [WxData Documentation](https://github.com/edrewitz/WxData?tab=readme-ov-file#wxdata-documentation)
71
+ 7) [Importing Functions from WxData](https://github.com/edrewitz/WxData?tab=readme-ov-file#importing-functions-from-wxdata)
72
+ 8) [Citations](https://github.com/edrewitz/WxData?tab=readme-ov-file#citations)
73
+ 9) [Data Sources](https://github.com/edrewitz/WxData?tab=readme-ov-file#data-sources)
73
74
 
74
75
 
75
76
  ## Installation Instructions
@@ -114,6 +115,41 @@ i) Install wxdata via Anaconda/Miniconda3 --> `conda install wxdata`
114
115
 
115
116
  ii) Set up a new environment with an earlier version of Python (must be Python >= 3.10) and then `pip install wxdata`
116
117
 
118
+ ---------------------------------------------------------
119
+ ## Server List
120
+
121
+
122
+
123
+ <img src="https://github.com/edrewitz/WxData/blob/main/icons/noaa_rotation.png?raw=true" width="200" alt="Alt text" /> <img src="https://github.com/edrewitz/WxData/blob/main/icons/ecmwf_rotation.png?raw=true" width="200" alt="Alt text" />
124
+
125
+ End-To-End clients with multiple servers to pull data from can find the different options for `source` by the table below
126
+
127
+ `source='noaa' - NOAA/NCEP/NOMADS OR NOAA/NWS/FTP`
128
+
129
+ `source='ecmwf' - ECMWF Open-Data Server`
130
+
131
+ `source='aws' - Amazon Web Services (AWS)`
132
+
133
+ `source='google' - Google Cloud`
134
+
135
+
136
+ | Client | NOAA/NCEP/NOMADS | ECMWF Open-Data | Amazon AWS | Google Cloud | NOAA/NWS/FTP |
137
+ | -------- | -------- | -------- | -------- | -------- | -------- |
138
+ | GFS0P25 |Y|N|Y|Y|N|
139
+ | GFS0P25 SECONDARY PARAMETERS |Y|N|Y|Y|N|
140
+ | GFS0P50 |Y|N|Y|Y|N|
141
+ | GEFS0P50 |Y|N|Y|Y|N|
142
+ | GEFS0P50 SECONDARY PARAMETERS |Y|N|Y|Y|N|
143
+ | GEFS0P25 |Y|N|Y|Y|N|
144
+ | ECMWF IFS |N|Y|Y|Y|N|
145
+ | ECMWF IFS Ensemble |N|Y|Y|Y|N|
146
+ | ECMWF AIFS|N|Y|Y|Y|N|
147
+ | ECMWF AIFS Ensemble|N|Y|Y|Y|N|
148
+ | ECMWF IFS Wave |N|Y|Y|Y|N|
149
+ | ECMWF IFS Wave Ensemble |N|Y|Y|Y|N|
150
+ | Get NDFD Grids |N|N|Y|N|Y|
151
+ | RTMA |Y|N|Y|N|N|
152
+
117
153
  ---------------------------------------------------------
118
154
 
119
155
  ## Proxy Server Configuration
@@ -172,7 +208,13 @@ ii) Set up a new environment with an earlier version of Python (must be Python >
172
208
 
173
209
  5) Consists of both observational and model data.
174
210
 
175
- 6) Has additional tools to assist querying data, resolving gaps in data and automating your Python workflow.
211
+ 6) Has additional tools to assist querying data, resolving gaps in data and automating your Python workflow.
212
+
213
+ 7) Utilizes byte-range requests to subset and speed up download times.
214
+
215
+ 8) Several end-to-end clients have the ability to pull from multiple servers (NOAA/NCEP/NOMADS, ECMWF Open-Data, Amazon Web Services (AWS), Google Cloud and NOAA/NWS/FTP).
216
+
217
+ 9) Clients can automatically rotate to a new server when experiencing connectivity issues to the initial server.
176
218
 
177
219
  -----------------------------------------------
178
220
 
@@ -31,13 +31,14 @@ A Python package consisting of the following:
31
31
  # Table of Contents
32
32
 
33
33
  1) [Installation Instructions](https://github.com/edrewitz/WxData?tab=readme-ov-file#installation-instructions)
34
- 2) [Proxy Server Configuration](https://github.com/edrewitz/WxData?tab=readme-ov-file#proxy-server-configuration)
35
- 3) [What makes WxData unique among various meteorological Python packages?](https://github.com/edrewitz/WxData?tab=readme-ov-file#what-makes-wxdata-unique-among-various-meteorological-python-packages)
36
- 4) [WxData Tutorials](https://github.com/edrewitz/WxData?tab=readme-ov-file#wxdata-tutorials)
37
- 5) [WxData Documentation](https://github.com/edrewitz/WxData?tab=readme-ov-file#wxdata-documentation)
38
- 6) [Importing Functions from WxData](https://github.com/edrewitz/WxData?tab=readme-ov-file#importing-functions-from-wxdata)
39
- 7) [Citations](https://github.com/edrewitz/WxData?tab=readme-ov-file#citations)
40
- 8) [Data Sources](https://github.com/edrewitz/WxData?tab=readme-ov-file#data-sources)
34
+ 2) [Server List (For End-To-End Clients That Can Rotate Between Servers)](https://github.com/edrewitz/WxData/blob/main/README.md#server-list)
35
+ 3) [Proxy Server Configuration](https://github.com/edrewitz/WxData?tab=readme-ov-file#proxy-server-configuration)
36
+ 4) [What makes WxData unique among various meteorological Python packages?](https://github.com/edrewitz/WxData?tab=readme-ov-file#what-makes-wxdata-unique-among-various-meteorological-python-packages)
37
+ 5) [WxData Tutorials](https://github.com/edrewitz/WxData?tab=readme-ov-file#wxdata-tutorials)
38
+ 6) [WxData Documentation](https://github.com/edrewitz/WxData?tab=readme-ov-file#wxdata-documentation)
39
+ 7) [Importing Functions from WxData](https://github.com/edrewitz/WxData?tab=readme-ov-file#importing-functions-from-wxdata)
40
+ 8) [Citations](https://github.com/edrewitz/WxData?tab=readme-ov-file#citations)
41
+ 9) [Data Sources](https://github.com/edrewitz/WxData?tab=readme-ov-file#data-sources)
41
42
 
42
43
 
43
44
  ## Installation Instructions
@@ -82,6 +83,41 @@ i) Install wxdata via Anaconda/Miniconda3 --> `conda install wxdata`
82
83
 
83
84
  ii) Set up a new environment with an earlier version of Python (must be Python >= 3.10) and then `pip install wxdata`
84
85
 
86
+ ---------------------------------------------------------
87
+ ## Server List
88
+
89
+
90
+
91
+ <img src="https://github.com/edrewitz/WxData/blob/main/icons/noaa_rotation.png?raw=true" width="200" alt="Alt text" /> <img src="https://github.com/edrewitz/WxData/blob/main/icons/ecmwf_rotation.png?raw=true" width="200" alt="Alt text" />
92
+
93
+ End-To-End clients with multiple servers to pull data from can find the different options for `source` by the table below
94
+
95
+ `source='noaa' - NOAA/NCEP/NOMADS OR NOAA/NWS/FTP`
96
+
97
+ `source='ecmwf' - ECMWF Open-Data Server`
98
+
99
+ `source='aws' - Amazon Web Services (AWS)`
100
+
101
+ `source='google' - Google Cloud`
102
+
103
+
104
+ | Client | NOAA/NCEP/NOMADS | ECMWF Open-Data | Amazon AWS | Google Cloud | NOAA/NWS/FTP |
105
+ | -------- | -------- | -------- | -------- | -------- | -------- |
106
+ | GFS0P25 |Y|N|Y|Y|N|
107
+ | GFS0P25 SECONDARY PARAMETERS |Y|N|Y|Y|N|
108
+ | GFS0P50 |Y|N|Y|Y|N|
109
+ | GEFS0P50 |Y|N|Y|Y|N|
110
+ | GEFS0P50 SECONDARY PARAMETERS |Y|N|Y|Y|N|
111
+ | GEFS0P25 |Y|N|Y|Y|N|
112
+ | ECMWF IFS |N|Y|Y|Y|N|
113
+ | ECMWF IFS Ensemble |N|Y|Y|Y|N|
114
+ | ECMWF AIFS|N|Y|Y|Y|N|
115
+ | ECMWF AIFS Ensemble|N|Y|Y|Y|N|
116
+ | ECMWF IFS Wave |N|Y|Y|Y|N|
117
+ | ECMWF IFS Wave Ensemble |N|Y|Y|Y|N|
118
+ | Get NDFD Grids |N|N|Y|N|Y|
119
+ | RTMA |Y|N|Y|N|N|
120
+
85
121
  ---------------------------------------------------------
86
122
 
87
123
  ## Proxy Server Configuration
@@ -140,7 +176,13 @@ ii) Set up a new environment with an earlier version of Python (must be Python >
140
176
 
141
177
  5) Consists of both observational and model data.
142
178
 
143
- 6) Has additional tools to assist querying data, resolving gaps in data and automating your Python workflow.
179
+ 6) Has additional tools to assist querying data, resolving gaps in data and automating your Python workflow.
180
+
181
+ 7) Utilizes byte-range requests to subset and speed up download times.
182
+
183
+ 8) Several end-to-end clients have the ability to pull from multiple servers (NOAA/NCEP/NOMADS, ECMWF Open-Data, Amazon Web Services (AWS), Google Cloud and NOAA/NWS/FTP).
184
+
185
+ 9) Clients can automatically rotate to a new server when experiencing connectivity issues to the initial server.
144
186
 
145
187
  -----------------------------------------------
146
188
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "wxdata"
3
- version = "1.7"
3
+ version = "2.0"
4
4
  description = "A Python package of end-to-end weather data clients & raw data clients with VPN/PROXY support, data processors that decode variable keys from GRIB format into a plain-language format & various tools for assisting Python automated workflows, querying meteorological datasets and filling gaps in meteorological data."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -136,8 +136,8 @@ from wxdata.fems.meta_data import(
136
136
  )
137
137
 
138
138
  # Real-Time Mesoscale Analysis (RTMA)
139
- # - RTMA Latest
140
- # - RTMA Comparison Between Two Times
139
+ # - RTMA Latest
140
+ # - RTMA Comparison Between Two Times
141
141
  from wxdata.rtma.rtma import(
142
142
  rtma,
143
143
  rtma_comparison
@@ -56,7 +56,25 @@ def aigefs_pressure_members(final_forecast_hour=384,
56
56
  custom_directory=None,
57
57
  chunk_size=8192,
58
58
  notifications='off',
59
- clear_data=False):
59
+ clear_data=False,
60
+ variables=['geopotential height',
61
+ 'specific humidity',
62
+ 'temperature',
63
+ 'u-component of wind',
64
+ 'v-component of wind',
65
+ 'vertical velocity (pressure)'],
66
+ levels=[1000,
67
+ 925,
68
+ 850,
69
+ 700,
70
+ 600,
71
+ 500,
72
+ 400,
73
+ 300,
74
+ 250,
75
+ 150,
76
+ 100,
77
+ 50]):
60
78
 
61
79
  """
62
80
  This function downloads, pre-processes and post-processes the latest pressure parameter dataset of the AIGEFS and bins the files to specific folders based on ensemble number.
@@ -116,7 +134,27 @@ def aigefs_pressure_members(final_forecast_hour=384,
116
134
 
117
135
  17) clear_data (Boolean) - Default=False. When set to False, the scanner safe-guard remains in place (recommended for most users).
118
136
  When set to True, the scanner safe-guard is disabled and directory branch is cleared and new data is downloaded.
119
-
137
+
138
+ 18) variables (String List) Default=['geopotential height',
139
+ 'specific humidity',
140
+ 'temperature',
141
+ 'u-component of wind',
142
+ 'v-component of wind',
143
+ 'vertical velocity (pressure)']
144
+
145
+
146
+ 19) levels (Integer List) - Default=[1000,
147
+ 925,
148
+ 850,
149
+ 700,
150
+ 600,
151
+ 500,
152
+ 400,
153
+ 300,
154
+ 250,
155
+ 150,
156
+ 100,
157
+ 50]
120
158
 
121
159
  Returns
122
160
  -------
@@ -174,26 +212,41 @@ def aigefs_pressure_members(final_forecast_hour=384,
174
212
  for path, url in zip(paths, urls):
175
213
  for i in range(0, stop, 6):
176
214
  if i < 10:
177
- _client.get_gridded_data(f"{url}/aigefs.t{run}z.pres.f00{i}.grib2",
178
- path,
179
- f"aigefs.t{run}z.pres.f00{i}.grib2",
180
- proxies=proxies,
181
- chunk_size=chunk_size,
182
- notifications=notifications)
215
+ _client.byte_range_request(f"{url}/aigefs.t{run}z.pres.f00{i}.grib2",
216
+ f"{url}/aigefs.t{run}z.pres.f00{i}.grib2.idx",
217
+ variables,
218
+ levels,
219
+ 'pressure',
220
+ path,
221
+ f"aigefs.t{run}z.pres.f00{i}.grib2",
222
+ proxies=proxies,
223
+ chunk_size=chunk_size,
224
+ notifications=notifications,
225
+ clear_recycle_bin=clear_recycle_bin)
183
226
  elif i >= 10 and i < 100:
184
- _client.get_gridded_data(f"{url}/aigefs.t{run}z.pres.f0{i}.grib2",
185
- path,
186
- f"aigefs.t{run}z.pres.f0{i}.grib2",
187
- proxies=proxies,
188
- chunk_size=chunk_size,
189
- notifications=notifications)
227
+ _client.byte_range_request(f"{url}/aigefs.t{run}z.pres.f0{i}.grib2",
228
+ f"{url}/aigefs.t{run}z.pres.f0{i}.grib2.idx",
229
+ variables,
230
+ levels,
231
+ 'pressure',
232
+ path,
233
+ f"aigefs.t{run}z.pres.f0{i}.grib2",
234
+ proxies=proxies,
235
+ chunk_size=chunk_size,
236
+ notifications=notifications,
237
+ clear_recycle_bin=clear_recycle_bin)
190
238
  else:
191
- _client.get_gridded_data(f"{url}/aigefs.t{run}z.pres.f{i}.grib2",
192
- path,
193
- f"aigefs.t{run}z.pres.f{i}.grib2",
194
- proxies=proxies,
195
- chunk_size=chunk_size,
196
- notifications=notifications)
239
+ _client.byte_range_request(f"{url}/aigefs.t{run}z.pres.f{i}.grib2",
240
+ f"{url}/aigefs.t{run}z.pres.f{i}.grib2.idx",
241
+ variables,
242
+ levels,
243
+ 'pressure',
244
+ path,
245
+ f"aigefs.t{run}z.pres.f{i}.grib2",
246
+ proxies=proxies,
247
+ chunk_size=chunk_size,
248
+ notifications=notifications,
249
+ clear_recycle_bin=clear_recycle_bin)
197
250
  else:
198
251
  print(f"User has latest AIGEFS Pressure Parameter Files\nSkipping Download...")
199
252
 
@@ -411,8 +464,26 @@ def aigefs_single(final_forecast_hour=384,
411
464
  chunk_size=8192,
412
465
  notifications='off',
413
466
  cat='mean',
414
- type_of_level='pressure',
415
- clear_data=False):
467
+ level_type='pressure',
468
+ clear_data=False,
469
+ variables=['geopotential height',
470
+ 'specific humidity',
471
+ 'temperature',
472
+ 'u-component of wind',
473
+ 'v-component of wind',
474
+ 'vertical velocity (pressure)'],
475
+ levels=[1000,
476
+ 925,
477
+ 850,
478
+ 700,
479
+ 600,
480
+ 500,
481
+ 400,
482
+ 300,
483
+ 250,
484
+ 150,
485
+ 100,
486
+ 50]):
416
487
 
417
488
  """
418
489
  This function downloads, pre-processes and post-processes the latest AIGEFS Ensemble Mean or Ensemble Spread for either the Pressure or Surface Parameters.
@@ -476,7 +547,7 @@ def aigefs_single(final_forecast_hour=384,
476
547
  1) mean
477
548
  2) spread
478
549
 
479
- 17) type_of_level (String) - Default='pressure'. The type of level the data is in.
550
+ 17) level_type (String) - Default='pressure'. The type of level the data is in.
480
551
 
481
552
  Types of Levels
482
553
  ---------------
@@ -488,6 +559,32 @@ def aigefs_single(final_forecast_hour=384,
488
559
  When set to True, the scanner safe-guard is disabled and directory branch is cleared and new data is downloaded.
489
560
 
490
561
 
562
+ 19) variables (String List) **level_type='pressure'** - Default=['geopotential height',
563
+ 'specific humidity',
564
+ 'temperature',
565
+ 'u-component of wind',
566
+ 'v-component of wind',
567
+ 'vertical velocity (pressure)']
568
+
569
+ When the level_type = 'pressure', the user can filter by variable to the variable they want. (Surface level files are very small
570
+ compared to pressure level files).
571
+
572
+ 20) levels (Integer List) **level_type='pressure'** - Default=[1000,
573
+ 925,
574
+ 850,
575
+ 700,
576
+ 600,
577
+ 500,
578
+ 400,
579
+ 300,
580
+ 250,
581
+ 150,
582
+ 100,
583
+ 50]
584
+
585
+ When the level_type = 'pressure', the user can filter by level to the level they want. (Surface level files are very small
586
+ compared to pressure level files).
587
+
491
588
  Returns
492
589
  -------
493
590
 
@@ -512,14 +609,14 @@ def aigefs_single(final_forecast_hour=384,
512
609
  '2m_temperature'
513
610
  """
514
611
  cat = cat.lower()
515
- type_of_level = type_of_level.lower()
612
+ level_type = level_type.lower()
516
613
 
517
614
  if cat == 'mean':
518
615
  cat = 'avg'
519
616
  else:
520
617
  cat = 'spr'
521
618
 
522
- if type_of_level == 'pressure':
619
+ if level_type == 'pressure':
523
620
  level = 'pres'
524
621
  else:
525
622
  level = 'sfc'
@@ -532,7 +629,7 @@ def aigefs_single(final_forecast_hour=384,
532
629
  pass
533
630
 
534
631
  if custom_directory == None:
535
- path = _build_aigefs_single_directory(type_of_level,
632
+ path = _build_aigefs_single_directory(level_type,
536
633
  cat)
537
634
  else:
538
635
  path = _custom_branch(custom_directory)
@@ -545,7 +642,7 @@ def aigefs_single(final_forecast_hour=384,
545
642
  url, file, run = _aigefs_single_url_scanner(final_forecast_hour,
546
643
  proxies,
547
644
  cat,
548
- type_of_level)
645
+ level_type)
549
646
 
550
647
  download = _local_file_scanner(path,
551
648
  file,
@@ -554,7 +651,7 @@ def aigefs_single(final_forecast_hour=384,
554
651
  model='aigefs')
555
652
 
556
653
  if download == True:
557
- print(f"Downloading AIGEFS {type_of_level.upper()} {cat.upper()} Files...")
654
+ print(f"Downloading AIGEFS {level_type.upper()} {cat.upper()} Files...")
558
655
 
559
656
  _clear_old_data(path)
560
657
 
@@ -564,34 +661,73 @@ def aigefs_single(final_forecast_hour=384,
564
661
  run = f"{run}"
565
662
  stop = final_forecast_hour + 6
566
663
 
664
+
567
665
  for i in range(0, stop, 6):
568
- if i < 10:
569
- _client.get_gridded_data(f"{url}aigefs.t{run}z.{level}.{cat}.f00{i}.grib2",
570
- path,
571
- f"aigefs.t{run}z.{level}.{cat}.f00{i}.grib2",
572
- proxies=proxies,
573
- chunk_size=chunk_size,
574
- notifications=notifications)
575
- elif i >= 10 and i < 100:
576
- _client.get_gridded_data(f"{url}aigefs.t{run}z.{level}.{cat}.f0{i}.grib2",
577
- path,
578
- f"aigefs.t{run}z.{level}.{cat}.f0{i}.grib2",
579
- proxies=proxies,
580
- chunk_size=chunk_size,
581
- notifications=notifications)
666
+ if level_type == 'surface':
667
+ if i < 10:
668
+ _client.get_gridded_data(f"{url}aigefs.t{run}z.{level}.{cat}.f00{i}.grib2",
669
+ path,
670
+ f"aigefs.t{run}z.{level}.{cat}.f00{i}.grib2",
671
+ proxies=proxies,
672
+ chunk_size=chunk_size,
673
+ notifications=notifications)
674
+ elif i >= 10 and i < 100:
675
+ _client.get_gridded_data(f"{url}aigefs.t{run}z.{level}.{cat}.f0{i}.grib2",
676
+ path,
677
+ f"aigefs.t{run}z.{level}.{cat}.f0{i}.grib2",
678
+ proxies=proxies,
679
+ chunk_size=chunk_size,
680
+ notifications=notifications)
681
+ else:
682
+ _client.get_gridded_data(f"{url}aigefs.t{run}z.{level}.{cat}.f{i}.grib2",
683
+ path,
684
+ f"aigefs.t{run}z.{level}.{cat}.f{i}.grib2",
685
+ proxies=proxies,
686
+ chunk_size=chunk_size,
687
+ notifications=notifications)
582
688
  else:
583
- _client.get_gridded_data(f"{url}aigefs.t{run}z.{level}.{cat}.f{i}.grib2",
584
- path,
585
- f"aigefs.t{run}z.{level}.{cat}.f{i}.grib2",
586
- proxies=proxies,
587
- chunk_size=chunk_size,
588
- notifications=notifications)
689
+ if i < 10:
690
+ _client.byte_range_request(f"{url}aigefs.t{run}z.{level}.{cat}.f00{i}.grib2",
691
+ f"{url}aigefs.t{run}z.{level}.{cat}.f00{i}.grib2.idx",
692
+ variables,
693
+ levels,
694
+ 'pressure',
695
+ path,
696
+ f"aigefs.t{run}z.pres.f00{i}.grib2",
697
+ proxies=proxies,
698
+ chunk_size=chunk_size,
699
+ notifications=notifications,
700
+ clear_recycle_bin=clear_recycle_bin)
701
+ elif i >= 10 and i < 100:
702
+ _client.byte_range_request(f"{url}aigefs.t{run}z.{level}.{cat}.f0{i}.grib2",
703
+ f"{url}aigefs.t{run}z.{level}.{cat}.f0{i}.grib2.idx",
704
+ variables,
705
+ levels,
706
+ 'pressure',
707
+ path,
708
+ f"aigefs.t{run}z.pres.f0{i}.grib2",
709
+ proxies=proxies,
710
+ chunk_size=chunk_size,
711
+ notifications=notifications,
712
+ clear_recycle_bin=clear_recycle_bin)
713
+ else:
714
+ _client.byte_range_request(f"{url}aigefs.t{run}z.{level}.{cat}.f{i}.grib2",
715
+ f"{url}aigefs.t{run}z.{level}.{cat}.f{i}.grib2.idx",
716
+ variables,
717
+ levels,
718
+ 'pressure',
719
+ path,
720
+ f"aigefs.t{run}z.pres.f{i}.grib2",
721
+ proxies=proxies,
722
+ chunk_size=chunk_size,
723
+ notifications=notifications,
724
+ clear_recycle_bin=clear_recycle_bin)
589
725
 
590
726
  else:
591
- print(f"User has latest AIGEFS {type_of_level.upper()} {cat.upper()} Files\nSkipping Download...")
727
+ print(f"User has latest AIGEFS {level_type.upper()} {cat.upper()} Files\nSkipping Download...")
592
728
 
593
729
  if process_data == True:
594
- print(f"AIGEFS {type_of_level.upper()} {cat.upper()} Data Processing...")
730
+ print(f"AIGEFS {level_type.upper()} {cat.upper()} Data Processing...")
595
731
 
596
732
  ds = _aigefs_post_processing.aigefs_single_post_processing(path,
597
733
  western_bound,
@@ -605,7 +741,7 @@ def aigefs_single(final_forecast_hour=384,
605
741
  cat='mean')
606
742
 
607
743
 
608
- print(f"AIGEFS {type_of_level.upper()} {cat.upper()} Data Processing Complete.")
744
+ print(f"AIGEFS {level_type.upper()} {cat.upper()} Data Processing Complete.")
609
745
  return ds
610
746
  else:
611
747
  pass