Views

Data validation is done by the auth, data and requests modules.

Signals module

Copyright 2022 Searis AS

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

class pyclarify.views.signals.Signal(*, name: str, description: str = '', labels: Dict[pyclarify.fields.constraints.ConstrainedStrValue, List[str]] = {}, sourceType: pyclarify.fields.constraints.SourceTypeSignal = SourceTypeSignal.measurement, valueType: pyclarify.fields.constraints.TypeSignal = TypeSignal.numeric, engUnit: str = '', enumValues: Dict[str, str] = {}, sampleInterval: datetime.timedelta = None, gapDetection: datetime.timedelta = None, annotations: Dict[pyclarify.fields.constraints.ConstrainedStrValue, str] = None)

Bases: pyclarify.views.signals.SignalInfo

Model for sending Signal metadata to Clarify.

Parameters
  • name (string(len:1-128)) – A human-readable name for the resource.

  • description (string(len:0-1000)) – A free-form description of the resource.

  • labels (Labels) – A map of custom classification attributes. Filtering is done on label keys (labels.<key>).

  • sourceType (string(enum)) – Classification of the data source. The value must be “aggregate”, “measurement” or “prediction”.

  • valueType (string(enum)) – How to interpret time-series data points. The value must be “enum” or “numeric”.

  • engUnit (string) – Engineering unit for time-series data in numeric representations.

  • enumValues (map(string => string(len:1-128))) – Map of numeric values to display text in enum representations. The key must represent an integer in range 0-9999.

  • sampleInterval (Fixed Duration, null) – The expected distance between data points.

  • gapDetection (Fixed Duration, null) – The maximum distance between two data-points before considering it to be a gap.

  • annotations (Annotations) – A key-value store where integrations can store programmatic meta-data about the resource instance. Filtering is done on member fields.

Example

>>> from pyclarify import Signal

Creating a signal a minimal signal.

>>> signal = Signal(name="My new signal")

Creating a signal with all attributes set.

>>> signal = Signal(
...     name="My new signal"
...     description="This signal is an example."
...     labels={
...         "environment": ["dev", "mocking"],
...         "unit":["cloud"]
...     }
...     engUnit="℃"
...     sampleInterval="PT30S"
...     gapDetection="PT5M"
... )

Creating an enum signal.

>>> signal = Signal(
...     name="My new enum signal"
...     description="This enum signal is an example."
...     labels={
...         "environment": ["dev", "mocking"],
...         "unit":["cloud"]
...     }
...     valueType="enum"
...     enumValues={
...         "0" : "Wind",
...         "1" : "Rain",
...         "2" : "Cloudy"
...     }
...     sampleInterval="PT30S"
...     gapDetection="PT5M"
... )
annotations: Optional[Dict[pyclarify.fields.constraints.ConstrainedStrValue, str]]

Items module

Copyright 2022 Searis AS

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

class pyclarify.views.items.Item(*, name: str, description: str = '', labels: Dict[pyclarify.fields.constraints.ConstrainedStrValue, List[str]] = {}, sourceType: pyclarify.fields.constraints.SourceTypeSignal = SourceTypeSignal.measurement, valueType: pyclarify.fields.constraints.TypeSignal = TypeSignal.numeric, engUnit: str = '', enumValues: Dict[str, str] = {}, sampleInterval: datetime.timedelta = None, gapDetection: datetime.timedelta = None, annotations: Dict[pyclarify.fields.constraints.ConstrainedStrValue, str] = None, visible: bool = False)

Bases: pyclarify.views.items.ItemInfo

Item model for sending Item meta data to Clarify.

Parameters
  • name (string(len:1-128)) – A human-readable name for the resource.

  • description (string(len:0-1000)) – A free-form description of the resource.

  • labels (Dict[LabelsKey, List[str]]) – A map of custom classification attributes. Filtering is done on label keys (labels.<key>). LabelsKey is alphanumeric string up to 128 chars.

  • sourceType (string(enum)) – Classification of the data source. The value must be “aggregate”, “measurement” or “prediction”.

  • valueType (string(enum)) – How to interpret time-series data points. The value must be “enum” or “numeric”.

  • engUnit (string) – Engineering unit for time-series data in numeric representations.

  • enumValues (map(string => string(len:1-128))) – Map of numeric values to display text in enum representations. The key must represent an integer in range 0-9999.

  • sampleInterval (Fixed Duration, null) – The expected distance between data points.

  • gapDetection (Fixed Duration, null) – The maximum distance between two data-points before considering it to be a gap.

  • visible (bool) – Whether the item should be visible for your entire organization within Clarify or not.

  • annotations (Dict[AnnotationKey, str]) – A key-value store where integrations can store programmatic meta-data about the resource instance. Filtering is done one member fields. AnnotationKey is alphanumeric string up to 128 chars.

Example

>>> from pyclarify import Item

Creating a minimal item.

>>> item = Item(name="My new item")

Creating a item with all attributes set.

>>> item = Item(
...     name="My new item"
...     description="This item is an example."
...     labels={
...         "environment": ["dev", "mocking"],
...         "unit":["cloud"]
...     }
...     engUnit="℃"
...     sampleInterval="PT30S"
...     gapDetection="PT5M"
... )

Creating an enum item.

>>> item = Item(
...     name="My new enum item"
...     description="This enum item is an example."
...     labels={
...         "environment": ["dev", "mocking"],
...         "unit":["cloud"]
...     }
...     valueType="enum"
...     enumValues={
...         "0" : "Wind",
...         "1" : "Rain",
...         "2" : "Cloudy"
...     }
...     sampleInterval="PT30S"
...     gapDetection="PT5M"
... )

Tip

Items are hidden by default. If you want them to be visible you can add the attribute visible and set it to True

>>> item = Item(name="My new item", visible=True)
annotations: Optional[Dict[pyclarify.fields.constraints.ConstrainedStrValue, str]]
visible: bool

DataFrame module

Copyright 2022 Searis AS

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

class pyclarify.views.dataframe.DataFrame(*, times: List[datetime.datetime] = None, series: Dict[pyclarify.fields.constraints.ConstrainedStrValue, List[Optional[Union[float, int]]]] = None)

Bases: pydantic.main.BaseModel

DataFrame structure maps to data structure used in the API for saving time series. Supports merging with other Clarify DataFrame objects and can convert to and from Pandas.DataFrame.

Parameters
  • series (Dict[InputID, List[Union[None, float, int]]]) – Map of inputid to Array of data points to insert by Input ID. The length of each array must match that of the times array. To omit a value for a given timestamp in times, use the value null.

  • times (List of timestamps) – Either as a python datetime or as YYYY-MM-DD[T]HH:MM[:SS[.ffffff]][Z or [±]HH[:]MM]]] to insert.

Example

>>> from pyclarify import DataFrame
>>> data = DataFrame(
...     series={"INPUT_ID_1": [1, 2], "INPUT_ID_2": [3, 4]},
...     times=["2021-11-01T21:50:06Z",  "2021-11-02T21:50:06Z"]
... )
classmethod convert_numpy_to_native(v)
classmethod from_pandas(df, time_col=None)

Convert a pandas DataFrame into a Clarify DataFrame.

Parameters
  • df (pandas.DataFrame) – The pandas.DataFrame object to cast to pyclarify.DataFrame.

  • time_col (str, default None) – A string denoting the column containing the time axis. If no string is given it is assumed to be the index of the DataFrame.

Returns

pyclarify.DataFrame

Return type

The Clarify DataFrame representing this instance.

Example

>>> from pyclarify import DataFrame
>>> import pandas as pd
>>> df = pd.DataFrame(data={"INPUT_ID_1": [1, 2], "INPUT_ID_2": [3, 4]})
>>> df.index = ["2021-11-01T21:50:06Z",  "2021-11-02T21:50:06Z"]
>>> DataFrame.from_pandas(df)
... DataFrame(
...     times=[
...         datetime.datetime(2021, 11, 1, 21, 50, 6, tzinfo=datetime.timezone.utc),
...         datetime.datetime(2021, 11, 2, 21, 50, 6, tzinfo=datetime.timezone.utc)],
...     series={
...         'INPUT_ID_1': [1.0, 2.0],
...         'INPUT_ID_2': [3.0, 4.0]
...     }
... )

With specific time column.

>>> from pyclarify import DataFrame
>>> import pandas as pd
>>> df = pd.DataFrame(data={
...     "INPUT_ID_1": [1, 2],
...     "INPUT_ID_2": [3, 4],
...     "timestamps": ["2021-11-01T21:50:06Z",  "2021-11-02T21:50:06Z"]
...})
>>> DataFrame.from_pandas(df, time_col="timestamps")
... DataFrame(
...     times=[
...         datetime.datetime(2021, 11, 1, 21, 50, 6, tzinfo=datetime.timezone.utc),
...         datetime.datetime(2021, 11, 2, 21, 50, 6, tzinfo=datetime.timezone.utc)],
...     series={
...         'INPUT_ID_1': [1.0, 2.0],
...         'INPUT_ID_2': [3.0, 4.0]
...     }
... )
classmethod merge(dataframes) pyclarify.views.dataframe.DataFrame

Method for merging 2 or more Clarify Data Frames. Mapping overlapping signal names to single series. Concatenates timestamps of all data frames. Inserts none value to series not containing entry at a given timestamp.

Parameters

dataframes (List[DataFrame]) – A Clarify DataFrame or a list of Clarify DataFrames

Returns

DataFrame – Merged data frame of all input data frames and self

Return type

DataFrame

Example

Merging two data frames.

>>> df1 = DataFrame(
...     series={"INPUT_ID_1": [1, 2], "INPUT_ID_2": [3, 4]},
...     times=["2021-11-01T21:50:06Z",  "2021-11-02T21:50:06Z"]
... )
>>> df2 = DataFrame(
...     series={"INPUT_ID_1": [5, 6], "INPUT_ID_3": [7, 8]},
...     times=["2021-11-01T21:50:06Z",  "2021-11-03T21:50:06Z"]
... )
>>> merged_df = DataFrame.merge([df1, df2])
>>> merged_df.to_pandas()
...                            INPUT_ID_2  INPUT_ID_1  INPUT_ID_3
... 2021-11-01 21:50:06+00:00         3.0         5.0         7.0
... 2021-11-02 21:50:06+00:00         4.0         2.0         NaN
... 2021-11-03 21:50:06+00:00         NaN         6.0         8.0

Warning

Notice from the example above that when time series have overlapping timestamps the last data frame overwrites the first.

>>> df1 = DataFrame(
...     series={"INPUT_ID_1": [1, 2]},
...     times=["2021-11-01T21:50:06Z",  "2021-11-02T21:50:06Z"]
... )
>>> df2 = DataFrame(
...     series={"INPUT_ID_1": [5, 6]},
...     times=["2021-11-01T21:50:06Z",  "2021-11-03T21:50:06Z"]
... )
>>> DataFrame.merge([df1, df2])
...                             INPUT_ID_1
... 2021-11-01 21:50:06+00:00         5.0   <--
... 2021-11-02 21:50:06+00:00         2.0
... 2021-11-03 21:50:06+00:00         6.0
>>> DataFrame.merge([df2, df1])
...                             INPUT_ID_1
... 2021-11-01 21:50:06+00:00         1.0   <--
... 2021-11-02 21:50:06+00:00         2.0
... 2021-11-03 21:50:06+00:00         6.0
series: Dict[pyclarify.fields.constraints.ConstrainedStrValue, List[Optional[Union[float, int]]]]
times: List[datetime.datetime]
to_pandas()

Convert the instance into a pandas DataFrame.

Returns

pandas.DataFrame

Return type

The pandas DataFrame representing this instance.

Example

>>> from pyclarify import DataFrame
>>> data = DataFrame(
...     series={"INPUT_ID_1": [1, 2], "INPUT_ID_2": [3, 4]},
...     times=["2021-11-01T21:50:06Z",  "2021-11-02T21:50:06Z"]
... )
>>> data.to_pandas()
...                            INPUT_ID_1  INPUT_ID_2
... 2021-11-01 21:50:06+00:00         1.0         3.0
... 2021-11-02 21:50:06+00:00         2.0         4.0

Filter module

Copyright 2022 Searis AS

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

class pyclarify.query.filter.DataFilter(*, gte: Optional[Union[str, datetime.datetime]] = None, lt: Optional[Union[str, datetime.datetime]] = None)

Bases: pydantic.main.BaseModel

Pydantic model for handeling filtering. The model has a to_query() method used internally to convert model to MongoDB format.

Parameters
  • gte (string(ISO 8601 timestamp) or python datetime, optional, default <now - 7 days>) – An RFC3339 time describing the inclusive start of the window.

  • lt (string(ISO 8601 timestamp) or python datetime, optional, default <now + 7 days>) – An RFC3339 time describing the exclusive end of the window.

Example

>>> from pyclarify import query
>>> data_filter = query.DataFilter(gte='2022-08-01T16:00:20Z',lt='2022-08-02T16:00:20Z')
>>> data_filter.to_query()
... {'times': {'$gte': '2022-08-01T16:00:20Z', '$lt': '2022-08-02T16:00:20Z'}}
classmethod field_must_reflect_operator(values)
gte: Optional[Union[str, datetime.datetime]]
lt: Optional[Union[str, datetime.datetime]]
to_query()
class pyclarify.query.filter.Filter(*, and_list: List[Filter] = None, or_list: List[Filter] = None, fields: Dict[str, pyclarify.fields.query.Comparison] = None)

Bases: pydantic.main.BaseModel

Pydantic model for handling filtering. The filter supports pythons built in “&” and “|” operators for chaining filters. The model has a to_query() method used internally to convert model to MongoDB format.

Parameters

fields (dict[str, Comparison]) – A dictionary of the key to be filtered on and a logical comparison.

Example

>>> from pyclarify import query
>>> f1 = query.Filter(fields={"name": query.NotEqual(value="Lufttemperatur")})
>>> f2 = query.Filter(fields={"labels.unit-type": query.NotIn(value=["Flåte", "Merde 5"])})
>>> f1.to_query()
... {'name': {'$ne': 'Lufttemperatur'}}
>>> f3 = f1 & f2
>>> f3.to_query()
... {
...     '$and': [
...         {'name': {'$ne': 'Lufttemperatur'}},
...         {'labels.unit-type': {'$nin': ['Flåte', 'Merde 5']}}
...     ]
... }
  • Equal

  • NotEqual

  • Regex

  • In

  • NotIn

  • LessThan

  • Greater

  • GreaterOrEqual

and_list: Optional[List[pyclarify.query.filter.Filter]]
field_to_query(field)
fields: Optional[Dict[str, pyclarify.fields.query.Comparison]]
or_list: Optional[List[pyclarify.query.filter.Filter]]
to_query()