hydroserverpy 0.3.0__py3-none-any.whl → 0.4.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.
Potentially problematic release.
This version of hydroserverpy might be problematic. Click here for more details.
- hydroserverpy/__init__.py +1 -1
- hydroserverpy/core/endpoints/base.py +44 -31
- hydroserverpy/core/endpoints/data_loaders.py +6 -5
- hydroserverpy/core/endpoints/data_sources.py +6 -5
- hydroserverpy/core/endpoints/datastreams.py +89 -52
- hydroserverpy/core/endpoints/observed_properties.py +36 -18
- hydroserverpy/core/endpoints/processing_levels.py +36 -18
- hydroserverpy/core/endpoints/result_qualifiers.py +37 -19
- hydroserverpy/core/endpoints/sensors.py +37 -19
- hydroserverpy/core/endpoints/things.py +58 -37
- hydroserverpy/core/endpoints/units.py +37 -19
- hydroserverpy/core/schemas/base.py +13 -6
- hydroserverpy/core/schemas/data_loaders.py +6 -4
- hydroserverpy/core/schemas/data_sources.py +73 -56
- hydroserverpy/core/schemas/datastreams.py +101 -70
- hydroserverpy/core/schemas/observed_properties.py +18 -10
- hydroserverpy/core/schemas/processing_levels.py +10 -6
- hydroserverpy/core/schemas/result_qualifiers.py +7 -4
- hydroserverpy/core/schemas/sensors.py +33 -18
- hydroserverpy/core/schemas/things.py +97 -60
- hydroserverpy/core/schemas/units.py +7 -8
- hydroserverpy/core/service.py +31 -17
- hydroserverpy/etl/__init__.py +21 -0
- hydroserverpy/etl/extractors/__init__.py +0 -0
- hydroserverpy/etl/extractors/base.py +13 -0
- hydroserverpy/etl/extractors/ftp_extractor.py +50 -0
- hydroserverpy/etl/extractors/http_extractor.py +84 -0
- hydroserverpy/etl/extractors/local_file_extractor.py +25 -0
- hydroserverpy/etl/hydroserver_etl.py +40 -0
- hydroserverpy/etl/loaders/__init__.py +0 -0
- hydroserverpy/etl/loaders/base.py +13 -0
- hydroserverpy/etl/loaders/hydroserver_loader.py +68 -0
- hydroserverpy/etl/transformers/__init__.py +0 -0
- hydroserverpy/etl/transformers/base.py +52 -0
- hydroserverpy/etl/transformers/csv_transformer.py +88 -0
- hydroserverpy/etl/transformers/json_transformer.py +62 -0
- hydroserverpy/etl/types.py +7 -0
- hydroserverpy/etl_csv/__init__.py +0 -0
- hydroserverpy/{etl/service.py → etl_csv/hydroserver_etl_csv.py} +92 -54
- hydroserverpy/quality/service.py +84 -70
- hydroserverpy-0.4.0.dist-info/METADATA +18 -0
- hydroserverpy-0.4.0.dist-info/RECORD +51 -0
- {hydroserverpy-0.3.0.dist-info → hydroserverpy-0.4.0.dist-info}/WHEEL +1 -1
- hydroserverpy-0.3.0.dist-info/METADATA +0 -18
- hydroserverpy-0.3.0.dist-info/RECORD +0 -36
- /hydroserverpy/{etl → etl_csv}/exceptions.py +0 -0
- {hydroserverpy-0.3.0.dist-info → hydroserverpy-0.4.0.dist-info}/LICENSE +0 -0
- {hydroserverpy-0.3.0.dist-info → hydroserverpy-0.4.0.dist-info}/top_level.txt +0 -0
- {hydroserverpy-0.3.0.dist-info → hydroserverpy-0.4.0.dist-info}/zip-safe +0 -0
hydroserverpy/quality/service.py
CHANGED
|
@@ -20,33 +20,33 @@ from enum import Enum
|
|
|
20
20
|
class TimeUnit(Enum):
|
|
21
21
|
"""Enumeration for time units."""
|
|
22
22
|
|
|
23
|
-
SECOND =
|
|
24
|
-
MINUTE =
|
|
25
|
-
HOUR =
|
|
26
|
-
DAY =
|
|
27
|
-
WEEK =
|
|
28
|
-
MONTH =
|
|
29
|
-
YEAR =
|
|
23
|
+
SECOND = "s"
|
|
24
|
+
MINUTE = "m"
|
|
25
|
+
HOUR = "h"
|
|
26
|
+
DAY = "D"
|
|
27
|
+
WEEK = "W"
|
|
28
|
+
MONTH = "M"
|
|
29
|
+
YEAR = "Y"
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
class FilterOperation(Enum):
|
|
33
33
|
"""Enumeration for filter operations."""
|
|
34
34
|
|
|
35
|
-
LT =
|
|
36
|
-
LTE =
|
|
37
|
-
GT =
|
|
38
|
-
GTE =
|
|
39
|
-
E =
|
|
35
|
+
LT = "LT"
|
|
36
|
+
LTE = "LTE"
|
|
37
|
+
GT = "GT"
|
|
38
|
+
GTE = "GTE"
|
|
39
|
+
E = "E"
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
class Operator(Enum):
|
|
43
43
|
"""Enumeration for mathematical operations."""
|
|
44
44
|
|
|
45
|
-
MULT =
|
|
46
|
-
DIV =
|
|
47
|
-
ADD =
|
|
48
|
-
SUB =
|
|
49
|
-
ASSIGN =
|
|
45
|
+
MULT = "MULT"
|
|
46
|
+
DIV = "DIV"
|
|
47
|
+
ADD = "ADD"
|
|
48
|
+
SUB = "SUB"
|
|
49
|
+
ASSIGN = "ASSIGN"
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
class HydroServerQualityControl:
|
|
@@ -61,15 +61,23 @@ class HydroServerQualityControl:
|
|
|
61
61
|
|
|
62
62
|
datastream_id: Union[UUID, str]
|
|
63
63
|
|
|
64
|
-
def __init__(
|
|
64
|
+
def __init__(
|
|
65
|
+
self, datastream_id: Union[UUID, str], observations: pd.DataFrame
|
|
66
|
+
) -> None:
|
|
65
67
|
|
|
66
|
-
assert
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
assert (
|
|
69
|
+
"timestamp" in observations.columns
|
|
70
|
+
), "Observations must have a 'timestamp' column"
|
|
71
|
+
assert pd.api.types.is_datetime64_any_dtype(
|
|
72
|
+
observations["timestamp"]
|
|
73
|
+
), "Observations 'timestamp' column must be of datetime type"
|
|
69
74
|
|
|
70
|
-
assert
|
|
71
|
-
|
|
72
|
-
|
|
75
|
+
assert (
|
|
76
|
+
"value" in observations.columns
|
|
77
|
+
), "Observations must have a 'value' column"
|
|
78
|
+
assert pd.api.types.is_float_dtype(
|
|
79
|
+
observations["value"]
|
|
80
|
+
), "Observations 'value' column must be of float type"
|
|
73
81
|
|
|
74
82
|
self.datastream_id = str(datastream_id)
|
|
75
83
|
self._df = observations
|
|
@@ -94,7 +102,9 @@ class HydroServerQualityControl:
|
|
|
94
102
|
###################
|
|
95
103
|
|
|
96
104
|
@staticmethod
|
|
97
|
-
def _has_filter(
|
|
105
|
+
def _has_filter(
|
|
106
|
+
data_filter: Dict[str, Union[float, int]], key: FilterOperation
|
|
107
|
+
) -> bool:
|
|
98
108
|
"""
|
|
99
109
|
Checks if a given filter operation exists in the filter dictionary.
|
|
100
110
|
|
|
@@ -106,9 +116,9 @@ class HydroServerQualityControl:
|
|
|
106
116
|
:rtype: bool
|
|
107
117
|
"""
|
|
108
118
|
|
|
109
|
-
return (
|
|
110
|
-
key.value
|
|
111
|
-
|
|
119
|
+
return key.value in data_filter and (
|
|
120
|
+
isinstance(data_filter[key.value], float)
|
|
121
|
+
or isinstance(data_filter[key.value], int)
|
|
112
122
|
)
|
|
113
123
|
|
|
114
124
|
def filter(self, data_filter: Dict[str, Union[float, int]]) -> None:
|
|
@@ -122,24 +132,19 @@ class HydroServerQualityControl:
|
|
|
122
132
|
query = []
|
|
123
133
|
|
|
124
134
|
if self._has_filter(data_filter, FilterOperation.LT):
|
|
125
|
-
query.append(
|
|
126
|
-
f'`value` < {data_filter[FilterOperation.LT.value]}')
|
|
135
|
+
query.append(f"`value` < {data_filter[FilterOperation.LT.value]}")
|
|
127
136
|
|
|
128
137
|
if self._has_filter(data_filter, FilterOperation.LTE):
|
|
129
|
-
query.append(
|
|
130
|
-
f'`value` <= {data_filter[FilterOperation.LTE.value]}')
|
|
138
|
+
query.append(f"`value` <= {data_filter[FilterOperation.LTE.value]}")
|
|
131
139
|
|
|
132
140
|
if self._has_filter(data_filter, FilterOperation.GT):
|
|
133
|
-
query.append(
|
|
134
|
-
f'`value` > {data_filter[FilterOperation.GT.value]}')
|
|
141
|
+
query.append(f"`value` > {data_filter[FilterOperation.GT.value]}")
|
|
135
142
|
|
|
136
143
|
if self._has_filter(data_filter, FilterOperation.GTE):
|
|
137
|
-
query.append(
|
|
138
|
-
f'`value` >= {data_filter[FilterOperation.GTE.value]}')
|
|
144
|
+
query.append(f"`value` >= {data_filter[FilterOperation.GTE.value]}")
|
|
139
145
|
|
|
140
146
|
if self._has_filter(data_filter, FilterOperation.E):
|
|
141
|
-
query.append(
|
|
142
|
-
f'`value` == {data_filter[FilterOperation.E.value]}')
|
|
147
|
+
query.append(f"`value` == {data_filter[FilterOperation.E.value]}")
|
|
143
148
|
|
|
144
149
|
if len(query):
|
|
145
150
|
self._filtered_observations = self._df.query(" | ".join(query))
|
|
@@ -162,9 +167,13 @@ class HydroServerQualityControl:
|
|
|
162
167
|
:rtype: pd.DataFrame
|
|
163
168
|
"""
|
|
164
169
|
|
|
165
|
-
return self.observations[
|
|
170
|
+
return self.observations[
|
|
171
|
+
self._df["timestamp"].diff() > np.timedelta64(time_value, time_unit)
|
|
172
|
+
]
|
|
166
173
|
|
|
167
|
-
def fill_gap(
|
|
174
|
+
def fill_gap(
|
|
175
|
+
self, gap: Tuple[int, str], fill: Tuple[int, str], interpolate_values: bool
|
|
176
|
+
) -> pd.DataFrame:
|
|
168
177
|
"""
|
|
169
178
|
Fills identified gaps in the observations with placeholder values and optionally interpolates the values.
|
|
170
179
|
|
|
@@ -188,8 +197,8 @@ class HydroServerQualityControl:
|
|
|
188
197
|
gap_end_index = gap_row[0]
|
|
189
198
|
gap_start_index = gap_end_index - 1
|
|
190
199
|
|
|
191
|
-
gap_start_date = self._df.iloc[gap_start_index][
|
|
192
|
-
gap_end_date = self._df.iloc[gap_end_index][
|
|
200
|
+
gap_start_date = self._df.iloc[gap_start_index]["timestamp"]
|
|
201
|
+
gap_end_date = self._df.iloc[gap_end_index]["timestamp"]
|
|
193
202
|
|
|
194
203
|
start = gap_start_date + time_gap
|
|
195
204
|
end = gap_end_date
|
|
@@ -210,15 +219,15 @@ class HydroServerQualityControl:
|
|
|
210
219
|
self.interpolate(added_index)
|
|
211
220
|
|
|
212
221
|
# Return the list of points that filled the gaps
|
|
213
|
-
return pd.DataFrame(
|
|
214
|
-
points, columns=['timestamp', 'value']
|
|
215
|
-
)
|
|
222
|
+
return pd.DataFrame(points, columns=["timestamp", "value"])
|
|
216
223
|
|
|
217
224
|
######################################
|
|
218
225
|
# Data point operations
|
|
219
226
|
######################################
|
|
220
227
|
|
|
221
|
-
def add_points(
|
|
228
|
+
def add_points(
|
|
229
|
+
self, points: List[List[Union[str, float]]], index: Optional[List[int]] = None
|
|
230
|
+
) -> None:
|
|
222
231
|
"""
|
|
223
232
|
Adds new points to the observations, optionally at specified indices.
|
|
224
233
|
|
|
@@ -251,8 +260,7 @@ class HydroServerQualityControl:
|
|
|
251
260
|
df1 = self._df.iloc[:idx, :]
|
|
252
261
|
df2 = self._df.iloc[idx:, :]
|
|
253
262
|
|
|
254
|
-
points_df = pd.DataFrame(
|
|
255
|
-
val, columns=['timestamp', 'value'])
|
|
263
|
+
points_df = pd.DataFrame(val, columns=["timestamp", "value"])
|
|
256
264
|
self._df = pd.concat([df1, points_df, df2]).reset_index(drop=True)
|
|
257
265
|
|
|
258
266
|
else:
|
|
@@ -260,17 +268,18 @@ class HydroServerQualityControl:
|
|
|
260
268
|
# data in the DataFrame is pre-sorted.
|
|
261
269
|
|
|
262
270
|
# Create a new dataframe with the points
|
|
263
|
-
points_df = pd.DataFrame(
|
|
264
|
-
points, columns=['timestamp', 'value'])
|
|
271
|
+
points_df = pd.DataFrame(points, columns=["timestamp", "value"])
|
|
265
272
|
|
|
266
273
|
# Concatenate both dataframes. New rows will be at the end.
|
|
267
274
|
self._df = pd.concat([self._df, points_df])
|
|
268
275
|
|
|
269
276
|
# Sort and reset index
|
|
270
|
-
self._df = self._df.sort_values(
|
|
277
|
+
self._df = self._df.sort_values("timestamp")
|
|
271
278
|
self._df.reset_index(drop=True, inplace=True)
|
|
272
279
|
|
|
273
|
-
def change_values(
|
|
280
|
+
def change_values(
|
|
281
|
+
self, index_list: List[int], operator: str, value: Union[int, float]
|
|
282
|
+
) -> None:
|
|
274
283
|
"""
|
|
275
284
|
Changes the values of observations based on the specified operator and value.
|
|
276
285
|
|
|
@@ -299,7 +308,9 @@ class HydroServerQualityControl:
|
|
|
299
308
|
else:
|
|
300
309
|
return x
|
|
301
310
|
|
|
302
|
-
self._df.loc[index_list,
|
|
311
|
+
self._df.loc[index_list, "value"] = self._df.loc[index_list, "value"].apply(
|
|
312
|
+
operation
|
|
313
|
+
)
|
|
303
314
|
|
|
304
315
|
def delete_points(self, index_list: List[int]) -> None:
|
|
305
316
|
"""
|
|
@@ -312,7 +323,9 @@ class HydroServerQualityControl:
|
|
|
312
323
|
self._df.drop(index=index_list, inplace=True)
|
|
313
324
|
self._df.reset_index(drop=True, inplace=True)
|
|
314
325
|
|
|
315
|
-
def shift_points(
|
|
326
|
+
def shift_points(
|
|
327
|
+
self, index_list: List[int], time_value: int, time_unit: str
|
|
328
|
+
) -> None:
|
|
316
329
|
"""
|
|
317
330
|
Shifts the timestamps of the observations at the specified indices by a given time value and unit.
|
|
318
331
|
|
|
@@ -328,8 +341,10 @@ class HydroServerQualityControl:
|
|
|
328
341
|
condition = self._df.index.isin(index_list)
|
|
329
342
|
|
|
330
343
|
# Apply the shift
|
|
331
|
-
self._df.loc[condition,
|
|
332
|
-
|
|
344
|
+
self._df.loc[condition, "timestamp"] = (
|
|
345
|
+
self._df.loc[condition, "timestamp"] + shift_value
|
|
346
|
+
)
|
|
347
|
+
self._df = self._df.sort_values("timestamp")
|
|
333
348
|
self._df.reset_index(drop=True, inplace=True)
|
|
334
349
|
|
|
335
350
|
def interpolate(self, index_list: List[int]) -> None:
|
|
@@ -341,8 +356,8 @@ class HydroServerQualityControl:
|
|
|
341
356
|
"""
|
|
342
357
|
|
|
343
358
|
condition = self._df.index.isin(index_list)
|
|
344
|
-
self._df[
|
|
345
|
-
self._df[
|
|
359
|
+
self._df["value"].mask(condition, inplace=True)
|
|
360
|
+
self._df["value"].interpolate(method="linear", inplace=True)
|
|
346
361
|
|
|
347
362
|
def drift_correction(self, start: int, end: int, gap_width: float) -> pd.DataFrame:
|
|
348
363
|
"""
|
|
@@ -360,32 +375,31 @@ class HydroServerQualityControl:
|
|
|
360
375
|
|
|
361
376
|
# validate range
|
|
362
377
|
if start >= end:
|
|
363
|
-
print(
|
|
378
|
+
print("Start and end index cannot overlap")
|
|
364
379
|
return self._df
|
|
365
380
|
elif end > len(self._df) - 1:
|
|
366
|
-
print(
|
|
381
|
+
print("End index out of range")
|
|
367
382
|
return self._df
|
|
368
383
|
elif start < 0:
|
|
369
|
-
print(
|
|
384
|
+
print("Start index must be greater than or equal to 0")
|
|
370
385
|
return self._df
|
|
371
386
|
|
|
372
|
-
points = self._df.iloc[start:end + 1]
|
|
373
|
-
start_date = points.iloc[0][
|
|
374
|
-
end_date = points.iloc[-1][
|
|
387
|
+
points = self._df.iloc[start : end + 1]
|
|
388
|
+
start_date = points.iloc[0]["timestamp"]
|
|
389
|
+
end_date = points.iloc[-1]["timestamp"]
|
|
375
390
|
|
|
376
391
|
x_l = (end_date - start_date).total_seconds()
|
|
377
392
|
ndv = -9999
|
|
378
393
|
# y_n = y_0 + G(x_i / x_l)
|
|
379
394
|
|
|
380
395
|
def f(row):
|
|
381
|
-
if row[
|
|
382
|
-
return (
|
|
383
|
-
row[
|
|
384
|
-
(gap_width * ((row['timestamp'] - start_date).total_seconds() / x_l))
|
|
396
|
+
if row["value"] != ndv:
|
|
397
|
+
return row["value"] + (
|
|
398
|
+
gap_width * ((row["timestamp"] - start_date).total_seconds() / x_l)
|
|
385
399
|
)
|
|
386
400
|
else:
|
|
387
|
-
return row[
|
|
401
|
+
return row["value"]
|
|
388
402
|
|
|
389
|
-
self._df.loc[points.index,
|
|
403
|
+
self._df.loc[points.index, "value"] = points.apply(f, axis=1)
|
|
390
404
|
|
|
391
405
|
return self._df
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: hydroserverpy
|
|
3
|
+
Version: 0.4.0
|
|
4
|
+
Requires-Python: <4,>=3.9
|
|
5
|
+
License-File: LICENSE
|
|
6
|
+
Requires-Dist: requests>=2
|
|
7
|
+
Requires-Dist: pydantic>=2.6
|
|
8
|
+
Requires-Dist: pandas>=2.2
|
|
9
|
+
Requires-Dist: numpy>=2.0
|
|
10
|
+
Requires-Dist: pyyaml>=5
|
|
11
|
+
Requires-Dist: simplejson>=3
|
|
12
|
+
Requires-Dist: crontab>=1
|
|
13
|
+
Requires-Dist: python-dateutil>=2.8.2
|
|
14
|
+
Requires-Dist: croniter>=2.0.1
|
|
15
|
+
Requires-Dist: country-list>=1.1.0
|
|
16
|
+
Requires-Dist: jmespath>=1.0.1
|
|
17
|
+
Provides-Extra: docs
|
|
18
|
+
Requires-Dist: sphinx_autodoc_typehints; extra == "docs"
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
hydroserverpy/__init__.py,sha256=6DIpIX9JiKm5FFHCvT6HdLN3sNkwXIf-fDPeLG6OM8c,231
|
|
2
|
+
hydroserverpy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
+
hydroserverpy/core/service.py,sha256=L5klm7KfmcgjNJChh7ZrHA0xeLS78Yy2S2pWdhtS6H0,5356
|
|
4
|
+
hydroserverpy/core/endpoints/__init__.py,sha256=SpN1WLX0R8HOLHBv1cp3VZcIEiKD4BBbgFGQppdA_mw,404
|
|
5
|
+
hydroserverpy/core/endpoints/base.py,sha256=1LKmlMqki0wPsZfo78Fmjo-t_N-3EXbMSOd7m0rGjxI,5088
|
|
6
|
+
hydroserverpy/core/endpoints/data_loaders.py,sha256=L2-smADgOIsUTfh6KS8ty6JQgvad7flPWzrydE_ptf8,3022
|
|
7
|
+
hydroserverpy/core/endpoints/data_sources.py,sha256=lBximQw-UkCkix_ESx2QuwLeO3eIT9GWw23LsmvzslY,3020
|
|
8
|
+
hydroserverpy/core/endpoints/datastreams.py,sha256=k1o5y-WdKjFqGd3pZv46_vd8cOLzlNrJmK5Roo3dkIc,7651
|
|
9
|
+
hydroserverpy/core/endpoints/observed_properties.py,sha256=p_vQUxJE58-YDu1bt3n854vGoNr0yK66G_3fqh3flgo,3512
|
|
10
|
+
hydroserverpy/core/endpoints/processing_levels.py,sha256=sy89Lgdr3kdXCq9W6nqM-_BCBqVmU5TQ5rcF91j-KlU,3489
|
|
11
|
+
hydroserverpy/core/endpoints/result_qualifiers.py,sha256=VHImVsoqylnW4kpziKueDBxguVixoKVIp7O1wo3v2fw,3504
|
|
12
|
+
hydroserverpy/core/endpoints/sensors.py,sha256=vF4p2I-7UioDEbIBfHrTgDtznI7ANTRJtgdQiyQ2RbQ,3325
|
|
13
|
+
hydroserverpy/core/endpoints/things.py,sha256=KOlea2LxXd2qoeZafnsixNDOHdZZsG2AYIHGdfzfPNE,8597
|
|
14
|
+
hydroserverpy/core/endpoints/units.py,sha256=HKgAlyC5kKi4GgnzxvHKnQcwth1IGBsImq1wFG3eV8M,3287
|
|
15
|
+
hydroserverpy/core/schemas/__init__.py,sha256=gUFAim1jcUWAvj0IqpR8UKaCdXT1v11SmFnOzEmcwJM,353
|
|
16
|
+
hydroserverpy/core/schemas/base.py,sha256=weVvt4b3csRVDXUl6dT5v5B_ujijA8nm69BNpJNEtSI,3720
|
|
17
|
+
hydroserverpy/core/schemas/data_loaders.py,sha256=1EdZqXaHUqamh6IHguakdPzkkaEMHhcqq12EnEJv_sY,2487
|
|
18
|
+
hydroserverpy/core/schemas/data_sources.py,sha256=T23nB8xlyu7X59EHjf4k4p7QEvcGk3MMK5_LL2sJV2Q,8262
|
|
19
|
+
hydroserverpy/core/schemas/datastreams.py,sha256=eUU9KqeBxL6y3_l7rlKysNpdzqPVOCLBjVPiruYb8Gw,11782
|
|
20
|
+
hydroserverpy/core/schemas/observed_properties.py,sha256=cT7SLtSXv52ywUjeWl5x7p0S0LqmwXGo2y4nQ2YjFEo,1230
|
|
21
|
+
hydroserverpy/core/schemas/processing_levels.py,sha256=zJ-yOgUQaLjY4N1oahRWetI2BMY0ot7OC0826gjiVus,902
|
|
22
|
+
hydroserverpy/core/schemas/result_qualifiers.py,sha256=ONKs4Cry9YqnOH3JFyDyBVfOTv9k3iXR_D3xlJ1mWrE,748
|
|
23
|
+
hydroserverpy/core/schemas/sensors.py,sha256=1sGlAOs97zaN-oId227EQlsNipu9vwA_RufrymESP-Q,1963
|
|
24
|
+
hydroserverpy/core/schemas/things.py,sha256=q9xAv_-A6aVRP8dNutFU4gDhrS4mN4FrcTA9-gfjEGo,11489
|
|
25
|
+
hydroserverpy/core/schemas/units.py,sha256=TmSez08JadMa5se8_1egG9oKdyG-tV4PZn5JGKEDAho,819
|
|
26
|
+
hydroserverpy/etl/__init__.py,sha256=qK2m4LZl8czR3VE8SxrlipSy5tLGLNB60lxD7dD0GjU,659
|
|
27
|
+
hydroserverpy/etl/hydroserver_etl.py,sha256=FSdvM3T7QHEWWulWRT8t-FMHSxAGB4GvleUXtSk5IWc,1507
|
|
28
|
+
hydroserverpy/etl/types.py,sha256=4PY3CM-uoXIsf2lhcqtLC6HaRGXe7HKGDU22R8-H35c,135
|
|
29
|
+
hydroserverpy/etl/extractors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
|
+
hydroserverpy/etl/extractors/base.py,sha256=GZKJfAhfJedRcNagnoqUiDZn286r-JzM7dW_F1dWsfY,275
|
|
31
|
+
hydroserverpy/etl/extractors/ftp_extractor.py,sha256=5LwvHuvLk6LwRSVyE9EkV3DPgVlAvRrOBpl1a8B7dLg,1387
|
|
32
|
+
hydroserverpy/etl/extractors/http_extractor.py,sha256=-duQwnsFBk4NQS2qhO55evcCUOnrBe3JX_LU9RyysX4,2709
|
|
33
|
+
hydroserverpy/etl/extractors/local_file_extractor.py,sha256=T_Y9NTO0cC5L9mDPbIG6wYlXDQoatg8MobP97liFl4U,692
|
|
34
|
+
hydroserverpy/etl/loaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
|
+
hydroserverpy/etl/loaders/base.py,sha256=DrA9u7SNBxkPKqaszlP368yNbxihdqIGzP8rA6NAp6U,295
|
|
36
|
+
hydroserverpy/etl/loaders/hydroserver_loader.py,sha256=8BMsSKAL1YHSCeO4hgbFkX47QmFiI4mGgSomykw5Whk,2562
|
|
37
|
+
hydroserverpy/etl/transformers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
38
|
+
hydroserverpy/etl/transformers/base.py,sha256=237oVBhS3HQ3fcE4bZT5U1437WzV2x5kOFC229DY53M,1741
|
|
39
|
+
hydroserverpy/etl/transformers/csv_transformer.py,sha256=9DKSO4NfUUDlr_c6UnH4AU3-7LxwSSeuQdou0iiCjdM,3238
|
|
40
|
+
hydroserverpy/etl/transformers/json_transformer.py,sha256=ity0MXcYjEnlun4Y6cVSrnjrglKrK4JOXXHxWHIHN2A,2323
|
|
41
|
+
hydroserverpy/etl_csv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
|
+
hydroserverpy/etl_csv/exceptions.py,sha256=0UY8YUlNepG0y6FfH36hJyR1bOhwYHSZIdUSSMTg7GA,314
|
|
43
|
+
hydroserverpy/etl_csv/hydroserver_etl_csv.py,sha256=9pu37ZmcpjVHfGTopfhw1oNvRNMx1uCPMOJJC-3wxn4,13244
|
|
44
|
+
hydroserverpy/quality/__init__.py,sha256=GGBMkFSXciJLYrbV-NraFrj_mXWCy_GTcy9KKrKXU4c,84
|
|
45
|
+
hydroserverpy/quality/service.py,sha256=U02UfLKVmFvr5ySiH0n0JYzUIabq5uprrHIiwcqBlqY,13879
|
|
46
|
+
hydroserverpy-0.4.0.dist-info/LICENSE,sha256=xVqFxDw3QOEJukakL7gQCqIMTQ1dlSCTo6Oc1otNW80,1508
|
|
47
|
+
hydroserverpy-0.4.0.dist-info/METADATA,sha256=gpws0OQEo2rfwLHQ_gFSjS7f5-fHld36y5hqrKJjYg8,507
|
|
48
|
+
hydroserverpy-0.4.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
|
|
49
|
+
hydroserverpy-0.4.0.dist-info/top_level.txt,sha256=Zf37hrncXLOYvXhgCrf5mZdeq81G9fShdE2LfYbtb7w,14
|
|
50
|
+
hydroserverpy-0.4.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
51
|
+
hydroserverpy-0.4.0.dist-info/RECORD,,
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: hydroserverpy
|
|
3
|
-
Version: 0.3.0
|
|
4
|
-
Requires-Python: <4,>=3.9
|
|
5
|
-
License-File: LICENSE
|
|
6
|
-
Requires-Dist: requests >=2
|
|
7
|
-
Requires-Dist: pydantic >=2.6
|
|
8
|
-
Requires-Dist: pandas >=2.2
|
|
9
|
-
Requires-Dist: numpy >=2.0
|
|
10
|
-
Requires-Dist: pyyaml >=5
|
|
11
|
-
Requires-Dist: simplejson >=3
|
|
12
|
-
Requires-Dist: crontab >=1
|
|
13
|
-
Requires-Dist: python-dateutil >=2.8.2
|
|
14
|
-
Requires-Dist: croniter >=2.0.1
|
|
15
|
-
Requires-Dist: country-list >=1.1.0
|
|
16
|
-
Provides-Extra: docs
|
|
17
|
-
Requires-Dist: sphinx-autodoc-typehints ; extra == 'docs'
|
|
18
|
-
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
hydroserverpy/__init__.py,sha256=oVxU_pSr5RZx4s5UHYYNCrjXQAP5lujlosB2a3qG260,223
|
|
2
|
-
hydroserverpy/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
3
|
-
hydroserverpy/core/service.py,sha256=ch6rwNM8oM3L-9phE474grofCR3QkTQ8AopkMyn9sjo,5339
|
|
4
|
-
hydroserverpy/core/endpoints/__init__.py,sha256=SpN1WLX0R8HOLHBv1cp3VZcIEiKD4BBbgFGQppdA_mw,404
|
|
5
|
-
hydroserverpy/core/endpoints/base.py,sha256=Ay0a8rucNo9x8h1MMMuMaISkBAgc9DK_kouLGtnHPjk,4925
|
|
6
|
-
hydroserverpy/core/endpoints/data_loaders.py,sha256=boUdmn9_9QDJS38nBXwKXYiX_We_rfK1OFjCU8ptQUE,3009
|
|
7
|
-
hydroserverpy/core/endpoints/data_sources.py,sha256=c9hwlFUUY-Ae84TrlB2boLjKIIhN_fzxHSYvPSb9PKA,3007
|
|
8
|
-
hydroserverpy/core/endpoints/datastreams.py,sha256=z8NX21L2qcj07Cotm5sTT3GrNEV2jS0-AjLQDRHeRq8,6899
|
|
9
|
-
hydroserverpy/core/endpoints/observed_properties.py,sha256=7_BtjsCyyGaQ1EMhlQXhWupTs85q7i85LdRLejVUb9o,3309
|
|
10
|
-
hydroserverpy/core/endpoints/processing_levels.py,sha256=pDolo_BqkSufs3w_ykRbsg-93xWME7vYIA6BAwzdT7A,3286
|
|
11
|
-
hydroserverpy/core/endpoints/result_qualifiers.py,sha256=977r3Vf6Y3kkoRcHQwTbQPSCxxeWsJkcDCPhFI30Tss,3301
|
|
12
|
-
hydroserverpy/core/endpoints/sensors.py,sha256=niF6eY8dFdfowqW_dLq9-7CPolWO__lFwElMDJTYtsM,3122
|
|
13
|
-
hydroserverpy/core/endpoints/things.py,sha256=n0nSq2AgJ7zFwAerkTtYlFvc1EzgUfHsu_nNTcVxqr0,8357
|
|
14
|
-
hydroserverpy/core/endpoints/units.py,sha256=UZKizV8ZLMCPZQ0ol5U8UON_MB80uhxL2PUwDbtQLXA,3084
|
|
15
|
-
hydroserverpy/core/schemas/__init__.py,sha256=gUFAim1jcUWAvj0IqpR8UKaCdXT1v11SmFnOzEmcwJM,353
|
|
16
|
-
hydroserverpy/core/schemas/base.py,sha256=k5ctiVXLm5A0TI-Nkz9l3oDGsq16B3yKcQgnZcJVDds,3683
|
|
17
|
-
hydroserverpy/core/schemas/data_loaders.py,sha256=BJv0-IUkgsNisuwyOooUAHaAv1DLCF5SVVnBjpfahYM,2470
|
|
18
|
-
hydroserverpy/core/schemas/data_sources.py,sha256=oearfow10p-JJ5d_3-S2IEJ4039d4SMQlVA0N4dNOH0,8058
|
|
19
|
-
hydroserverpy/core/schemas/datastreams.py,sha256=OEVc7xMVaFSHvLMyunt2g0u6xAfv5xg0fO6Uz8VjOSU,11413
|
|
20
|
-
hydroserverpy/core/schemas/observed_properties.py,sha256=1ibOAYbsf1DQAos68V8KEmvBUoS2WO73dd5MhSWCC90,1161
|
|
21
|
-
hydroserverpy/core/schemas/processing_levels.py,sha256=K4N5by5bfSD3iPcx6Jv1x-xOPxW3_gwhZcEfaqwSDmQ,867
|
|
22
|
-
hydroserverpy/core/schemas/result_qualifiers.py,sha256=ejUMPCDOq3cuq3a6j2uvQNRdVNEVQ1jJAacYv-o9NZI,722
|
|
23
|
-
hydroserverpy/core/schemas/sensors.py,sha256=8nXSEyD1kGAL2Wi76kHvjXNSgh2VFTfMgBkFP8ACsZw,1835
|
|
24
|
-
hydroserverpy/core/schemas/things.py,sha256=Pkr3bIo4VjLML7o53_R2lXwBmx0Z7aoGlvJKC9Diw60,11139
|
|
25
|
-
hydroserverpy/core/schemas/units.py,sha256=EB4HATC-C2RxPC0EpcVN--aQa6nl1O9Lj1jkpXlJ-8Y,826
|
|
26
|
-
hydroserverpy/etl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
|
-
hydroserverpy/etl/exceptions.py,sha256=0UY8YUlNepG0y6FfH36hJyR1bOhwYHSZIdUSSMTg7GA,314
|
|
28
|
-
hydroserverpy/etl/service.py,sha256=g-zp89KK4MDIdcTWQDNKbCg485ByAg0Ui01ooFldxhI,12414
|
|
29
|
-
hydroserverpy/quality/__init__.py,sha256=GGBMkFSXciJLYrbV-NraFrj_mXWCy_GTcy9KKrKXU4c,84
|
|
30
|
-
hydroserverpy/quality/service.py,sha256=3y6hjt1jcRcQSx9xRw37YLFBNCch488MHhn-p5nmR6E,13830
|
|
31
|
-
hydroserverpy-0.3.0.dist-info/LICENSE,sha256=xVqFxDw3QOEJukakL7gQCqIMTQ1dlSCTo6Oc1otNW80,1508
|
|
32
|
-
hydroserverpy-0.3.0.dist-info/METADATA,sha256=8n1ZsmvItJmbNl7EgTtOGE4zr-MqY4xE-H5CUMZ3zgU,488
|
|
33
|
-
hydroserverpy-0.3.0.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
34
|
-
hydroserverpy-0.3.0.dist-info/top_level.txt,sha256=Zf37hrncXLOYvXhgCrf5mZdeq81G9fShdE2LfYbtb7w,14
|
|
35
|
-
hydroserverpy-0.3.0.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
36
|
-
hydroserverpy-0.3.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|