weatherdb 1.1.2__py3-none-any.whl → 1.2.1__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- docker/docker-compose.yaml +5 -1
- docs/source/Methode.md +5 -1
- docs/source/api/weatherdb.broker.rst +7 -0
- docs/source/api/weatherdb.db.rst +10 -0
- docs/source/api/weatherdb.rst +0 -1
- docs/source/api/weatherdb.station.GroupStation.rst +5 -0
- docs/source/api/weatherdb.station.StationBases.rst +18 -0
- docs/source/api/weatherdb.station.StationET.rst +5 -0
- docs/source/api/weatherdb.station.StationP.rst +5 -0
- docs/source/api/weatherdb.station.StationPD.rst +6 -0
- docs/source/api/weatherdb.station.StationT.rst +5 -0
- docs/source/api/weatherdb.station.rst +11 -50
- docs/source/api/weatherdb.stations.StationsBase.rst +15 -0
- docs/source/api/weatherdb.stations.StationsET.rst +6 -0
- docs/source/api/weatherdb.stations.StationsP.rst +6 -0
- docs/source/api/weatherdb.stations.StationsPD.rst +7 -0
- docs/source/api/weatherdb.stations.StationsT.rst +7 -0
- docs/source/api/weatherdb.stations.rst +10 -41
- docs/source/api/weatherdb.utils.rst +2 -0
- docs/source/conf.py +3 -0
- docs/source/setup/Quickstart.md +2 -1
- tests/test-data/DEM/COP-DEM_GLO-30-DGED__2023_1_clipped.tif +0 -0
- tests/test-data/DEM/README.md +3 -0
- tests/test-data/DEM/eula_F.pdf +0 -0
- tests/test-data/regionalisation/DWD-grid_ma_1991_2020_DGM25_clipped.tif +0 -0
- tests/test-data/regionalisation/HYRAS_ma_1991_2020_DGM25_clipped.tif +0 -0
- tests/test-data/regionalisation/README.md +3 -0
- tests/test-data/test-data-config.ini +28 -0
- weatherdb/_version.py +1 -1
- weatherdb/broker.py +12 -2
- weatherdb/cli.py +20 -5
- weatherdb/config/config_default.ini +30 -1
- weatherdb/station/StationBases.py +91 -17
- weatherdb/stations/StationsBase.py +16 -3
- weatherdb/utils/get_data.py +12 -7
- {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/METADATA +1 -1
- {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/RECORD +41 -23
- {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/WHEEL +1 -1
- {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/top_level.txt +1 -0
- docs/source/api/weatherDB.broker.rst +0 -10
- {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/LICENSE +0 -0
- {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/entry_points.txt +0 -0
docker/docker-compose.yaml
CHANGED
@@ -14,12 +14,14 @@ services:
|
|
14
14
|
WEATHERDB_USER_CONFIG_FILE: /home/config_user.yaml
|
15
15
|
WEATHERDB_DATA_BASE_DIR: /home/data
|
16
16
|
WEATHERDB_HANDLE_NON_EXISTING_CONFIG: create
|
17
|
+
WEATHERDB_OPENTOPO_API_KEY: /run/secrets/opentopo_api_key
|
17
18
|
DOCKER_ENV: main
|
18
19
|
volumes:
|
19
20
|
- weatherdb_home:/home
|
20
21
|
command: ["sleep", "infinity"] # to keep awake
|
21
22
|
secrets:
|
22
23
|
- db_password
|
24
|
+
- opentopo_api_key
|
23
25
|
develop:
|
24
26
|
watch:
|
25
27
|
- action: rebuild
|
@@ -53,6 +55,8 @@ volumes:
|
|
53
55
|
secrets:
|
54
56
|
db_password:
|
55
57
|
file: ./db_password.docker-secret
|
58
|
+
opentopo_api_key:
|
59
|
+
file: ./opentopo_api_key.docker-secret
|
56
60
|
|
57
61
|
# start from parent folder with `docker compose -f docker\\docker-compose.yaml up --build`
|
58
|
-
# To connect to
|
62
|
+
# To connect to the weatherdb service use `docker-compose exec weatherdb bash`
|
docs/source/Methode.md
CHANGED
@@ -117,7 +117,11 @@ N_{neighbor} * \dfrac{N_{station,ma,winter}}{N_{neighbor,ma,winter}} \space if\s
|
|
117
117
|
N_{neighbor} * \dfrac{N_{station,ma,summer}}{N_{neighbor,ma,summer}} \space if\space month\notin[4:9]
|
118
118
|
\end{cases}$
|
119
119
|
|
120
|
-
For the precipitation stations only stations within a
|
120
|
+
For the precipitation stations only stations within a 110 km radius are taken to fill missing values. For the potential Evapotranspiration and the temperature this radius is 150km. For the temperature stations the median of the regionalised values from the 5 closest stations (but not more than 150 km away) is taken to fill missing values. Those limits can get configured in the user configurations.
|
121
|
+
|
122
|
+
### linear interpolation
|
123
|
+
|
124
|
+
After missing values got filled with regionalised values from the neighboring stations there can still be missing values left. To fill those residual missing values, they get interpolated linearly. Those linear interpolations have configurable limits for how big the interval of missing values can be. The default values are 1h for precipitation and 2 days for temperature and evapotranspiration.
|
121
125
|
|
122
126
|
### adjusting precipitation to daily station measurements
|
123
127
|
|
docs/source/api/weatherdb.db.rst
CHANGED
docs/source/api/weatherdb.rst
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
StationBases
|
2
|
+
============
|
3
|
+
|
4
|
+
Those are the base station classes on which the real station classes above depend on.
|
5
|
+
None of them is working on its own, because the class variables are not yet set correctly.
|
6
|
+
|
7
|
+
.. py:module:: weatherdb.station.StationBases
|
8
|
+
|
9
|
+
.. autoclass:: weatherdb.station.StationBases.StationBase
|
10
|
+
|
11
|
+
|
12
|
+
.. autoclass:: weatherdb.station.StationBases.StationPBase
|
13
|
+
|
14
|
+
|
15
|
+
.. autoclass:: weatherdb.station.StationBases.StationCanVirtualBase
|
16
|
+
|
17
|
+
|
18
|
+
.. autoclass:: weatherdb.station.StationBases.StationTETBase
|
@@ -1,56 +1,17 @@
|
|
1
1
|
station
|
2
|
-
|
3
|
-
.. module:: weatherdb.station
|
2
|
+
--------
|
4
3
|
|
5
|
-
|
6
|
-
^^^^^^^^
|
7
|
-
.. autoclass:: weatherdb.station.StationP
|
4
|
+
.. py:module:: weatherdb.station
|
8
5
|
|
9
|
-
|
6
|
+
.. toctree::
|
7
|
+
:maxdepth: 1
|
8
|
+
:titlesonly:
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
weatherdb.station.StationP
|
11
|
+
weatherdb.station.StationT
|
12
|
+
weatherdb.station.StationET
|
13
|
+
weatherdb.station.StationPD
|
14
|
+
weatherdb.station.GroupStation
|
15
|
+
weatherdb.station.StationBases
|
14
16
|
|
15
|
-
.. autoclasstoc::
|
16
17
|
|
17
|
-
StationET
|
18
|
-
^^^^^^^^^
|
19
|
-
|
20
|
-
.. autoclass:: weatherdb.station.StationET
|
21
|
-
|
22
|
-
.. autoclasstoc::
|
23
|
-
|
24
|
-
StationPD
|
25
|
-
^^^^^^^^^
|
26
|
-
.. autoclass:: weatherdb.station.StationPD
|
27
|
-
:exclude-members: quality_check, last_imp_quality_check, get_corr, get_adj, get_qc
|
28
|
-
|
29
|
-
.. autoclasstoc::
|
30
|
-
|
31
|
-
GroupStation
|
32
|
-
^^^^^^^^^^^^
|
33
|
-
.. autoclass:: weatherdb.station.GroupStation
|
34
|
-
|
35
|
-
.. autoclasstoc::
|
36
|
-
|
37
|
-
StationBase...
|
38
|
-
^^^^^^^^^^^^^^
|
39
|
-
Those are the base station classes on which the real station classes above depend on.
|
40
|
-
None of them is working on its own, because the class variables are not yet set correctly.
|
41
|
-
|
42
|
-
.. autoclass:: weatherdb.station.StationBases.StationBase
|
43
|
-
|
44
|
-
.. autoclasstoc::
|
45
|
-
|
46
|
-
.. autoclass:: weatherdb.station.StationBases.StationPBase
|
47
|
-
|
48
|
-
.. autoclasstoc::
|
49
|
-
|
50
|
-
.. autoclass:: weatherdb.station.StationBases.StationCanVirtualBase
|
51
|
-
|
52
|
-
.. autoclasstoc::
|
53
|
-
|
54
|
-
.. autoclass:: weatherdb.station.StationBases.StationTETBase
|
55
|
-
|
56
|
-
.. autoclasstoc::
|
@@ -0,0 +1,15 @@
|
|
1
|
+
StationsBase
|
2
|
+
============
|
3
|
+
|
4
|
+
Those are the base stations classes on which the real stations classes above depend on.
|
5
|
+
None of them is working on its own, because the class variables are not yet set correctly.
|
6
|
+
|
7
|
+
.. py:module:: weatherdb.stations.StationsBase
|
8
|
+
|
9
|
+
.. autoclass:: weatherdb.stations.StationsBase.StationsBase
|
10
|
+
|
11
|
+
.. autoclasstoc::
|
12
|
+
|
13
|
+
.. autoclass:: weatherdb.stations.StationsBaseTET.StationsBaseTET
|
14
|
+
|
15
|
+
.. autoclasstoc::
|
@@ -1,46 +1,15 @@
|
|
1
1
|
stations
|
2
2
|
--------
|
3
|
-
.. module:: weatherdb.stations
|
4
3
|
|
5
|
-
|
6
|
-
^^^^^^^^^
|
7
|
-
.. autoclass:: weatherdb.stations.StationsP
|
4
|
+
.. py:module:: weatherdb.stations
|
8
5
|
|
9
|
-
|
6
|
+
.. toctree::
|
7
|
+
:maxdepth: 1
|
8
|
+
:titlesonly:
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
StationsET
|
18
|
-
^^^^^^^^^^
|
19
|
-
.. autoclass:: weatherdb.stations.StationsET
|
20
|
-
|
21
|
-
.. autoclasstoc::
|
22
|
-
|
23
|
-
StationsPD
|
24
|
-
^^^^^^^^^^
|
25
|
-
.. autoclass:: weatherdb.stations.StationsPD
|
26
|
-
|
27
|
-
.. autoclasstoc::
|
28
|
-
|
29
|
-
GroupStations
|
30
|
-
^^^^^^^^^^^^^
|
31
|
-
.. autoclass:: weatherdb.stations.GroupStations
|
32
|
-
|
33
|
-
.. autoclasstoc::
|
34
|
-
|
35
|
-
StationsBase...
|
36
|
-
^^^^^^^^^^^^^^^
|
37
|
-
Those are the base stations classes on which the real stations classes above depend on.
|
38
|
-
None of them is working on its own, because the class variables are not yet set correctly.
|
39
|
-
|
40
|
-
.. autoclass:: weatherdb.stations.StationsBase.StationsBase
|
41
|
-
|
42
|
-
.. autoclasstoc::
|
43
|
-
|
44
|
-
.. autoclass:: weatherdb.stations.StationsBaseTET.StationsBaseTET
|
45
|
-
|
46
|
-
.. autoclasstoc::
|
10
|
+
weatherdb.stations.StationsP
|
11
|
+
weatherdb.stations.StationsT
|
12
|
+
weatherdb.stations.StationsET
|
13
|
+
weatherdb.stations.StationsPD
|
14
|
+
weatherdb.stations.GroupStations
|
15
|
+
weatherdb.stations.StationsBase
|
docs/source/conf.py
CHANGED
docs/source/setup/Quickstart.md
CHANGED
@@ -46,7 +46,8 @@ So there is:
|
|
46
46
|
- "raw" : the raw measurements as on the DWD server
|
47
47
|
- "qc" : The quality checked data
|
48
48
|
- "filled" : The filled timeseries
|
49
|
-
- "filled_by" : The station ID of the station from which the data was taken to fill the measurements
|
49
|
+
- "filled_by" : The station ID of the station from which the data was taken to fill the measurements.
|
50
|
+
If the value was filled by linear intrepolation "filled_by" is `-1`
|
50
51
|
- "corr" : The Richter corrected timeserie.
|
51
52
|
|
52
53
|
If you want more than just one kind of timeseries, e.g. the filled timeseries, together with the id from which station the respective field got filled with use:
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,28 @@
|
|
1
|
+
; Those are configs that should get loaded, when the test files are loaded
|
2
|
+
[data:rasters]
|
3
|
+
DEMS = ${data:BASE_DIR}/DEM/COP-DEM_GLO-30-DGED__2023_1_clipped.tif
|
4
|
+
|
5
|
+
[data:rasters:hyras]
|
6
|
+
FILE = ${data:BASE_DIR}/regionalisation/HYRAS_ma_1991_2020_DGM25_clipped.tif
|
7
|
+
BAND_P_WIHY = n_hyras_wihj
|
8
|
+
BAND_P_SUHY = n_hyras_sohj
|
9
|
+
BAND_P_YEAR = n_hyras_year
|
10
|
+
SRID = 3035
|
11
|
+
FACTOR_P_WIHY = 1
|
12
|
+
FACTOR_P_SUHY = 1
|
13
|
+
FACTOR_P_YEAR = 1
|
14
|
+
|
15
|
+
[data:rasters:dwd]
|
16
|
+
FILE = ${data:BASE_DIR}/regionalisation/DWD-grid_ma_1991_2020_DGM25_clipped.tif
|
17
|
+
BAND_P_WIHY = n_wihj
|
18
|
+
BAND_P_SUHY = n_sohj
|
19
|
+
BAND_P_YEAR = n_year
|
20
|
+
BAND_T_YEAR = t_year
|
21
|
+
BAND_ET_YEAR = et_year
|
22
|
+
SRID = 3035
|
23
|
+
FACTOR_P_WIHY = 1
|
24
|
+
FACTOR_P_SUHY = 1
|
25
|
+
FACTOR_P_YEAR = 1
|
26
|
+
FACTOR_T_YEAR = 0.1
|
27
|
+
FACTOR_ET_YEAR = 1
|
28
|
+
|
weatherdb/_version.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__version__ = "1.1
|
1
|
+
__version__ = "1.2.1"
|
weatherdb/broker.py
CHANGED
@@ -647,8 +647,9 @@ class Broker(object):
|
|
647
647
|
is_active : bool
|
648
648
|
Whether the broker is active.
|
649
649
|
"""
|
650
|
+
if self._is_active != is_active:
|
651
|
+
self.set_setting("broker_active", str(is_active))
|
650
652
|
self._is_active = is_active
|
651
|
-
self.set_setting("broker_active", str(is_active))
|
652
653
|
|
653
654
|
def _deactivate(self):
|
654
655
|
self.is_active = False
|
@@ -664,4 +665,13 @@ class Broker(object):
|
|
664
665
|
yield self
|
665
666
|
finally:
|
666
667
|
self._deactivate()
|
667
|
-
atexit.unregister(self._deactivate)
|
668
|
+
atexit.unregister(self._deactivate)
|
669
|
+
|
670
|
+
def force_deactivate_all(self):
|
671
|
+
"""Forcefully set the active broker flag in the database to deactivated.
|
672
|
+
|
673
|
+
This is useful if the broker got exited before it could deactivate itself.
|
674
|
+
"""
|
675
|
+
if self.is_active:
|
676
|
+
self._deactivate()
|
677
|
+
self.set_setting("broker_active", "False")
|
weatherdb/cli.py
CHANGED
@@ -16,6 +16,7 @@ import weatherdb
|
|
16
16
|
show_default=True
|
17
17
|
)
|
18
18
|
)
|
19
|
+
@click.version_option(weatherdb.__version__)
|
19
20
|
@click.option('--do-logging/--no-logging',
|
20
21
|
is_flag=True, default=True, show_default=True,
|
21
22
|
help="Should the logging be done to the console?")
|
@@ -98,8 +99,11 @@ def create_user_config(file, on_exists):
|
|
98
99
|
def download_ma_rasters(which, overwrite, update_user_config):
|
99
100
|
"""Get the multi annual rasters on which bases the regionalisation is done.
|
100
101
|
|
101
|
-
The refined multi annual datasets, that are downloaded are published on Zenodo
|
102
|
-
|
102
|
+
The refined multi annual datasets, that are downloaded are published on Zenodo. [1]_
|
103
|
+
|
104
|
+
References:
|
105
|
+
-----------
|
106
|
+
.. [1] Schmit, M.; Weiler, M. (2023). German weather services (DWD) multi annual meteorological rasters for the climate period 1991-2020 refined to 25m grid (1.0.0) [Data set]. Zenodo. `DOI:10.5281/zenodo.10066045 <https://doi.org/10.5281/zenodo.10066045>`_
|
103
107
|
"""
|
104
108
|
click.echo("starting downloading multi annual raster data")
|
105
109
|
from weatherdb.utils.get_data import download_ma_rasters
|
@@ -127,7 +131,7 @@ def download_ma_rasters(which, overwrite, update_user_config):
|
|
127
131
|
help="The service to use to download the DEM. Options are 'prism' or 'openTopography'. " +\
|
128
132
|
"You can use this option muultiple times to test both in the given order until the file could be downloaded.")
|
129
133
|
def download_dem(out_dir, overwrite, extent, update_user_config, service="prism"):
|
130
|
-
"""Download the newest DEM data from the Copernicus Sentinel dataset.
|
134
|
+
"""Download the newest DEM data from the Copernicus Sentinel dataset. [1]_
|
131
135
|
|
132
136
|
Only the GLO-30 DEM, wich has a 30m resolution, is downloaded as it is freely available.
|
133
137
|
If you register as a scientific researcher also the EEA-10, with 10 m resolution, is available.
|
@@ -136,8 +140,9 @@ def download_dem(out_dir, overwrite, extent, update_user_config, service="prism"
|
|
136
140
|
After downloading the data, the files are merged and saved as a single tif file in the data directory in a subfolder called 'dems'.
|
137
141
|
To use the DEM data in the WeatherDB, you will have to define the path to the tif file in the configuration file.
|
138
142
|
|
139
|
-
|
140
|
-
|
143
|
+
References:
|
144
|
+
-----------
|
145
|
+
.. [1] Copernicus DEM - Global and European Digital Elevation Model. Digital Surface Model (DSM) provided in 3 different resolutions (90m, 30m, 10m) with varying geographical extent (EEA: European and GLO: global) and varying format (INSPIRE, DGED, DTED). `DOI:10.5270/ESA-c5d3d65 <https://doi.org/10.5270/ESA-c5d3d65>`_
|
141
146
|
"""
|
142
147
|
click.echo("Starting downloading digital elevation model from Copernicus")
|
143
148
|
from weatherdb.utils.get_data import download_dem
|
@@ -221,6 +226,16 @@ def set_db_version():
|
|
221
226
|
else:
|
222
227
|
click.echo("aborting setting db version")
|
223
228
|
|
229
|
+
@cli.command(short_help="Forcefully set the active broker flag in the database to deactivated. This is useful if the broker got exited before it could deactivate itself. (!!!Only use this if you're sure that the database did all the necessary updates!!!)")
|
230
|
+
def force_deactivate_all_broker():
|
231
|
+
click.echo(dedent("""
|
232
|
+
Are you sure that there is no more broker running? This could lead to problems as multiple brokers could run at the same time contradicting themself."""))
|
233
|
+
if click.confirm("Are you sure you want to set the activation flag in the database to deactivated?"):
|
234
|
+
click.echo("deactivating the brokers flag")
|
235
|
+
broker = weatherdb.broker.Broker()
|
236
|
+
broker.force_deactivate_all()
|
237
|
+
else:
|
238
|
+
click.echo("aborting the deactivation of the brokers flag")
|
224
239
|
|
225
240
|
# cli
|
226
241
|
# ---------------------------------------
|
@@ -143,17 +143,46 @@ RASTER_BUFFER_CRS = ${weatherdb:HORIZON_CRS}
|
|
143
143
|
; The default is 1999-01-01
|
144
144
|
MIN_DATE = 1999-01-01
|
145
145
|
|
146
|
+
[weatherdb:LINEAR_INTERPOLATION_LIMIT]
|
147
|
+
; When there are still NAs after filling with neighboring stations, the module can use linear interpolation to fill the gaps
|
148
|
+
; The limit defines the maximum interval that is allowed to fill with linear interpolation
|
149
|
+
; The value is given with a unit, e.g. 3 days, 30 minutes, 1 hour
|
150
|
+
; For further explanation about the format see https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-INTERVAL-INPUT
|
151
|
+
; for precipitation, where the timeseries resolution is 10 minutes, 30 minutes means 3 missing values are interpolated, but not more.
|
152
|
+
; If there shouldn't be any linear interpolation, set the limit to 0
|
153
|
+
; For precipitation, the default is 1 hour
|
154
|
+
P = 1 hour
|
155
|
+
; For temperature, the default is 2 days
|
156
|
+
T = 2 days
|
157
|
+
; For Evapotranspiration, the default is 2 days
|
158
|
+
ET = 2 days
|
159
|
+
|
146
160
|
|
147
161
|
[weatherdb:max_fillup_distance]
|
148
162
|
; The maximum distance in meters to use for the filling of the station data
|
149
163
|
; For each parameter (P, T, ET) the module uses a different distance
|
150
164
|
; Precipitation (P)
|
151
|
-
P =
|
165
|
+
P = 130000
|
152
166
|
; Temperature (T)
|
153
167
|
T = 150000
|
154
168
|
; Evapotranspiration (ET)
|
155
169
|
ET = 150000
|
156
170
|
|
171
|
+
|
172
|
+
[system:parallel_processes]
|
173
|
+
; You can configure how many processes are getting started in parrallel when tghe database is updated.
|
174
|
+
; depending on your system, the database can handle more or less processes
|
175
|
+
; There are 2 possible ways to configure this.
|
176
|
+
; either define the absolute number of processes:
|
177
|
+
; ABSOLUTE =
|
178
|
+
|
179
|
+
; or define the number of processes in relation to the number of CPUs,
|
180
|
+
; by defining how many CPUs should be used less than the maximum available CPUs
|
181
|
+
; if the absolute number is defined, the relative number is ignored
|
182
|
+
; This is the default setting of cpu count -1
|
183
|
+
CPU_COUNT_MINUS = 1
|
184
|
+
|
185
|
+
|
157
186
|
; for developpers:
|
158
187
|
; ----------------
|
159
188
|
;
|
@@ -1491,6 +1491,77 @@ class StationBase:
|
|
1491
1491
|
extra_fillup_where=sql_format_dict["extra_fillup_where"] +\
|
1492
1492
|
' OR ts."filled_by" IS DISTINCT FROM new."filled_by"'))
|
1493
1493
|
|
1494
|
+
# linear interpolation for the last missing values
|
1495
|
+
lr_limit = config.get(
|
1496
|
+
"weatherdb:linear_interpolation_limit",
|
1497
|
+
self._para_base,
|
1498
|
+
fallback="0")
|
1499
|
+
if lr_limit != "0":
|
1500
|
+
sql_format_dict.update(dict(
|
1501
|
+
sql_linear_interpolation=f"""
|
1502
|
+
DO
|
1503
|
+
$do$
|
1504
|
+
DECLARE reg_borders record;
|
1505
|
+
BEGIN
|
1506
|
+
FOR reg_borders IN
|
1507
|
+
WITH empty_periods AS (
|
1508
|
+
SELECT *
|
1509
|
+
FROM ( SELECT
|
1510
|
+
CASE WHEN dist_next::interval>'{self._interval}'::interval
|
1511
|
+
THEN timestamp
|
1512
|
+
ELSE NULL
|
1513
|
+
END AS start,
|
1514
|
+
CASE WHEN dist_next>'{self._interval}'::interval
|
1515
|
+
THEN LEAD(timestamp) OVER (ORDER BY timestamp)
|
1516
|
+
ELSE NULL
|
1517
|
+
END AS end
|
1518
|
+
FROM (
|
1519
|
+
SELECT *,
|
1520
|
+
(timestamp::timestamp
|
1521
|
+
- lag(timestamp::timestamp, 1) OVER ( ORDER BY timestamp)
|
1522
|
+
)::interval AS dist_prev,
|
1523
|
+
(lead(timestamp::timestamp, 1) OVER ( ORDER BY timestamp)
|
1524
|
+
- timestamp::timestamp
|
1525
|
+
)::interval AS dist_next
|
1526
|
+
FROM new_filled_{self.id}_{self._para}
|
1527
|
+
WHERE filled IS NOT NULL) t
|
1528
|
+
WHERE t.dist_prev > '{self._interval}'::interval
|
1529
|
+
OR t.dist_next > '{self._interval}'::interval
|
1530
|
+
) p
|
1531
|
+
WHERE p.start IS NOT NULL AND p.end IS NOT NULL)
|
1532
|
+
SELECT
|
1533
|
+
ep.start AS timestamp_start,
|
1534
|
+
ttss.filled AS value_start,
|
1535
|
+
ep.end AS timestamp_end,
|
1536
|
+
ttse.filled AS value_end,
|
1537
|
+
(ttse.filled - ttss.filled)::numeric/(EXTRACT(EPOCH FROM (ep.end::timestamp - ep.start::timestamp))/EXTRACT(EPOCH FROM '{self._interval}'::interval))::numeric as slope
|
1538
|
+
FROM empty_periods ep
|
1539
|
+
LEFT JOIN new_filled_{self.id}_{self._para} ttss ON ep.start::timestamp = ttss.timestamp::timestamp
|
1540
|
+
LEFT JOIN new_filled_{self.id}_{self._para} ttse ON ep.end::timestamp = ttse.timestamp::timestamp
|
1541
|
+
WHERE (ep.end::timestamp - ep.start::timestamp - '{self._interval}'::interval) <= '{lr_limit}'::interval
|
1542
|
+
loop
|
1543
|
+
execute FORMAT(
|
1544
|
+
$$
|
1545
|
+
UPDATE new_filled_{self.id}_{self._para} ts
|
1546
|
+
SET filled=%2$L::numeric + (%5$L::numeric *
|
1547
|
+
EXTRACT(EPOCH FROM ts.timestamp::timestamp - %1$L::timestamp)::numeric
|
1548
|
+
/EXTRACT(EPOCH FROM '{self._interval}'::interval)::numeric),
|
1549
|
+
filled_by={"ARRAY[-1]::smallint[]" if self._filled_by_n>1 else "-1::smallint"}
|
1550
|
+
WHERE ts.timestamp > %1$L AND ts.timestamp < %3$L;
|
1551
|
+
$$,
|
1552
|
+
reg_borders.timestamp_start,
|
1553
|
+
reg_borders.value_start,
|
1554
|
+
reg_borders.timestamp_end,
|
1555
|
+
reg_borders.value_end,
|
1556
|
+
reg_borders.slope
|
1557
|
+
);
|
1558
|
+
END loop;
|
1559
|
+
END
|
1560
|
+
$do$;"""))
|
1561
|
+
else:
|
1562
|
+
sql_format_dict.update(dict(sql_linear_interpolation=""))
|
1563
|
+
|
1564
|
+
|
1494
1565
|
# Make SQL statement to fill the missing values with values from nearby stations
|
1495
1566
|
sql = """
|
1496
1567
|
CREATE TEMP TABLE new_filled_{stid}_{para}
|
@@ -1563,15 +1634,16 @@ class StationBase:
|
|
1563
1634
|
FROM new_filled_{stid}_{para}
|
1564
1635
|
WHERE "filled" IS NULL {extra_unfilled_period_where};
|
1565
1636
|
END LOOP;
|
1566
|
-
{sql_extra_after_loop}
|
1567
|
-
UPDATE timeseries."{stid}_{para}" ts
|
1568
|
-
SET filled = new.filled, {extra_cols_fillup}
|
1569
|
-
filled_by = new.filled_by
|
1570
|
-
FROM new_filled_{stid}_{para} new
|
1571
|
-
WHERE ts.timestamp = new.timestamp
|
1572
|
-
AND (ts."filled" IS DISTINCT FROM new."filled" {extra_fillup_where}) ;
|
1573
1637
|
END
|
1574
1638
|
$do$;
|
1639
|
+
{sql_linear_interpolation}
|
1640
|
+
{sql_extra_after_loop}
|
1641
|
+
UPDATE timeseries."{stid}_{para}" ts
|
1642
|
+
SET filled = new.filled, {extra_cols_fillup}
|
1643
|
+
filled_by = new.filled_by
|
1644
|
+
FROM new_filled_{stid}_{para} new
|
1645
|
+
WHERE ts.timestamp = new.timestamp
|
1646
|
+
AND (ts."filled" IS DISTINCT FROM new."filled" {extra_fillup_where}) ;
|
1575
1647
|
""".format(**sql_format_dict)
|
1576
1648
|
|
1577
1649
|
# execute
|
@@ -1815,8 +1887,8 @@ class StationBase:
|
|
1815
1887
|
The timeseries kinds of the denominator or the multi annual raster key.
|
1816
1888
|
If the denominator is a multi annual raster key, then the result is the quotient of the timeserie and the raster value.
|
1817
1889
|
Possible values are:
|
1818
|
-
|
1819
|
-
|
1890
|
+
- for timeserie kinds: 'raw', 'qc', 'filled' or for precipitation also "corr".
|
1891
|
+
- for raster keys: 'hyras', 'dwd' or 'regnie', depending on your defined raster files.
|
1820
1892
|
return_as : str, optional
|
1821
1893
|
The format of the return value.
|
1822
1894
|
If "df" then a pandas DataFrame is returned.
|
@@ -2154,7 +2226,6 @@ class StationBase:
|
|
2154
2226
|
The elevation difference is considered with the formula from LARSIM (equation 3-18 & 3-19 from the LARSIM manual [1]_ ):
|
2155
2227
|
|
2156
2228
|
.. math::
|
2157
|
-
|
2158
2229
|
L_{weighted} = L_{horizontal} * (1 + (\\frac{|\\delta H|}{P_1})^{P_2})
|
2159
2230
|
If None, then the height difference is not considered and only the nearest stations are returned.
|
2160
2231
|
The default is None.
|
@@ -2851,18 +2922,21 @@ class StationTETBase(StationCanVirtualBase):
|
|
2851
2922
|
Parameters
|
2852
2923
|
----------
|
2853
2924
|
p_elev : tuple, optional
|
2854
|
-
In Larsim those parameters are defined as $P_1 = 500$ and $P_2 = 1$.
|
2855
|
-
Stoelzle et al. (2016) found that $P_1 = 100$ and $P_2 = 4$ is better for Baden-Würtemberg to consider the quick changes in topographie.
|
2925
|
+
In Larsim [3]_ those parameters are defined as $P_1 = 500$ and $P_2 = 1$.
|
2926
|
+
Stoelzle et al. (2016) [2]_ found that $P_1 = 100$ and $P_2 = 4$ is better for Baden-Würtemberg to consider the quick changes in topographie.
|
2856
2927
|
For all of germany, those parameter values are giving too much weight to the elevation difference, which can result in getting neighboor stations from the border of the Tschec Republic for the Feldberg station. Therefor the values $P_1 = 250$ and $P_2 = 1.5$ are used as default values.
|
2857
|
-
literature:
|
2858
|
-
- Stoelzle, Michael & Weiler, Markus & Steinbrich, Andreas. (2016) Starkregengefährdung in Baden-Württemberg – von der Methodenentwicklung zur Starkregenkartierung. Tag der Hydrologie.
|
2859
|
-
- LARSIM Dokumentation, Stand 06.04.2023, online unter https://www.larsim.info/dokumentation/LARSIM-Dokumentation.pdf
|
2860
2928
|
The default is (250, 1.5).
|
2861
2929
|
|
2930
|
+
References
|
2931
|
+
----------
|
2932
|
+
.. [2] Stoelzle, Michael & Weiler, Markus & Steinbrich, Andreas. (2016) Starkregengefährdung in Baden-Württemberg – von der Methodenentwicklung zur Starkregenkartierung. Tag der Hydrologie.
|
2933
|
+
.. [3] LARSIM Dokumentation, Stand 06.04.2023, online unter `LARSIM-Dokumentation <https://www.larsim.info/dokumentation/LARSIM-Dokumentation.pdf>`_
|
2934
|
+
|
2862
2935
|
Returns
|
2863
2936
|
-------
|
2864
|
-
|
2865
|
-
|
2937
|
+
list of int
|
2938
|
+
A list of station Ids in order of distance.
|
2939
|
+
The closest station is the first in the list.
|
2866
2940
|
"""
|
2867
2941
|
# define the P1 and P2 default values for T and ET
|
2868
2942
|
return super().get_neighboor_stids(p_elev=p_elev, **kwargs)
|
@@ -20,6 +20,7 @@ from ..utils.dwd import get_dwd_meta, get_cdc_file_list
|
|
20
20
|
from ..station.StationBases import StationBase
|
21
21
|
from ..db import models
|
22
22
|
from ..db.queries.get_quotient import _get_quotient
|
23
|
+
from ..config import config
|
23
24
|
|
24
25
|
# set settings
|
25
26
|
# ############
|
@@ -430,8 +431,8 @@ class StationsBase:
|
|
430
431
|
The timeseries kinds of the denominator or the multi annual raster key.
|
431
432
|
If the denominator is a multi annual raster key, then the result is the quotient of the timeserie and the raster value.
|
432
433
|
Possible values are:
|
433
|
-
|
434
|
-
|
434
|
+
- for timeserie kinds: 'raw', 'qc', 'filled' or for precipitation also "corr".
|
435
|
+
- for raster keys: 'hyras', 'dwd' or 'regnie', depending on your defined raster files.
|
435
436
|
stids : list of Integer
|
436
437
|
The stations IDs for which to compute the quotient.
|
437
438
|
return_as : str, optional
|
@@ -567,7 +568,16 @@ class StationsBase:
|
|
567
568
|
return pbar
|
568
569
|
|
569
570
|
def _run_method(self, stations, method, name, kwds=dict(),
|
570
|
-
do_mp=True,
|
571
|
+
do_mp=True,
|
572
|
+
processes=config.getint(
|
573
|
+
"system:parallel_processes",
|
574
|
+
"absolute",
|
575
|
+
fallback=mp.cpu_count() - \
|
576
|
+
config.getint(
|
577
|
+
"system:parallel_processes",
|
578
|
+
"cpu_count_minus",
|
579
|
+
fallback=1)),
|
580
|
+
**kwargs):
|
571
581
|
"""Run methods of the given stations objects in multiprocessing/threading mode.
|
572
582
|
|
573
583
|
Parameters
|
@@ -589,6 +599,9 @@ class StationsBase:
|
|
589
599
|
processes : int, optional
|
590
600
|
The number of processes that should get started simultaneously.
|
591
601
|
If 1 or less, then the process is computed as a simple loop, so there is no multiprocessing or threading done.
|
602
|
+
There are two possible configuration values in the config file to set the number of processes:
|
603
|
+
- system:parallel_processes:absolute: The absolute number of processes to start.
|
604
|
+
- system:parallel_processes:cpu_count_minus: The number of CPU kernels are substracted by this number, to get the number of processes to start.
|
592
605
|
The default is the cpu count -1.
|
593
606
|
"""
|
594
607
|
log.info(
|
weatherdb/utils/get_data.py
CHANGED
@@ -22,11 +22,11 @@ log = logging.getLogger(__name__)
|
|
22
22
|
def download_ma_rasters(which="all", overwrite=None, update_user_config=False):
|
23
23
|
"""Get the multi annual rasters on which bases the regionalisation is done.
|
24
24
|
|
25
|
-
The refined multi annual datasets, that are downloaded are published on Zenodo [1]_
|
25
|
+
The refined multi annual datasets, that are downloaded are published on Zenodo. [1]_
|
26
26
|
|
27
27
|
References
|
28
28
|
----------
|
29
|
-
.. [1] Schmit, M.; Weiler, M. (2023). German weather services (DWD) multi annual meteorological rasters for the climate period 1991-2020 refined to 25m grid (1.0.0) [Data set]. Zenodo. https://doi.org/10.5281/zenodo.10066045
|
29
|
+
.. [1] Schmit, M.; Weiler, M. (2023). German weather services (DWD) multi annual meteorological rasters for the climate period 1991-2020 refined to 25m grid (1.0.0) [Data set]. Zenodo. `DOI:10.5281/zenodo.10066045 <https://doi.org/10.5281/zenodo.10066045>`_
|
30
30
|
|
31
31
|
Parameters
|
32
32
|
----------
|
@@ -301,7 +301,7 @@ def _download_dem_opentopo(
|
|
301
301
|
extent=(5.3, 46.1, 15.6, 55.4),
|
302
302
|
api_key=os.environ.get(
|
303
303
|
"WEATHERDB_OPENTOPO_API_KEY",
|
304
|
-
|
304
|
+
default=keyring.get_password("weatherdb", "opentopo_api_key"))):
|
305
305
|
"""Download the DEM data from the OpenTopography service.
|
306
306
|
|
307
307
|
Get an API key from (OpenTopography)[https://portal.opentopography.org/] to use this service.
|
@@ -322,6 +322,7 @@ def _download_dem_opentopo(
|
|
322
322
|
The API key for the OpenTopography service.
|
323
323
|
If None the user will be asked.
|
324
324
|
The default is to check if the environment variable "WEATHERDB_OPENTOPO_API_KEY" is set or if the keyring has a password for "weatherdb" and "opentopo_api_key".
|
325
|
+
If the value is a valid filepath the content of the file is used as the API key.
|
325
326
|
|
326
327
|
Returns
|
327
328
|
-------
|
@@ -332,6 +333,9 @@ def _download_dem_opentopo(
|
|
332
333
|
if api_key is None:
|
333
334
|
print("No API key for OpenTopography was given or found in the keyring or environment variable.")
|
334
335
|
api_key = getpass("Please enter your API key for OpenTopography: ")
|
336
|
+
if Path(api_key).exists():
|
337
|
+
with open(api_key) as f:
|
338
|
+
api_key = f.read().strip()
|
335
339
|
|
336
340
|
# make query
|
337
341
|
w, s, e, n = extent
|
@@ -356,14 +360,14 @@ def _download_dem_opentopo(
|
|
356
360
|
log.info(f"Downloaded DEM data from OpenTopography to '{out_fp}'.")
|
357
361
|
return out_fp
|
358
362
|
|
359
|
-
log.error(f"Request to openTopography API with url {r.url.replace(api_key,
|
363
|
+
log.error(f"Request to openTopography API with url {r.url.replace(api_key, '[MASKED]')} returned status code {r.status_code}")
|
360
364
|
|
361
365
|
def download_dem(out_dir=None,
|
362
366
|
overwrite=None,
|
363
367
|
extent=(5.3, 46.1, 15.6, 55.4),
|
364
368
|
update_user_config=False,
|
365
369
|
service=["prism", "openTopography"], **kwargs):
|
366
|
-
"""Download the newest DEM data from the Copernicus Sentinel dataset.
|
370
|
+
"""Download the newest DEM data from the Copernicus Sentinel dataset. [2]_
|
367
371
|
|
368
372
|
Only the GLO-30 DEM, which has a 30m resolution, is downloaded as it is freely available.
|
369
373
|
If you register as a scientific researcher also the EEA-10, with 10 m resolution, is available.
|
@@ -372,8 +376,9 @@ def download_dem(out_dir=None,
|
|
372
376
|
After downloading the data, the files are merged and saved as a single tif file in the data directory in a subfolder called 'DEM'.
|
373
377
|
To use the DEM data in the WeatherDB, you will have to define the path to the tif file in the configuration file.
|
374
378
|
|
375
|
-
|
376
|
-
|
379
|
+
References
|
380
|
+
----------
|
381
|
+
.. [2] Copernicus DEM - Global and European Digital Elevation Model. Digital Surface Model (DSM) provided in 3 different resolutions (90m, 30m, 10m) with varying geographical extent (EEA: European and GLO: global) and varying format (INSPIRE, DGED, DTED). `DOI:10.5270/ESA-c5d3d65 <https://doi.org/10.5270/ESA-c5d3d65>`_ .
|
377
382
|
|
378
383
|
Parameters
|
379
384
|
----------
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: weatherdb
|
3
|
-
Version: 1.1
|
3
|
+
Version: 1.2.1
|
4
4
|
Summary: This is a package to work with and to create the Weather Database which handles, checks, fills and corrects DWD Weather Station data.
|
5
5
|
Author-email: Max Schmit <max.schmit@hydrology.uni-freiburg.de>
|
6
6
|
License: GNU GENERAL PUBLIC LICENSE
|
@@ -1,34 +1,52 @@
|
|
1
1
|
docker/Dockerfile,sha256=AmSjZsQHA3-XANZz8RiH0B5skIlF7MXCNiy8yIzZXr4,1051
|
2
|
-
docker/docker-compose.yaml,sha256=
|
2
|
+
docker/docker-compose.yaml,sha256=ezHqCUib83b5cbfbSy0fsrg0xl2iufp6diItsctJbRM,1719
|
3
3
|
docker/docker-compose_test.yaml,sha256=LTCehPG6Oid-ri7kcPBMzXzeJBqYC-zXTs_i6XOkSyQ,931
|
4
4
|
docker/start-docker-test.sh,sha256=8ue4LfoUrZU8inEZhNjsSDqucoN73Kn1cC3--lUPqTo,222
|
5
5
|
docs/requirements.txt,sha256=gVqMWeiE0PAEz41NGrLwgzx1WUGuEIE7sfPLkFV4vU4,141
|
6
6
|
docs/source/Changelog.md,sha256=5SUQr5KRoe5BUCsEM5IMXV7ryKwjp3_gDukYZP5i_9I,33
|
7
7
|
docs/source/License.rst,sha256=BhhDehmlauu1zhoPc2tqYM2SNhgns67tmpFnA64scXQ,79
|
8
|
-
docs/source/Methode.md,sha256=
|
9
|
-
docs/source/conf.py,sha256=
|
8
|
+
docs/source/Methode.md,sha256=rhnfAjbn_xSz7rjOSnJC-9_LmmbiiP1DYrlLDmQ_XV0,18716
|
9
|
+
docs/source/conf.py,sha256=plhE9qI_QUc6zewvKep9-TwFT1zDUiIK5v6hnDqdldU,3774
|
10
10
|
docs/source/index.rst,sha256=ByYiqrC2n_FO3zWpq-zfXUzxdcNLs4EQ38hlhXiU_z0,1832
|
11
11
|
docs/source/_static/custom.css,sha256=FgPX621XaAYw41aiF6nWU6T6snJA42WLiCpe3ziYcQA,161
|
12
12
|
docs/source/_static/favicon.ico,sha256=aie4tcqqOisNg8vHIyEDYrzQE8vwcxVG5_rjq-mxUPM,3262
|
13
13
|
docs/source/_static/logo.png,sha256=6gg2g1aeGF_j5GOXR9i-4UjWZ-uEiqKidMENmFHKtNE,6073
|
14
14
|
docs/source/api/api.rst,sha256=kOiT9-3LGkYR6IJ2LwPaVfEclS5K_pBgbIxGrq09_Bg,251
|
15
15
|
docs/source/api/cli.rst,sha256=EzwCHyg0tK6284v_gWPWFogwhhnxlmUhYNcogWSWCu8,153
|
16
|
-
docs/source/api/
|
16
|
+
docs/source/api/weatherdb.broker.rst,sha256=qX-srGa6M8Bz_N5Q7tRoOqyoLP_X8Batsgrdwd_hjQ4,57
|
17
17
|
docs/source/api/weatherdb.config.rst,sha256=ZXlRZZgxpihqI20adHzyYhHCRq1DItIJgDJrEgLVu4E,148
|
18
|
-
docs/source/api/weatherdb.db.rst,sha256=
|
19
|
-
docs/source/api/weatherdb.rst,sha256=
|
20
|
-
docs/source/api/weatherdb.station.rst,sha256=
|
21
|
-
docs/source/api/weatherdb.
|
22
|
-
docs/source/api/weatherdb.
|
18
|
+
docs/source/api/weatherdb.db.rst,sha256=R42Xjq8vumUcC4cgBjW3LdryatiZOeKXzaMTrhf1YWs,532
|
19
|
+
docs/source/api/weatherdb.rst,sha256=SDM6tfQV1XJ6N4wQXuR-91m_pan-_Ci4BVV9GXZPD78,319
|
20
|
+
docs/source/api/weatherdb.station.GroupStation.rst,sha256=paukwOe25pt7ddKlpY19qF0fUT7XaVQy0tGZRHcimoY,106
|
21
|
+
docs/source/api/weatherdb.station.StationBases.rst,sha256=1ni2YbUuo4MMdZzmvr1ec5JLPuL8RfOL-AOWhWlMJzA,504
|
22
|
+
docs/source/api/weatherdb.station.StationET.rst,sha256=adfhyCvFbeUstNQaEKRDbSKnyMwUTUp0JIk1TaQUumw,97
|
23
|
+
docs/source/api/weatherdb.station.StationP.rst,sha256=7bcKSCVO13MeJXK914_yYdZsWt0KO3Bo4Xz1LMnuIVQ,94
|
24
|
+
docs/source/api/weatherdb.station.StationPD.rst,sha256=APTTuGAqUByM0ZMiRn4VZHlmAsu01SdIFTGgF9P7VbY,182
|
25
|
+
docs/source/api/weatherdb.station.StationT.rst,sha256=BmGDdbWhvGk4z3ol0Asmh8sjaaVGPQwZyHCYTAr4OoA,94
|
26
|
+
docs/source/api/weatherdb.station.rst,sha256=QcZkzrs2ZWjKxj11j62O0-UhNYecCnVTXlLpyy3x1S4,290
|
27
|
+
docs/source/api/weatherdb.stations.StationsBase.rst,sha256=r4VMDCYAGOFxNqktTsv47vFDQYtXViSrfvi6JA9a2As,424
|
28
|
+
docs/source/api/weatherdb.stations.StationsET.rst,sha256=g-z-RwzsTl-LNJIsmV05bqLDggRjwd9DO16al1_mt24,103
|
29
|
+
docs/source/api/weatherdb.stations.StationsP.rst,sha256=txit7SAn5YurLTsWMlubGyZxps-hA76ZXTv6c0GGr-o,99
|
30
|
+
docs/source/api/weatherdb.stations.StationsPD.rst,sha256=I_qGiuP_kWheS7xQ-wTk70DckrqcBnFrU-V6rarWJn8,103
|
31
|
+
docs/source/api/weatherdb.stations.StationsT.rst,sha256=WrC2rsEh7WWE4TMjzvPblSHOv6o_IGWkPFnGXX9FOGc,101
|
32
|
+
docs/source/api/weatherdb.stations.rst,sha256=zF6bbx7hupKzaSbYGOF7ZeHRcJOjk9a5A2FMYXetiXw,300
|
33
|
+
docs/source/api/weatherdb.utils.rst,sha256=uinSSO55lVv9j8rJbfa30a35dK4FMVlLm5HlOowVe_0,430
|
23
34
|
docs/source/setup/Configuration.md,sha256=qtJ-gvXmaVfp_ldBMv60YaKENtoGb-L5HHc7rb9MaZQ,4340
|
24
35
|
docs/source/setup/Hosting.md,sha256=4CUOgonpPhG-cPihrEsN3Z31rRKGWYeizg1QUhETmLw,105
|
25
36
|
docs/source/setup/Install.md,sha256=IdmycMBztQFs_FAqfiU1OxtN2ihGXfIqwW4KBnsG_Iw,1265
|
26
|
-
docs/source/setup/Quickstart.md,sha256=
|
37
|
+
docs/source/setup/Quickstart.md,sha256=suk3QweF4pQREBisXtLP0EJukInQePH0jWvwzY--D5U,7147
|
27
38
|
docs/source/setup/setup.rst,sha256=bOmfcf-n9iivxbaBWk5t0nmiIc87bks_BMIJ1d6UHOM,258
|
39
|
+
tests/test-data/test-data-config.ini,sha256=XC1dho-dQglFhQCXWHtZRUuQLKjeOmjH4W0j0UumgoE,717
|
40
|
+
tests/test-data/DEM/COP-DEM_GLO-30-DGED__2023_1_clipped.tif,sha256=6JJpOHf-cDzBaTn6BIWkmroiuW9P8g9SLGfC2h7xCyk,35433174
|
41
|
+
tests/test-data/DEM/README.md,sha256=tnvGke8KzWFm3TKGbdCqajBJ4MbcRFZ0wv875x0_EMM,137
|
42
|
+
tests/test-data/DEM/eula_F.pdf,sha256=MgSZFMN_FOfVO0jRPXSknnfAMCNuKsx6DfQm-TRP66I,117522
|
43
|
+
tests/test-data/regionalisation/DWD-grid_ma_1991_2020_DGM25_clipped.tif,sha256=82r1UEYAjA6YzMC32ByZGHQFoYm1zcSajhKFtPjTqMw,2931290
|
44
|
+
tests/test-data/regionalisation/HYRAS_ma_1991_2020_DGM25_clipped.tif,sha256=HiSmi715dUpryQ1WSLSXR7GmGPHzK0rl6WOOrwjRwXw,2116377
|
45
|
+
tests/test-data/regionalisation/README.md,sha256=equFOPJVaESGKIK1ZPVEJHY4TEqkW3NpJOFQzjsBy7M,151
|
28
46
|
weatherdb/__init__.py,sha256=2BzziScTYzA65WS6nhtCRZOWSLfwHTCwvZdeyuHw79U,846
|
29
|
-
weatherdb/_version.py,sha256=
|
30
|
-
weatherdb/broker.py,sha256=
|
31
|
-
weatherdb/cli.py,sha256=
|
47
|
+
weatherdb/_version.py,sha256=aFv1WGaOhOg9bRuL25OuA7ozD3PSckRRpjaC84FZ7uo,21
|
48
|
+
weatherdb/broker.py,sha256=qJaKVwo1zcTLKmP-sF_DMod6_7jVsdHEoiKEMvsPx9A,24842
|
49
|
+
weatherdb/cli.py,sha256=oZFQVteBjxI1tEK37CEO-8mJd9PQ7I-rHEI-kIl4T_A,11295
|
32
50
|
weatherdb/alembic/README.md,sha256=6hq24TPr8z3nqJCaqrmj6__kLikVG66kLGqfC_aFPWQ,440
|
33
51
|
weatherdb/alembic/alembic.ini,sha256=Mc3-qkQfA42ApX9douZT77g1pWE9gn4oMVJEDoebmdQ,3087
|
34
52
|
weatherdb/alembic/config.py,sha256=Q4aolMUUT7f6VmbY0uz_dWBtKkj3KgTUs_xOY_Gbzjw,264
|
@@ -40,7 +58,7 @@ weatherdb/alembic/versions/V1.0.5_fix-ma-raster-values.py,sha256=EvJ_JLLJKUN5YXw
|
|
40
58
|
weatherdb/alembic/versions/V1.0.6_update-views.py,sha256=ZA7cK5yeAqivFG2V8O7mvyKSkGRlphVOs0qKpBYgYKE,420
|
41
59
|
weatherdb/config/ConfigParser.py,sha256=UEJlpeZSggG93C3MjpaNGpqKe_Ks6Jg6g5CjnhKCrpY,27978
|
42
60
|
weatherdb/config/__init__.py,sha256=JBNlYPT43JnO8XMI8HTtg2hyA7C_JnMdtWmJ2vAtNZ8,85
|
43
|
-
weatherdb/config/config_default.ini,sha256=
|
61
|
+
weatherdb/config/config_default.ini,sha256=5DQzOqOJ9EVRAu9IA_EO4c8aqnuUvTmocwidOhLLXbY,7884
|
44
62
|
weatherdb/db/__init__.py,sha256=g6F66XR6UPz41kPtSRc1qvDoOEZ5OawYxYtYXCgZ06s,76
|
45
63
|
weatherdb/db/connections.py,sha256=mxArp79JOLTYYNB9fZEIspwcpdRZoxYWfQXh2Sq9ATw,14097
|
46
64
|
weatherdb/db/models.py,sha256=6Oor07T1sAD6qEtoxwEcpmY1SkLVVONChXIIcTjbUk4,15242
|
@@ -48,7 +66,7 @@ weatherdb/db/views.py,sha256=DxY_IIonmiiRM-IhQrUMLwj12gIg6Q30rQAmR3wP3BE,6359
|
|
48
66
|
weatherdb/db/fixtures/RichterParameters.json,sha256=CKxrB5FBX_BRKqxegXNyNtn9DUKmgibUtdvHoE8E5JI,836
|
49
67
|
weatherdb/db/queries/get_quotient.py,sha256=9wVFmXE8tk8igGj-Xk5uSI0eiF_PQ9d-yRq7RJpvMAA,6787
|
50
68
|
weatherdb/station/GroupStation.py,sha256=XAovs-zK5mZmJuvNJ3iCgpWH-1yWHL0axtygYu1mVi0,30292
|
51
|
-
weatherdb/station/StationBases.py,sha256=
|
69
|
+
weatherdb/station/StationBases.py,sha256=1XylC_k2ZCSJf3-xs4SBE-JSfwrlZWzn1N154S0KzgU,130330
|
52
70
|
weatherdb/station/StationET.py,sha256=hM6K8fCLC6mOLaE4cN92LHOyPGP01ifO6l2qO77I_bA,3621
|
53
71
|
weatherdb/station/StationP.py,sha256=ENmWqEFwKR1WFsWmZ8-webEGTmrxODan8QO0gwIDDIU,32719
|
54
72
|
weatherdb/station/StationPD.py,sha256=Bcg_uQTgIQPffsMGhNEwKAXhYs1Ii4VeB75afdFG-Kk,3367
|
@@ -56,7 +74,7 @@ weatherdb/station/StationT.py,sha256=-T1GKfUsvulm5c_-JufJ34H048fGlG21UF0_2z1dd9A
|
|
56
74
|
weatherdb/station/__init__.py,sha256=v1sPfmhhLRMOr5DJ2c5BLIFY7GWkP5iMLA5vtZm-osg,591
|
57
75
|
weatherdb/station/constants.py,sha256=vtdhgcK8A2cJaknT6qI8w5tAh_Hb5i2SvxxtHZOPyVc,511
|
58
76
|
weatherdb/stations/GroupStations.py,sha256=442gPqx0lKcOaqThffNIhJqrmDMI37DX1d_EHsfJzvM,21569
|
59
|
-
weatherdb/stations/StationsBase.py,sha256=
|
77
|
+
weatherdb/stations/StationsBase.py,sha256=M7VyWJgUmIygJ2rByQy0Zz6RKsaDVT8-iaXzhPTa_b4,42991
|
60
78
|
weatherdb/stations/StationsBaseTET.py,sha256=CuE5gXAF4eS4bHorI-sUqksm0jdj9SzAiOHtc4vv7aA,1032
|
61
79
|
weatherdb/stations/StationsET.py,sha256=OjyEaEK0nPJ9txRfUbHfW9bEEx5HAISWmnk5F4GBs7I,433
|
62
80
|
weatherdb/stations/StationsP.py,sha256=51wMu5y4jscfSv2fqvswOqB1LBRX5b9XDGvekXUxQ4w,4993
|
@@ -67,11 +85,11 @@ weatherdb/utils/TimestampPeriod.py,sha256=6whEr2FLoHC-ldpMg9wW27ELEse5RW6dvaZ84M
|
|
67
85
|
weatherdb/utils/__init__.py,sha256=siIvJT8lKLVvtdvWMpY3F9_h72Ky2d71DEdRGMWud5M,85
|
68
86
|
weatherdb/utils/dwd.py,sha256=amEVVPLzXTSScBP5VAK35dBxuiy-Ua4hHyKnDGxD_4Q,12394
|
69
87
|
weatherdb/utils/geometry.py,sha256=Od-RDAW1MASVAsGBXpHti9osbVJDqUbumSKBSJPbQqc,1823
|
70
|
-
weatherdb/utils/get_data.py,sha256=
|
88
|
+
weatherdb/utils/get_data.py,sha256=62wV37fuzGhC2fLSCL7JyyMd3BAiRiimIhV95-mEROU,17294
|
71
89
|
weatherdb/utils/logging.py,sha256=iaWnzCdBYxFmzWgLq9a6VAeBMdwy-rnt2d9PSAQq4lA,4242
|
72
|
-
weatherdb-1.1.
|
73
|
-
weatherdb-1.1.
|
74
|
-
weatherdb-1.1.
|
75
|
-
weatherdb-1.1.
|
76
|
-
weatherdb-1.1.
|
77
|
-
weatherdb-1.1.
|
90
|
+
weatherdb-1.2.1.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
|
91
|
+
weatherdb-1.2.1.dist-info/METADATA,sha256=5auMHq9HFkOsckfAF-JKxImQ3v-a93_lm023SiGsTMk,44266
|
92
|
+
weatherdb-1.2.1.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
93
|
+
weatherdb-1.2.1.dist-info/entry_points.txt,sha256=kJemTd9Cm_QWPZt03KUWhpn1aB0-l_5ce6Ms3EoS_NM,55
|
94
|
+
weatherdb-1.2.1.dist-info/top_level.txt,sha256=kLlRbXLn0GHvMWmciWRyvm0-FYEy56F6d0fGwfle9-g,28
|
95
|
+
weatherdb-1.2.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|