M test/test_api.py +28 -0
@@ 1,3 1,4 @@
+import numpy as np
import pandas as pd
from tshistory.testutil import assert_df
@@ 39,6 40,33 @@ 2020-01-02 False
2020-01-03 False
""", marker)
+ edited = series.copy()
+ edited.iloc[1] = np.NaN
+ tsx.update('multi-local', edited, 'test', manual=True)
+
+ ts, marker = tsx.edited('multi-local', _keep_nans=True)
+ assert_df("""
+2020-01-01 1.0
+2020-01-02 NaN
+2020-01-03 3.0
+""", ts)
+ assert_df("""
+2020-01-01 False
+2020-01-02 True
+2020-01-03 False
+""", marker)
+
+ ts, marker = tsx.edited('multi-local', _keep_nans=False)
+ assert_df("""
+2020-01-01 1.0
+2020-01-03 3.0
+""", ts)
+ assert_df("""
+2020-01-01 False
+2020-01-02 True
+2020-01-03 False
+""", marker)
+
def test_multi_source_handcrafted_federated(tsa1, tsa2):
series = pd.Series(
M tshistory_supervision/api.py +10 -5
@@ 13,7 13,8 @@ from tshistory.api import (
def edited(self, name: str,
revision_date: Optional[pd.Timestamp]=None,
from_value_date: Optional[pd.Timestamp]=None,
- to_value_date: Optional[pd.Timestamp]=None) -> Tuple[pd.Series, pd.Series]:
+ to_value_date: Optional[pd.Timestamp]=None,
+ _keep_nans: bool=False) -> Tuple[pd.Series, pd.Series]:
"""
Returns the base series and a second boolean series whose entries
indicate if an override has been made or not.
@@ 26,14 27,16 @@ def edited(self, name: str,
name,
revision_date=revision_date,
from_value_date=from_value_date,
- to_value_date=to_value_date
+ to_value_date=to_value_date,
+ _keep_nans=_keep_nans
)
return self.othersources.edited(
name,
revision_date,
from_value_date,
- to_value_date
+ to_value_date,
+ _keep_nans=_keep_nans
)
@@ 42,7 45,8 @@ def edited(self, # noqa: F811
name,
revision_date=None,
from_value_date=None,
- to_value_date=None):
+ to_value_date=None,
+ _keep_nans=False):
source = self._findsourcefor(name)
if source is None:
@@ 51,7 55,8 @@ def edited(self, # noqa: F811
name,
revision_date,
from_value_date,
- to_value_date
+ to_value_date,
+ _keep_nans
)
M tshistory_supervision/http.py +12 -1
@@ 1,9 1,12 @@
+import json
+
import pandas as pd
from psyl import lisp
from flask import make_response
from flask_restx import (
+ inputs,
Resource,
reqparse
)
@@ 49,6 52,10 @@ edited.add_argument(
'horizon', type=str, default=None,
help='override from/to_value_date'
)
+edited.add_argument(
+ '_keep_nans', type=inputs.boolean, default=False,
+ help='keep erasure information'
+)
class supervision_httpapi(httpapi):
@@ 85,11 92,13 @@ class supervision_httpapi(httpapi):
api.abort(400, f'bad horizon expression for `{args.name}`')
fvd = horizon.past
tvd = horizon.future
+
series, markers = tsa.edited(
args.name,
revision_date=args.insertion_date,
from_value_date=fvd,
to_value_date=tvd,
+ _keep_nans=args._keep_nans
)
metadata = tsa.metadata(args.name, all=True)
assert metadata is not None, f'series {args.name} has no metadata'
@@ 134,9 143,11 @@ class supervision_httpclient(httpclient)
def edited(self, name,
revision_date=None,
from_value_date=None,
- to_value_date=None):
+ to_value_date=None,
+ _keep_nans=False):
args = {
'name': name,
+ '_keep_nans': json.dumps(_keep_nans),
'format': 'tshpack',
}
if revision_date: