hydroserverpy 1.4.0b3__py3-none-any.whl → 1.4.0b4__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/api/models/etl/extractors/http_extractor.py +2 -5
- hydroserverpy/api/models/etl/schedule.py +1 -1
- hydroserverpy/api/models/etl/timestamp_parser.py +4 -1
- hydroserverpy/api/models/etl/transformers/base.py +9 -0
- hydroserverpy/api/models/etl/transformers/json_transformer.py +14 -0
- {hydroserverpy-1.4.0b3.dist-info → hydroserverpy-1.4.0b4.dist-info}/METADATA +1 -1
- {hydroserverpy-1.4.0b3.dist-info → hydroserverpy-1.4.0b4.dist-info}/RECORD +11 -11
- {hydroserverpy-1.4.0b3.dist-info → hydroserverpy-1.4.0b4.dist-info}/WHEEL +0 -0
- {hydroserverpy-1.4.0b3.dist-info → hydroserverpy-1.4.0b4.dist-info}/licenses/LICENSE +0 -0
- {hydroserverpy-1.4.0b3.dist-info → hydroserverpy-1.4.0b4.dist-info}/top_level.txt +0 -0
- {hydroserverpy-1.4.0b3.dist-info → hydroserverpy-1.4.0b4.dist-info}/zip-safe +0 -0
|
@@ -17,11 +17,8 @@ class HTTPExtractor(Extractor):
|
|
|
17
17
|
url = self.resolve_placeholder_variables(payload, loader)
|
|
18
18
|
logging.info(f"Requesting data from → {url}")
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
except Exception as e:
|
|
23
|
-
logging.error(f"Failed to fetch {url}: {e}")
|
|
24
|
-
raise
|
|
20
|
+
response = requests.get(url)
|
|
21
|
+
response.raise_for_status()
|
|
25
22
|
|
|
26
23
|
data = BytesIO()
|
|
27
24
|
for chunk in response.iter_content(chunk_size=8192):
|
|
@@ -73,7 +73,10 @@ class TimestampParser:
|
|
|
73
73
|
return localized.dt.tz_convert(timezone.utc)
|
|
74
74
|
|
|
75
75
|
def parse_series(self, raw_series: pd.Series) -> pd.Series:
|
|
76
|
-
|
|
76
|
+
if pd.api.types.is_datetime64_any_dtype(raw_series):
|
|
77
|
+
s = raw_series # already datetimes
|
|
78
|
+
else:
|
|
79
|
+
s = raw_series.astype("string", copy=False).str.strip()
|
|
77
80
|
parsed = self._convert_series_to_UTC(s)
|
|
78
81
|
|
|
79
82
|
if parsed.isna().any():
|
|
@@ -68,14 +68,21 @@ class Transformer(ABC):
|
|
|
68
68
|
def standardize_dataframe(
|
|
69
69
|
self, df: pd.DataFrame, mappings: List[SourceTargetMapping]
|
|
70
70
|
):
|
|
71
|
+
logging.info(f"Successfully read payload into dataframe:\n {df}")
|
|
72
|
+
|
|
71
73
|
# 1) Normalize timestamp column
|
|
72
74
|
df.rename(columns={self.timestamp.key: "timestamp"}, inplace=True)
|
|
73
75
|
if "timestamp" not in df.columns:
|
|
74
76
|
msg = f"Timestamp column '{self.timestamp.key}' not found in data."
|
|
75
77
|
logging.error(msg)
|
|
76
78
|
raise ValueError(msg)
|
|
79
|
+
logging.info(f"Renamed timestamp column to 'timestamp'")
|
|
80
|
+
|
|
77
81
|
df["timestamp"] = self.timestamp_parser.parse_series(df["timestamp"])
|
|
82
|
+
logging.info(f"Normalized timestamp column \n {df}")
|
|
83
|
+
|
|
78
84
|
df = df.drop_duplicates(subset=["timestamp"], keep="last")
|
|
85
|
+
logging.info(f"Removed duplicates\n")
|
|
79
86
|
|
|
80
87
|
def _resolve_source_col(s_id: Union[str, int]) -> str:
|
|
81
88
|
if isinstance(s_id, int) and s_id not in df.columns:
|
|
@@ -120,6 +127,8 @@ class Transformer(ABC):
|
|
|
120
127
|
target_col = str(path.target_identifier)
|
|
121
128
|
transformed_df[target_col] = _apply_transformations(base, path)
|
|
122
129
|
|
|
130
|
+
logging.info(f"Mapped payload sources to targets")
|
|
131
|
+
|
|
123
132
|
# 6) Keep only timestamp + target columns
|
|
124
133
|
df = pd.concat([df[["timestamp"]], pd.DataFrame(transformed_df)], axis=1)
|
|
125
134
|
|
|
@@ -24,7 +24,21 @@ class JSONTransformer(Transformer):
|
|
|
24
24
|
Returns:
|
|
25
25
|
pd.DataFrame: pandas DataFrames in the format pd.Timestamp, datastream_id_1, datastream_id_2, ...
|
|
26
26
|
"""
|
|
27
|
+
if data_file is None:
|
|
28
|
+
raise TypeError(
|
|
29
|
+
"JSONTransformer received None; expected file-like, bytes, or str"
|
|
30
|
+
)
|
|
31
|
+
|
|
27
32
|
json_data = json.load(data_file)
|
|
33
|
+
logging.info(f"Read in json data: \n{data_file}")
|
|
34
|
+
logging.info(
|
|
35
|
+
"JSONTransformer cfg:\n jmespath=%r\n ts.key=%r\n ts.format=%r\n ts.custom=%r",
|
|
36
|
+
self.cfg.jmespath,
|
|
37
|
+
self.timestamp.key,
|
|
38
|
+
self.timestamp.format,
|
|
39
|
+
self.timestamp.custom_format,
|
|
40
|
+
)
|
|
41
|
+
|
|
28
42
|
data_points = self.extract_data_points(json_data)
|
|
29
43
|
if not data_points:
|
|
30
44
|
logging.warning("No data points found in the JSON data.")
|
|
@@ -11,22 +11,22 @@ hydroserverpy/api/models/etl/etl_configuration.py,sha256=anD_0zlldJKogie15j9SIab
|
|
|
11
11
|
hydroserverpy/api/models/etl/factories.py,sha256=-inTw_C694YieDU4vbrm1qyeZMEYZqVhHSyEQJLMueo,802
|
|
12
12
|
hydroserverpy/api/models/etl/orchestration_configuration.py,sha256=ElSrgi7ioFZJFJg6aGogW5ZZk7fA17y4p--yWwiOhZ0,1367
|
|
13
13
|
hydroserverpy/api/models/etl/orchestration_system.py,sha256=5wdGsXCMqHfE3--zG-3WAPAVPNMPIx99y-7UUhdCink,2060
|
|
14
|
-
hydroserverpy/api/models/etl/schedule.py,sha256
|
|
14
|
+
hydroserverpy/api/models/etl/schedule.py,sha256=-TxRpYSFbyYkzAPBWOh5udx1s6v1SvLl3_LE2j_b1uE,512
|
|
15
15
|
hydroserverpy/api/models/etl/status.py,sha256=vYT7go7DMcOgy29w0yhHpKz6AdprLmOxWZE9G_DHVdw,503
|
|
16
|
-
hydroserverpy/api/models/etl/timestamp_parser.py,sha256=
|
|
16
|
+
hydroserverpy/api/models/etl/timestamp_parser.py,sha256=lDnParK2j2M9TF7qspJDeKFGGpO4d1F2KJEKZ4xH5Yw,4374
|
|
17
17
|
hydroserverpy/api/models/etl/types.py,sha256=4PY3CM-uoXIsf2lhcqtLC6HaRGXe7HKGDU22R8-H35c,135
|
|
18
18
|
hydroserverpy/api/models/etl/extractors/__init__.py,sha256=Z0viw2vk96Ytpz3n7ODtkYz9Zx0I0NsZUbna2ZWvhkw,243
|
|
19
19
|
hydroserverpy/api/models/etl/extractors/base.py,sha256=uLAdi1PrOVMtuCU1ZN_liBW_ElD2mklrBrQ_AZZQtNw,1949
|
|
20
20
|
hydroserverpy/api/models/etl/extractors/ftp_extractor.py,sha256=5LwvHuvLk6LwRSVyE9EkV3DPgVlAvRrOBpl1a8B7dLg,1387
|
|
21
|
-
hydroserverpy/api/models/etl/extractors/http_extractor.py,sha256=
|
|
21
|
+
hydroserverpy/api/models/etl/extractors/http_extractor.py,sha256=AgS0vDmHhN3do1FII-hNEvkK40lDjlS1iftHplWd1No,805
|
|
22
22
|
hydroserverpy/api/models/etl/extractors/local_file_extractor.py,sha256=AwC0T-F8D0S7zR0MUIQXKLfv9b0uU60YoUW615lgNl0,648
|
|
23
23
|
hydroserverpy/api/models/etl/loaders/__init__.py,sha256=rEqYo1Tim7Fzrp1jPhV_yn3ll90dUGMAjcieEqh_4Pk,118
|
|
24
24
|
hydroserverpy/api/models/etl/loaders/base.py,sha256=J3dqm_b6BmEsF7VR3sUxBVQpLJsRx7fTIir5v5TORE0,229
|
|
25
25
|
hydroserverpy/api/models/etl/loaders/hydroserver_loader.py,sha256=0qdsSu4bLD4R86eSyQY2Qwg1HmMsruVjFhBKCrErsBU,3868
|
|
26
26
|
hydroserverpy/api/models/etl/transformers/__init__.py,sha256=YQhjdoRdq4xikLWETnsRIaMvCae5flRpPrfw9lj9pOA,184
|
|
27
|
-
hydroserverpy/api/models/etl/transformers/base.py,sha256=
|
|
27
|
+
hydroserverpy/api/models/etl/transformers/base.py,sha256=Qt9U6rRFS8aq142n0Cig1wMkVC9-4IBiXIE1nAjEPDY,4971
|
|
28
28
|
hydroserverpy/api/models/etl/transformers/csv_transformer.py,sha256=06AWV9S9we4LRQLpn5WMVl7sX6ylDKPb2KHNC0Jiu7o,3478
|
|
29
|
-
hydroserverpy/api/models/etl/transformers/json_transformer.py,sha256=
|
|
29
|
+
hydroserverpy/api/models/etl/transformers/json_transformer.py,sha256=puKQI8abWJEQTcw34lEHgHjuPOuzcSBv95_txErzchk,2116
|
|
30
30
|
hydroserverpy/api/models/iam/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
31
31
|
hydroserverpy/api/models/iam/account.py,sha256=7COk_CPYFlthg1uFWTBlJESfnuqMW90TSjZoIcBb-_8,439
|
|
32
32
|
hydroserverpy/api/models/iam/apikey.py,sha256=Z4iXg_K056naT3ogwc5wzyNnRpxHkOCz0lk-Gim4eL8,3146
|
|
@@ -61,9 +61,9 @@ hydroserverpy/api/services/sta/thing.py,sha256=Hyo3zTghSs7IIdsOGRu35i9w-aGOYlK9b
|
|
|
61
61
|
hydroserverpy/api/services/sta/unit.py,sha256=NFToSAIGTwDfwYWe8Q-I_f5xsw_GYzFEkMnhSJ-ChvE,2178
|
|
62
62
|
hydroserverpy/quality/__init__.py,sha256=GGBMkFSXciJLYrbV-NraFrj_mXWCy_GTcy9KKrKXU4c,84
|
|
63
63
|
hydroserverpy/quality/service.py,sha256=U02UfLKVmFvr5ySiH0n0JYzUIabq5uprrHIiwcqBlqY,13879
|
|
64
|
-
hydroserverpy-1.4.
|
|
65
|
-
hydroserverpy-1.4.
|
|
66
|
-
hydroserverpy-1.4.
|
|
67
|
-
hydroserverpy-1.4.
|
|
68
|
-
hydroserverpy-1.4.
|
|
69
|
-
hydroserverpy-1.4.
|
|
64
|
+
hydroserverpy-1.4.0b4.dist-info/licenses/LICENSE,sha256=xVqFxDw3QOEJukakL7gQCqIMTQ1dlSCTo6Oc1otNW80,1508
|
|
65
|
+
hydroserverpy-1.4.0b4.dist-info/METADATA,sha256=GCgulq3Im1uhFlRJtRg54dwOIqHK3wFfxAXpT6hlDlA,532
|
|
66
|
+
hydroserverpy-1.4.0b4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
67
|
+
hydroserverpy-1.4.0b4.dist-info/top_level.txt,sha256=Zf37hrncXLOYvXhgCrf5mZdeq81G9fShdE2LfYbtb7w,14
|
|
68
|
+
hydroserverpy-1.4.0b4.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
69
|
+
hydroserverpy-1.4.0b4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|