weatherdb 1.1.0__py3-none-any.whl
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.
- docker/Dockerfile +30 -0
- docker/docker-compose.yaml +58 -0
- docker/docker-compose_test.yaml +24 -0
- docker/start-docker-test.sh +6 -0
- docs/requirements.txt +10 -0
- docs/source/Changelog.md +2 -0
- docs/source/License.rst +7 -0
- docs/source/Methode.md +161 -0
- docs/source/_static/custom.css +8 -0
- docs/source/_static/favicon.ico +0 -0
- docs/source/_static/logo.png +0 -0
- docs/source/api/api.rst +15 -0
- docs/source/api/cli.rst +8 -0
- docs/source/api/weatherDB.broker.rst +10 -0
- docs/source/api/weatherDB.config.rst +7 -0
- docs/source/api/weatherDB.db.rst +23 -0
- docs/source/api/weatherDB.rst +22 -0
- docs/source/api/weatherDB.station.rst +56 -0
- docs/source/api/weatherDB.stations.rst +46 -0
- docs/source/api/weatherDB.utils.rst +22 -0
- docs/source/conf.py +137 -0
- docs/source/index.rst +33 -0
- docs/source/setup/Configuration.md +127 -0
- docs/source/setup/Hosting.md +9 -0
- docs/source/setup/Install.md +49 -0
- docs/source/setup/Quickstart.md +183 -0
- docs/source/setup/setup.rst +12 -0
- weatherdb/__init__.py +24 -0
- weatherdb/_version.py +1 -0
- weatherdb/alembic/README.md +8 -0
- weatherdb/alembic/alembic.ini +80 -0
- weatherdb/alembic/config.py +9 -0
- weatherdb/alembic/env.py +100 -0
- weatherdb/alembic/script.py.mako +26 -0
- weatherdb/alembic/versions/V1.0.0_initial_database_creation.py +898 -0
- weatherdb/alembic/versions/V1.0.2_more_charachters_for_settings+term_station_ma_raster.py +88 -0
- weatherdb/alembic/versions/V1.0.5_fix-ma-raster-values.py +152 -0
- weatherdb/alembic/versions/V1.0.6_update-views.py +22 -0
- weatherdb/broker.py +667 -0
- weatherdb/cli.py +214 -0
- weatherdb/config/ConfigParser.py +663 -0
- weatherdb/config/__init__.py +5 -0
- weatherdb/config/config_default.ini +162 -0
- weatherdb/db/__init__.py +3 -0
- weatherdb/db/connections.py +374 -0
- weatherdb/db/fixtures/RichterParameters.json +34 -0
- weatherdb/db/models.py +402 -0
- weatherdb/db/queries/get_quotient.py +155 -0
- weatherdb/db/views.py +165 -0
- weatherdb/station/GroupStation.py +710 -0
- weatherdb/station/StationBases.py +3108 -0
- weatherdb/station/StationET.py +111 -0
- weatherdb/station/StationP.py +807 -0
- weatherdb/station/StationPD.py +98 -0
- weatherdb/station/StationT.py +164 -0
- weatherdb/station/__init__.py +13 -0
- weatherdb/station/constants.py +21 -0
- weatherdb/stations/GroupStations.py +519 -0
- weatherdb/stations/StationsBase.py +1021 -0
- weatherdb/stations/StationsBaseTET.py +30 -0
- weatherdb/stations/StationsET.py +17 -0
- weatherdb/stations/StationsP.py +128 -0
- weatherdb/stations/StationsPD.py +24 -0
- weatherdb/stations/StationsT.py +21 -0
- weatherdb/stations/__init__.py +11 -0
- weatherdb/utils/TimestampPeriod.py +369 -0
- weatherdb/utils/__init__.py +3 -0
- weatherdb/utils/dwd.py +350 -0
- weatherdb/utils/geometry.py +69 -0
- weatherdb/utils/get_data.py +285 -0
- weatherdb/utils/logging.py +126 -0
- weatherdb-1.1.0.dist-info/LICENSE +674 -0
- weatherdb-1.1.0.dist-info/METADATA +765 -0
- weatherdb-1.1.0.dist-info/RECORD +77 -0
- weatherdb-1.1.0.dist-info/WHEEL +5 -0
- weatherdb-1.1.0.dist-info/entry_points.txt +2 -0
- weatherdb-1.1.0.dist-info/top_level.txt +3 -0
@@ -0,0 +1,111 @@
|
|
1
|
+
# libraries
|
2
|
+
import logging
|
3
|
+
import sqlalchemy as sa
|
4
|
+
from sqlalchemy import text as sqltxt
|
5
|
+
from functools import cached_property
|
6
|
+
|
7
|
+
from ..db.connections import db_engine
|
8
|
+
from ..db.models import MetaET
|
9
|
+
from .StationBases import StationTETBase
|
10
|
+
|
11
|
+
# set settings
|
12
|
+
# ############
|
13
|
+
__all__ = ["StationET"]
|
14
|
+
log = logging.getLogger(__name__)
|
15
|
+
|
16
|
+
# class definition
|
17
|
+
##################
|
18
|
+
class StationET(StationTETBase):
|
19
|
+
"""A class to work with and download potential Evapotranspiration (VPGB) data for one station."""
|
20
|
+
|
21
|
+
# common settings
|
22
|
+
_MetaModel = MetaET
|
23
|
+
_para = "et"
|
24
|
+
_para_base = _para
|
25
|
+
_para_long = "potential Evapotranspiration"
|
26
|
+
_unit = "mm/Tag"
|
27
|
+
_decimals = 10
|
28
|
+
|
29
|
+
# cdc dwd parameters
|
30
|
+
_ftp_folder_base = ["climate_environment/CDC/derived_germany/soil/daily/"]
|
31
|
+
_ftp_zip_regex_prefix = r".*_v2_"
|
32
|
+
_cdc_date_col = "Datum"
|
33
|
+
_cdc_col_names_imp = ["VPGFAO"]
|
34
|
+
|
35
|
+
# for regionalistaion
|
36
|
+
_ma_terms = ["year"]
|
37
|
+
|
38
|
+
# for the fillup
|
39
|
+
_fillup_max_dist = 100000
|
40
|
+
|
41
|
+
def __init__(self, id, **kwargs):
|
42
|
+
super().__init__(id, **kwargs)
|
43
|
+
self.id_str = str(id)
|
44
|
+
|
45
|
+
@cached_property
|
46
|
+
def _table(self):
|
47
|
+
return sa.table(
|
48
|
+
f"{self.id}_{self._para}",
|
49
|
+
sa.column("timestamp", sa.Date),
|
50
|
+
sa.column("raw", sa.Integer),
|
51
|
+
sa.column("qc", sa.Integer),
|
52
|
+
sa.column("filled", sa.Integer),
|
53
|
+
sa.column("filled_by", sa.SmallInteger),
|
54
|
+
schema="timeseries")
|
55
|
+
|
56
|
+
def _create_timeseries_table(self):
|
57
|
+
"""Create the timeseries table in the DB if it is not yet existing."""
|
58
|
+
sql_add_table = '''
|
59
|
+
CREATE TABLE IF NOT EXISTS timeseries."{stid}_{para}" (
|
60
|
+
timestamp date PRIMARY KEY,
|
61
|
+
raw integer NULL DEFAULT NULL,
|
62
|
+
qc integer NULL DEFAULT NULL,
|
63
|
+
filled integer NULL DEFAULT NULL,
|
64
|
+
filled_by smallint NULL DEFAULT NULL
|
65
|
+
);
|
66
|
+
'''.format(stid=self.id, para=self._para)
|
67
|
+
with db_engine.connect() as con:
|
68
|
+
con.execute(sqltxt(sql_add_table))
|
69
|
+
con.commit()
|
70
|
+
|
71
|
+
def _get_sql_new_qc(self, period):
|
72
|
+
# inversion possible?
|
73
|
+
do_invers = self.get_meta(infos=["stationshoehe"])>800
|
74
|
+
|
75
|
+
sql_nears = self._get_sql_near_median(
|
76
|
+
period=period, only_real=False, add_is_winter=do_invers,
|
77
|
+
extra_cols="raw-nbs_median AS diff")
|
78
|
+
|
79
|
+
sql_null_case = f"""(nears.raw > (nears.nbs_median * 2) AND nears.raw > {3*self._decimals})
|
80
|
+
OR ((nears.raw * 4) < nears.nbs_median AND nears.raw > {2*self._decimals})"""
|
81
|
+
if do_invers:
|
82
|
+
# without inversion
|
83
|
+
sql_null_case = "CASE WHEN (winter) THEN "+\
|
84
|
+
f"((nears.raw * 4) < nears.nbs_median AND nears.raw > {2*self._decimals}) ELSE "+\
|
85
|
+
f"{sql_null_case} END"
|
86
|
+
|
87
|
+
# create sql for new qc
|
88
|
+
sql_new_qc = f"""
|
89
|
+
WITH nears AS ({sql_nears})
|
90
|
+
SELECT
|
91
|
+
timestamp,
|
92
|
+
(CASE WHEN ({sql_null_case}
|
93
|
+
OR (nears.raw < 0)
|
94
|
+
OR (nears.raw > {20*self._decimals}))
|
95
|
+
THEN NULL
|
96
|
+
ELSE nears."raw" END) as qc
|
97
|
+
FROM nears
|
98
|
+
"""
|
99
|
+
|
100
|
+
return sql_new_qc
|
101
|
+
|
102
|
+
def get_adj(self, **kwargs):
|
103
|
+
main_df, adj_df, ma, main_df_tr = super().get_adj(**kwargs)
|
104
|
+
|
105
|
+
# calculate the yearly
|
106
|
+
main_df_y = main_df.groupby(main_df_tr.index.year)\
|
107
|
+
.sum(min_count=345).mean()
|
108
|
+
|
109
|
+
adj_df["adj"] = (main_df * (ma[0] / main_df_y)).round(1)
|
110
|
+
|
111
|
+
return adj_df
|