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.
Files changed (42) hide show
  1. docker/docker-compose.yaml +5 -1
  2. docs/source/Methode.md +5 -1
  3. docs/source/api/weatherdb.broker.rst +7 -0
  4. docs/source/api/weatherdb.db.rst +10 -0
  5. docs/source/api/weatherdb.rst +0 -1
  6. docs/source/api/weatherdb.station.GroupStation.rst +5 -0
  7. docs/source/api/weatherdb.station.StationBases.rst +18 -0
  8. docs/source/api/weatherdb.station.StationET.rst +5 -0
  9. docs/source/api/weatherdb.station.StationP.rst +5 -0
  10. docs/source/api/weatherdb.station.StationPD.rst +6 -0
  11. docs/source/api/weatherdb.station.StationT.rst +5 -0
  12. docs/source/api/weatherdb.station.rst +11 -50
  13. docs/source/api/weatherdb.stations.StationsBase.rst +15 -0
  14. docs/source/api/weatherdb.stations.StationsET.rst +6 -0
  15. docs/source/api/weatherdb.stations.StationsP.rst +6 -0
  16. docs/source/api/weatherdb.stations.StationsPD.rst +7 -0
  17. docs/source/api/weatherdb.stations.StationsT.rst +7 -0
  18. docs/source/api/weatherdb.stations.rst +10 -41
  19. docs/source/api/weatherdb.utils.rst +2 -0
  20. docs/source/conf.py +3 -0
  21. docs/source/setup/Quickstart.md +2 -1
  22. tests/test-data/DEM/COP-DEM_GLO-30-DGED__2023_1_clipped.tif +0 -0
  23. tests/test-data/DEM/README.md +3 -0
  24. tests/test-data/DEM/eula_F.pdf +0 -0
  25. tests/test-data/regionalisation/DWD-grid_ma_1991_2020_DGM25_clipped.tif +0 -0
  26. tests/test-data/regionalisation/HYRAS_ma_1991_2020_DGM25_clipped.tif +0 -0
  27. tests/test-data/regionalisation/README.md +3 -0
  28. tests/test-data/test-data-config.ini +28 -0
  29. weatherdb/_version.py +1 -1
  30. weatherdb/broker.py +12 -2
  31. weatherdb/cli.py +20 -5
  32. weatherdb/config/config_default.ini +30 -1
  33. weatherdb/station/StationBases.py +91 -17
  34. weatherdb/stations/StationsBase.py +16 -3
  35. weatherdb/utils/get_data.py +12 -7
  36. {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/METADATA +1 -1
  37. {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/RECORD +41 -23
  38. {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/WHEEL +1 -1
  39. {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/top_level.txt +1 -0
  40. docs/source/api/weatherDB.broker.rst +0 -10
  41. {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/LICENSE +0 -0
  42. {weatherdb-1.1.2.dist-info → weatherdb-1.2.1.dist-info}/entry_points.txt +0 -0
@@ -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 ther weatherdb service use `docker-compose exec weatherdb bash`
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 100 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.
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
 
@@ -0,0 +1,7 @@
1
+ broker
2
+ ------
3
+
4
+ .. autoclass:: weatherdb.broker.Broker
5
+
6
+
7
+
@@ -19,5 +19,15 @@ base models
19
19
 
20
20
  .. autoclass:: weatherdb.db.models.MetaBaseQC
21
21
 
22
+ views
23
+ -----
22
24
 
25
+ Those are the database views
26
+
27
+ .. automodule:: weatherdb.db.views
28
+
29
+ connections
30
+ -----------
31
+
32
+ .. automodule:: weatherdb.db.connections
23
33
 
@@ -1,7 +1,6 @@
1
1
  weatherdb
2
2
  =========
3
3
 
4
-
5
4
  .. toctree::
6
5
  :maxdepth: 2
7
6
 
@@ -0,0 +1,5 @@
1
+ GroupStation
2
+ ============
3
+
4
+ .. py:module:: weatherdb.station
5
+ .. autoclass:: weatherdb.station.GroupStation
@@ -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
@@ -0,0 +1,5 @@
1
+ StationET
2
+ =========
3
+
4
+ .. py:module:: weatherdb.station
5
+ .. autoclass:: weatherdb.station.StationET
@@ -0,0 +1,5 @@
1
+ StationP
2
+ ========
3
+
4
+ .. py:module:: weatherdb.station
5
+ .. autoclass:: weatherdb.station.StationP
@@ -0,0 +1,6 @@
1
+ StationPD
2
+ =========
3
+
4
+ .. py:module:: weatherdb.station
5
+ .. autoclass:: weatherdb.station.StationPD
6
+ :exclude-members: quality_check, last_imp_quality_check, get_corr, get_adj, get_qc
@@ -0,0 +1,5 @@
1
+ StationT
2
+ ========
3
+
4
+ .. py:module:: weatherdb.station
5
+ .. autoclass:: weatherdb.station.StationT
@@ -1,56 +1,17 @@
1
1
  station
2
- -------
3
- .. module:: weatherdb.station
2
+ --------
4
3
 
5
- StationP
6
- ^^^^^^^^
7
- .. autoclass:: weatherdb.station.StationP
4
+ .. py:module:: weatherdb.station
8
5
 
9
- .. autoclasstoc::
6
+ .. toctree::
7
+ :maxdepth: 1
8
+ :titlesonly:
10
9
 
11
- StationT
12
- ^^^^^^^^
13
- .. autoclass:: weatherdb.station.StationT
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::
@@ -0,0 +1,6 @@
1
+ StationsET
2
+ ==========
3
+
4
+ .. py:module:: weatherdb.stations
5
+
6
+ .. autoclass:: weatherdb.stations.StationsET
@@ -0,0 +1,6 @@
1
+ StationsP
2
+ =========
3
+
4
+ .. py:module:: weatherdb.stations
5
+
6
+ .. autoclass:: weatherdb.stations.StationsP
@@ -0,0 +1,7 @@
1
+ StationsPD
2
+ ==========
3
+
4
+ .. py:module:: weatherdb.stations
5
+
6
+ .. autoclass:: weatherdb.stations.StationsP
7
+
@@ -0,0 +1,7 @@
1
+ StationsT
2
+ =========
3
+
4
+ .. py:module:: weatherdb.stations
5
+
6
+ .. autoclass:: weatherdb.stations.StationsT
7
+
@@ -1,46 +1,15 @@
1
1
  stations
2
2
  --------
3
- .. module:: weatherdb.stations
4
3
 
5
- StationsP
6
- ^^^^^^^^^
7
- .. autoclass:: weatherdb.stations.StationsP
4
+ .. py:module:: weatherdb.stations
8
5
 
9
- .. autoclasstoc::
6
+ .. toctree::
7
+ :maxdepth: 1
8
+ :titlesonly:
10
9
 
11
- StationsT
12
- ^^^^^^^^^
13
- .. autoclass:: weatherdb.stations.StationsT
14
-
15
- .. autoclasstoc::
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
@@ -3,6 +3,8 @@ utils
3
3
 
4
4
  In this module there are several utilities used by the WeatherDB package, you shouldn't need to use them directly.
5
5
 
6
+ TimestampPeriod
7
+ ---------------
6
8
  .. autoclass:: weatherdb.utils.TimestampPeriod
7
9
 
8
10
  dwd
docs/source/conf.py CHANGED
@@ -84,6 +84,9 @@ autoclasstoc_sections = [
84
84
  # Autosummary options
85
85
  autosummary_generate = True
86
86
  autosummary_generate_overwrite = True
87
+ suppress_warnings = [
88
+ 'autosummary.import_cycle',
89
+ ]
87
90
 
88
91
  # intersphinx
89
92
  intersphinx_mapping = {
@@ -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:
@@ -0,0 +1,3 @@
1
+ # Readme
2
+
3
+ The DEM file in this folder originates from Copernicus and got clipped to the region of analysis in the test environment + 40km
Binary file
@@ -0,0 +1,3 @@
1
+ # Readme
2
+
3
+ The files in this folder originate from https://zenodo.org/records/10066045 and got clipped to the region of analysis in the test environment
@@ -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.2"
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
- 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
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
- Source:
140
- 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.
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 = 110000
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
- - for timeserie kinds: 'raw', 'qc', 'filled' or for precipitation also "corr".
1819
- - for raster keys: 'hyras', 'dwd' or 'regnie', depending on your defined raster files.
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
- _type_
2865
- _description_
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
- - for timeserie kinds: 'raw', 'qc', 'filled' or for precipitation also "corr".
434
- - for raster keys: 'hyras', 'dwd' or 'regnie', depending on your defined raster files.
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, processes=mp.cpu_count()-1, **kwargs):
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(
@@ -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
- fallback=keyring.get_password("weatherdb", "opentopo_api_key"))):
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, "[MASKED]")} returned status code {r.status_code}")
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
- Source:
376
- 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.
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.2
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=krm0W_Nj1ZTuyKIr4I4dAfPM0XiM0lZQGhVfmjQIHM0,1568
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=4UyLIEOwAx2ysWNeoSvw5g5ZHjZ_SGeaNo4j_c7f794,18232
9
- docs/source/conf.py,sha256=StlvffI0pTq2R7WhE64cLlS4fi6DXgBuV1YDUgeu2-c,3718
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/weatherDB.broker.rst,sha256=ZkSN7ZB1BccWvJEtpg0-_zOPIUv0C3DVBYdWccwhdOY,119
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=fWNfp0UEqLGy_rr6g2oJEt5rSvHaSdief1mm8X0RX-g,388
19
- docs/source/api/weatherdb.rst,sha256=iECl8UDC1ekg-RhsyjLjUyoxr76DrRg5IzgalJMJcf8,320
20
- docs/source/api/weatherdb.station.rst,sha256=57igu_OrWxTDCyN3pAGw-hOJRvM7dJi3PSePmBH6dps,1103
21
- docs/source/api/weatherdb.stations.rst,sha256=ij3rBivaLTJ7VKAsNMdqCfQBnrupqZCIUoFzyI_wReE,879
22
- docs/source/api/weatherdb.utils.rst,sha256=j4nbIiCxYFtBkzi-jGEiefW4uKYRtSM4xnJHP69mjyE,398
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=NmTvECVOS_uKoyWxgKtwQWHaH87gVFf1_QGGmZ97AZY,7062
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=gtlfDPgq15HdgNzpLyxP5z-pg7TxLdIYeJw2QiTMNWs,21
30
- weatherdb/broker.py,sha256=gA5zWq4RpTJxgvKIzo9Bc5ol3k8JxAZ1BKZGkYCcr80,24474
31
- weatherdb/cli.py,sha256=jS_QNu4k2y7Q3d-iXTkdGP8qAEw2MWmE70wQdxBtqPo,10301
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=f22zLpLVlguotbdENqUarNf-SlYwMjJFwIiXldnfBGc,6453
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=x0MlqHesPVQgijcThWBoIbgM7-_iJQLL86Teab-nlJc,125671
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=orCQ5KSjEOsDcVv73_Ko9QW2Odo4jmledRmJT51tYCw,42308
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=RyRQjgUjnRadGmpu88SKyxOwtkqw9f8qEDe7HJby4LY,16997
88
+ weatherdb/utils/get_data.py,sha256=62wV37fuzGhC2fLSCL7JyyMd3BAiRiimIhV95-mEROU,17294
71
89
  weatherdb/utils/logging.py,sha256=iaWnzCdBYxFmzWgLq9a6VAeBMdwy-rnt2d9PSAQq4lA,4242
72
- weatherdb-1.1.2.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
73
- weatherdb-1.1.2.dist-info/METADATA,sha256=nADh5aUQ2vFhvlFlN_uVWEIyBotUkXpp35KULolqCec,44266
74
- weatherdb-1.1.2.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
75
- weatherdb-1.1.2.dist-info/entry_points.txt,sha256=kJemTd9Cm_QWPZt03KUWhpn1aB0-l_5ce6Ms3EoS_NM,55
76
- weatherdb-1.1.2.dist-info/top_level.txt,sha256=fI1xpTdDzn7NW-aRqQSj_VHgLvfN7wbK8Z1YXMx7ktM,22
77
- weatherdb-1.1.2.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.45.0)
2
+ Generator: bdist_wheel (0.45.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,3 +1,4 @@
1
1
  docker
2
2
  docs
3
+ tests
3
4
  weatherdb
@@ -1,10 +0,0 @@
1
- broker
2
- ------
3
- .. module:: weatherdb.broker
4
-
5
- Broker
6
- ^^^^^^
7
- .. autoclass:: weatherdb.broker.Broker
8
-
9
- .. autoclasstoc::
10
-