wxdata 1.7__tar.gz → 2.0.1__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.
- {wxdata-1.7/src/wxdata.egg-info → wxdata-2.0.1}/PKG-INFO +51 -9
- {wxdata-1.7 → wxdata-2.0.1}/README.md +50 -8
- {wxdata-1.7 → wxdata-2.0.1}/pyproject.toml +1 -1
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/__init__.py +2 -2
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/aigefs/aigefs.py +187 -51
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/aigfs/aigfs.py +113 -31
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/calc/unit_conversion.py +0 -1
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/client/byte_range.py +35 -3
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/client/client.py +6 -7
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/client/level_coords.py +45 -4
- wxdata-2.0.1/src/wxdata/ecmwf/ecmwf.py +6179 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/ecmwf/keys.py +1 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/ecmwf/url_scanners.py +362 -151
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/gefs/__init__.py +0 -1
- wxdata-2.0.1/src/wxdata/gefs/gefs.py +3361 -0
- wxdata-2.0.1/src/wxdata/gefs/url_scanners.py +987 -0
- wxdata-2.0.1/src/wxdata/gfs/gfs.py +3206 -0
- wxdata-2.0.1/src/wxdata/gfs/url_scanners.py +882 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/hgefs/hgefs.py +120 -31
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/noaa/nws.py +576 -13
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/post_processors/aigefs_post_processing.py +4 -6
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/post_processors/aigfs_post_processing.py +2 -3
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/post_processors/cfs_post_processing.py +4 -4
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/post_processors/ecmwf_post_processing.py +18 -6
- wxdata-2.0.1/src/wxdata/post_processors/gefs_post_processing.py +971 -0
- wxdata-2.0.1/src/wxdata/post_processors/gfs_post_processing.py +899 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/post_processors/hgefs_post_processing.py +2 -3
- wxdata-2.0.1/src/wxdata/post_processors/rtma_post_processing.py +678 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/radar/url_scanner.py +1 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/rtma/__init__.py +1 -1
- wxdata-2.0.1/src/wxdata/rtma/file_scanner.py +122 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/rtma/rtma.py +134 -111
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/rtma/url_scanners.py +232 -190
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/exceptions.py +29 -2
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/nomads_gribfilter.py +3 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/progress_bar.py +29 -1
- {wxdata-1.7 → wxdata-2.0.1/src/wxdata.egg-info}/PKG-INFO +51 -9
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata.egg-info/SOURCES.txt +1 -2
- wxdata-1.7/src/wxdata/ecmwf/ecmwf.py +0 -2802
- wxdata-1.7/src/wxdata/gefs/gefs.py +0 -1193
- wxdata-1.7/src/wxdata/gefs/process.py +0 -3157
- wxdata-1.7/src/wxdata/gefs/url_scanners.py +0 -2532
- wxdata-1.7/src/wxdata/gfs/gfs.py +0 -1139
- wxdata-1.7/src/wxdata/gfs/url_scanners.py +0 -1609
- wxdata-1.7/src/wxdata/post_processors/gefs_post_processing.py +0 -3111
- wxdata-1.7/src/wxdata/post_processors/gfs_post_processing.py +0 -2022
- wxdata-1.7/src/wxdata/post_processors/rtma_post_processing.py +0 -332
- wxdata-1.7/src/wxdata/rtma/process.py +0 -320
- {wxdata-1.7 → wxdata-2.0.1}/LICENSE +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/setup.cfg +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/aigefs/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/aigefs/paths.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/aigefs/url_scanners.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/aigfs/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/aigfs/paths.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/aigfs/url_scanners.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/calc/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/calc/derived_fields.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/calc/kinematics.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/calc/thermodynamics.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/cfs/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/cfs/cfs.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/cfs/file_scanner.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/cfs/url_scanners.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/client/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/ecmwf/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/ecmwf/file_funcs.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/ecmwf/parsers.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/ecmwf/paths.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/fems/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/fems/meta_data.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/fems/observations.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/gefs/exception_messages.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/gefs/file_funcs.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/gefs/paths.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/gfs/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/gfs/exception_messages.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/gfs/paths.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/hgefs/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/hgefs/paths.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/hgefs/url_scanner.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/metars/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/metars/_clean_data.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/metars/metar_obs.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/noaa/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/post_processors/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/radar/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/radar/nexrad2.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/rtma/file_funcs.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/rtma/keys.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/soundings/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/soundings/_exceptions.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/soundings/wyoming_soundings.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/__init__.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/coords.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/file_funcs.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/file_scanner.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/recycle_bin.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/scripts.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/tools.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata/utils/xmacis2_cleanup.py +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata.egg-info/dependency_links.txt +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/src/wxdata.egg-info/requires.txt +0 -0
- {wxdata-1.7 → wxdata-2.0.1}/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
|
+
Version: 2.0.1
|
|
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) [
|
|
67
|
-
3) [
|
|
68
|
-
4) [WxData
|
|
69
|
-
5) [WxData
|
|
70
|
-
6) [
|
|
71
|
-
7) [
|
|
72
|
-
8) [
|
|
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) [
|
|
35
|
-
3) [
|
|
36
|
-
4) [WxData
|
|
37
|
-
5) [WxData
|
|
38
|
-
6) [
|
|
39
|
-
7) [
|
|
40
|
-
8) [
|
|
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
|
|
3
|
+
version = "2.0.1"
|
|
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.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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.
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
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.
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
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)
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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 {
|
|
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
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
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
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
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 {
|
|
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 {
|
|
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 {
|
|
744
|
+
print(f"AIGEFS {level_type.upper()} {cat.upper()} Data Processing Complete.")
|
|
609
745
|
return ds
|
|
610
746
|
else:
|
|
611
747
|
pass
|