onetick-py 1.177.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.
- locator_parser/__init__.py +0 -0
- locator_parser/acl.py +73 -0
- locator_parser/actions.py +262 -0
- locator_parser/common.py +368 -0
- locator_parser/io.py +43 -0
- locator_parser/locator.py +150 -0
- onetick/__init__.py +101 -0
- onetick/doc_utilities/__init__.py +3 -0
- onetick/doc_utilities/napoleon.py +40 -0
- onetick/doc_utilities/ot_doctest.py +140 -0
- onetick/doc_utilities/snippets.py +279 -0
- onetick/lib/__init__.py +4 -0
- onetick/lib/instance.py +141 -0
- onetick/py/__init__.py +293 -0
- onetick/py/_stack_info.py +89 -0
- onetick/py/_version.py +2 -0
- onetick/py/aggregations/__init__.py +11 -0
- onetick/py/aggregations/_base.py +648 -0
- onetick/py/aggregations/_docs.py +948 -0
- onetick/py/aggregations/compute.py +286 -0
- onetick/py/aggregations/functions.py +2216 -0
- onetick/py/aggregations/generic.py +104 -0
- onetick/py/aggregations/high_low.py +80 -0
- onetick/py/aggregations/num_distinct.py +83 -0
- onetick/py/aggregations/order_book.py +501 -0
- onetick/py/aggregations/other.py +1014 -0
- onetick/py/backports.py +26 -0
- onetick/py/cache.py +374 -0
- onetick/py/callback/__init__.py +5 -0
- onetick/py/callback/callback.py +276 -0
- onetick/py/callback/callbacks.py +131 -0
- onetick/py/compatibility.py +798 -0
- onetick/py/configuration.py +771 -0
- onetick/py/core/__init__.py +0 -0
- onetick/py/core/_csv_inspector.py +93 -0
- onetick/py/core/_internal/__init__.py +0 -0
- onetick/py/core/_internal/_manually_bound_value.py +6 -0
- onetick/py/core/_internal/_nodes_history.py +250 -0
- onetick/py/core/_internal/_op_utils/__init__.py +0 -0
- onetick/py/core/_internal/_op_utils/every_operand.py +9 -0
- onetick/py/core/_internal/_op_utils/is_const.py +10 -0
- onetick/py/core/_internal/_per_tick_scripts/tick_list_sort_template.script +121 -0
- onetick/py/core/_internal/_proxy_node.py +140 -0
- onetick/py/core/_internal/_state_objects.py +2312 -0
- onetick/py/core/_internal/_state_vars.py +93 -0
- onetick/py/core/_source/__init__.py +0 -0
- onetick/py/core/_source/_symbol_param.py +95 -0
- onetick/py/core/_source/schema.py +97 -0
- onetick/py/core/_source/source_methods/__init__.py +0 -0
- onetick/py/core/_source/source_methods/aggregations.py +809 -0
- onetick/py/core/_source/source_methods/applyers.py +296 -0
- onetick/py/core/_source/source_methods/columns.py +141 -0
- onetick/py/core/_source/source_methods/data_quality.py +301 -0
- onetick/py/core/_source/source_methods/debugs.py +272 -0
- onetick/py/core/_source/source_methods/drops.py +120 -0
- onetick/py/core/_source/source_methods/fields.py +619 -0
- onetick/py/core/_source/source_methods/filters.py +1002 -0
- onetick/py/core/_source/source_methods/joins.py +1413 -0
- onetick/py/core/_source/source_methods/merges.py +605 -0
- onetick/py/core/_source/source_methods/misc.py +1455 -0
- onetick/py/core/_source/source_methods/pandases.py +155 -0
- onetick/py/core/_source/source_methods/renames.py +356 -0
- onetick/py/core/_source/source_methods/sorts.py +183 -0
- onetick/py/core/_source/source_methods/switches.py +142 -0
- onetick/py/core/_source/source_methods/symbols.py +117 -0
- onetick/py/core/_source/source_methods/times.py +627 -0
- onetick/py/core/_source/source_methods/writes.py +986 -0
- onetick/py/core/_source/symbol.py +205 -0
- onetick/py/core/_source/tmp_otq.py +222 -0
- onetick/py/core/column.py +209 -0
- onetick/py/core/column_operations/__init__.py +0 -0
- onetick/py/core/column_operations/_methods/__init__.py +4 -0
- onetick/py/core/column_operations/_methods/_internal.py +28 -0
- onetick/py/core/column_operations/_methods/conversions.py +216 -0
- onetick/py/core/column_operations/_methods/methods.py +292 -0
- onetick/py/core/column_operations/_methods/op_types.py +160 -0
- onetick/py/core/column_operations/accessors/__init__.py +0 -0
- onetick/py/core/column_operations/accessors/_accessor.py +28 -0
- onetick/py/core/column_operations/accessors/decimal_accessor.py +104 -0
- onetick/py/core/column_operations/accessors/dt_accessor.py +537 -0
- onetick/py/core/column_operations/accessors/float_accessor.py +184 -0
- onetick/py/core/column_operations/accessors/str_accessor.py +1367 -0
- onetick/py/core/column_operations/base.py +1121 -0
- onetick/py/core/cut_builder.py +150 -0
- onetick/py/core/db_constants.py +20 -0
- onetick/py/core/eval_query.py +245 -0
- onetick/py/core/lambda_object.py +441 -0
- onetick/py/core/multi_output_source.py +232 -0
- onetick/py/core/per_tick_script.py +2256 -0
- onetick/py/core/query_inspector.py +464 -0
- onetick/py/core/source.py +1744 -0
- onetick/py/db/__init__.py +2 -0
- onetick/py/db/_inspection.py +1128 -0
- onetick/py/db/db.py +1327 -0
- onetick/py/db/utils.py +64 -0
- onetick/py/docs/__init__.py +0 -0
- onetick/py/docs/docstring_parser.py +112 -0
- onetick/py/docs/utils.py +81 -0
- onetick/py/functions.py +2398 -0
- onetick/py/license.py +190 -0
- onetick/py/log.py +88 -0
- onetick/py/math.py +935 -0
- onetick/py/misc.py +470 -0
- onetick/py/oqd/__init__.py +22 -0
- onetick/py/oqd/eps.py +1195 -0
- onetick/py/oqd/sources.py +325 -0
- onetick/py/otq.py +216 -0
- onetick/py/pyomd_mock.py +47 -0
- onetick/py/run.py +916 -0
- onetick/py/servers.py +173 -0
- onetick/py/session.py +1347 -0
- onetick/py/sources/__init__.py +19 -0
- onetick/py/sources/cache.py +167 -0
- onetick/py/sources/common.py +128 -0
- onetick/py/sources/csv.py +642 -0
- onetick/py/sources/custom.py +85 -0
- onetick/py/sources/data_file.py +305 -0
- onetick/py/sources/data_source.py +1045 -0
- onetick/py/sources/empty.py +94 -0
- onetick/py/sources/odbc.py +337 -0
- onetick/py/sources/order_book.py +271 -0
- onetick/py/sources/parquet.py +168 -0
- onetick/py/sources/pit.py +191 -0
- onetick/py/sources/query.py +495 -0
- onetick/py/sources/snapshots.py +419 -0
- onetick/py/sources/split_query_output_by_symbol.py +198 -0
- onetick/py/sources/symbology_mapping.py +123 -0
- onetick/py/sources/symbols.py +374 -0
- onetick/py/sources/ticks.py +825 -0
- onetick/py/sql.py +70 -0
- onetick/py/state.py +251 -0
- onetick/py/types.py +2131 -0
- onetick/py/utils/__init__.py +70 -0
- onetick/py/utils/acl.py +93 -0
- onetick/py/utils/config.py +186 -0
- onetick/py/utils/default.py +49 -0
- onetick/py/utils/file.py +38 -0
- onetick/py/utils/helpers.py +76 -0
- onetick/py/utils/locator.py +94 -0
- onetick/py/utils/perf.py +498 -0
- onetick/py/utils/query.py +49 -0
- onetick/py/utils/render.py +1374 -0
- onetick/py/utils/script.py +244 -0
- onetick/py/utils/temp.py +471 -0
- onetick/py/utils/types.py +120 -0
- onetick/py/utils/tz.py +84 -0
- onetick_py-1.177.0.dist-info/METADATA +137 -0
- onetick_py-1.177.0.dist-info/RECORD +152 -0
- onetick_py-1.177.0.dist-info/WHEEL +5 -0
- onetick_py-1.177.0.dist-info/entry_points.txt +2 -0
- onetick_py-1.177.0.dist-info/licenses/LICENSE +21 -0
- onetick_py-1.177.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from onetick.py.otq import otq
|
|
2
|
+
from onetick.py import state
|
|
3
|
+
from onetick.py.core._internal._op_utils.is_const import is_const
|
|
4
|
+
|
|
5
|
+
from onetick.py.core.column_operations.base import _Operation
|
|
6
|
+
from onetick.py.core._internal._state_objects import _StateColumn, _StateBase, _TickSequence
|
|
7
|
+
from onetick.py.types import type2str, value2str
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class StateVars:
|
|
11
|
+
def __init__(self, owner, previous=None):
|
|
12
|
+
""" Class for organizing state variables
|
|
13
|
+
|
|
14
|
+
Parameters
|
|
15
|
+
----------
|
|
16
|
+
owner: _Source
|
|
17
|
+
Owner of the object
|
|
18
|
+
previous: collections of dict of _Source, optional
|
|
19
|
+
Dictionaries to copy state variables from
|
|
20
|
+
"""
|
|
21
|
+
self._owner = owner
|
|
22
|
+
self._columns = {}
|
|
23
|
+
previous = previous if isinstance(previous, (list, tuple)) else (previous,)
|
|
24
|
+
for p in previous:
|
|
25
|
+
if p:
|
|
26
|
+
for name, column in p.state_vars.items:
|
|
27
|
+
value = column
|
|
28
|
+
if isinstance(value, _StateBase):
|
|
29
|
+
value = value.copy(obj_ref=self, name=name)
|
|
30
|
+
self._columns[name] = value
|
|
31
|
+
|
|
32
|
+
def __contains__(self, item):
|
|
33
|
+
return item in self._columns
|
|
34
|
+
|
|
35
|
+
def __getitem__(self, item):
|
|
36
|
+
return self._columns[item]
|
|
37
|
+
|
|
38
|
+
def __setitem__(self, key, value):
|
|
39
|
+
if isinstance(value, _Operation):
|
|
40
|
+
value = self._set_var_from_operation(key, value)
|
|
41
|
+
elif isinstance(value, _StateBase):
|
|
42
|
+
value = value.copy(obj_ref=self, name=key)
|
|
43
|
+
elif key not in self._columns:
|
|
44
|
+
value = state.var(value).copy(obj_ref=self, name=key)
|
|
45
|
+
|
|
46
|
+
if key in self._columns:
|
|
47
|
+
self._owner._update_field(self._columns[key], value)
|
|
48
|
+
else:
|
|
49
|
+
self._declare_new_var(key, value)
|
|
50
|
+
self._columns[key] = value
|
|
51
|
+
|
|
52
|
+
def _set_var_from_operation(self, key, value):
|
|
53
|
+
if isinstance(value, _StateColumn):
|
|
54
|
+
assert not value.obj_ref, "You can't set state variable of one Source to another"
|
|
55
|
+
value.obj_ref = self._owner
|
|
56
|
+
value.name = key
|
|
57
|
+
else:
|
|
58
|
+
if not is_const(value):
|
|
59
|
+
assert (key in self._columns), "OneTick supports state variables creation with constants only"
|
|
60
|
+
else:
|
|
61
|
+
value = state.var(value).copy(obj_ref=self, name=key)
|
|
62
|
+
return value
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def items(self):
|
|
66
|
+
return tuple(self._columns.items()) # prevent mutation
|
|
67
|
+
|
|
68
|
+
@property
|
|
69
|
+
def names(self):
|
|
70
|
+
return tuple(self._columns.keys())
|
|
71
|
+
|
|
72
|
+
def _declare_new_var(self, name, value):
|
|
73
|
+
# obj_ref is None means that we need to declare it
|
|
74
|
+
base_type = value.dtype
|
|
75
|
+
str_type = ""
|
|
76
|
+
|
|
77
|
+
if isinstance(value, _TickSequence):
|
|
78
|
+
# TODO: maybe create definition() for _StateColumn too and move this logic there
|
|
79
|
+
str_type = value._definition()
|
|
80
|
+
else:
|
|
81
|
+
str_type = type2str(base_type)
|
|
82
|
+
|
|
83
|
+
expression = f'{str_type} {name}'
|
|
84
|
+
|
|
85
|
+
import onetick.py as otp
|
|
86
|
+
if value.default_value is not None:
|
|
87
|
+
if isinstance(value.default_value, otp.Source):
|
|
88
|
+
value_expression = otp.eval(value.default_value).to_eval_string(self._owner._tmp_otq)
|
|
89
|
+
else:
|
|
90
|
+
# TODO: PY-952: use to_eval_string(self._owner._tmp_otq) here if otp.eval is passed
|
|
91
|
+
value_expression = value2str(value.default_value)
|
|
92
|
+
expression += f' = {value_expression}'
|
|
93
|
+
self._owner.sink(otq.DeclareStateVariables(variables=expression, scope=value.scope))
|
|
File without changes
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import onetick.py as otp
|
|
2
|
+
import onetick.py.types as ott
|
|
3
|
+
from onetick.py.core.column import _Column
|
|
4
|
+
from onetick.py.core.column_operations.base import _Operation
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class _SymbolParamColumn(_Column):
|
|
8
|
+
"""
|
|
9
|
+
Internal object representing OneTick's symbol parameters.
|
|
10
|
+
Can be used in other onetick.py methods to specify if object is symbol parameter.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def __init__(self, *args, default=None, **kwargs):
|
|
14
|
+
super().__init__(*args, **kwargs)
|
|
15
|
+
self._default = default
|
|
16
|
+
|
|
17
|
+
def __str__(self):
|
|
18
|
+
result = super().__str__()
|
|
19
|
+
|
|
20
|
+
# TODO: PY-35
|
|
21
|
+
# This is ad-hoc check, really we need to change column formatting to
|
|
22
|
+
# pre- and post-formats, and copy columns through the .copy() method
|
|
23
|
+
# on the _Column instead of copying them manually in different places
|
|
24
|
+
# of the _Source class
|
|
25
|
+
if self.name != '_SYMBOL_NAME':
|
|
26
|
+
result = f'_SYMBOL_PARAM.{self.name}'
|
|
27
|
+
|
|
28
|
+
if self._default is not None:
|
|
29
|
+
default_formatted = ott.value2str(self._default)
|
|
30
|
+
default_formatted = f'TOSTRING({default_formatted})'
|
|
31
|
+
result = f'CASE(UNDEFINED("{result}"), false, {result}, {default_formatted})'
|
|
32
|
+
|
|
33
|
+
# symbol params are always string, need to convert
|
|
34
|
+
result = _Operation(op_str=result, dtype=str)
|
|
35
|
+
|
|
36
|
+
if self.dtype is ott.nsectime:
|
|
37
|
+
result = result.str.to_datetime(unit='ns')
|
|
38
|
+
elif self.dtype is ott.msectime:
|
|
39
|
+
result = result.str.to_datetime(unit='ms')
|
|
40
|
+
else:
|
|
41
|
+
result = result.astype(self.dtype)
|
|
42
|
+
|
|
43
|
+
return str(result)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class _SymbolParamSource:
|
|
47
|
+
"""
|
|
48
|
+
Internal container that provides access to symbol parameters.
|
|
49
|
+
The object is read-only, you can only get symbol parameters with it.
|
|
50
|
+
"""
|
|
51
|
+
|
|
52
|
+
def __init__(self, **columns):
|
|
53
|
+
|
|
54
|
+
if 'name' in columns:
|
|
55
|
+
raise ValueError(
|
|
56
|
+
'name field is a specific field for accessing _SYMBOL_NAME variable, please rename your parameter'
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
# "SYMBOL_NAME" field won't be propagated as a symbol parameter by onetick, so we should remove it here
|
|
60
|
+
columns.pop('SYMBOL_NAME', None)
|
|
61
|
+
|
|
62
|
+
for key, dtype in columns.items():
|
|
63
|
+
# TODO: change to immutable Column, PY-35
|
|
64
|
+
self.__dict__[key] = _SymbolParamColumn(key, dtype, self)
|
|
65
|
+
|
|
66
|
+
self.__dict__['name'] = _SymbolParamColumn('_SYMBOL_NAME', str, self)
|
|
67
|
+
self.__dict__['_SYMBOL_NAME'] = self.__dict__['name']
|
|
68
|
+
|
|
69
|
+
# set schema
|
|
70
|
+
schema = columns.copy()
|
|
71
|
+
|
|
72
|
+
for meta_c in otp.meta_fields.get_onetick_fields_and_types():
|
|
73
|
+
schema.pop(meta_c, None)
|
|
74
|
+
|
|
75
|
+
self.__dict__['_schema'] = schema
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def schema(self):
|
|
79
|
+
"""
|
|
80
|
+
Represents actual python data schema in the column name -> type format.
|
|
81
|
+
"""
|
|
82
|
+
return self._schema
|
|
83
|
+
|
|
84
|
+
def __getitem__(self, key):
|
|
85
|
+
"""
|
|
86
|
+
Get symbol parameter with corresponding ``key``.
|
|
87
|
+
Raises an error if such column does not exist.
|
|
88
|
+
"""
|
|
89
|
+
if key not in self.__dict__:
|
|
90
|
+
raise AttributeError(f"There is no '{key}' column")
|
|
91
|
+
|
|
92
|
+
return self.__dict__[key]
|
|
93
|
+
|
|
94
|
+
def __setattr__(self, key, value):
|
|
95
|
+
raise NotImplementedError('Symbol params are read only')
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
from typing import Dict
|
|
2
|
+
import collections.abc
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class Schema(collections.abc.Mapping):
|
|
6
|
+
"""
|
|
7
|
+
A source data schema proxy. It allows to work with source schema in
|
|
8
|
+
a frozen-dict manner. It also allows to set using the ``set``
|
|
9
|
+
and update a source schema using the ``update`` methods.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
dict_cls = dict
|
|
13
|
+
|
|
14
|
+
def __init__(self, _base_source=None, _hidden_columns=None, **kwargs):
|
|
15
|
+
self._dict = self.dict_cls(**kwargs)
|
|
16
|
+
self._base_source = _base_source
|
|
17
|
+
self._hash = None
|
|
18
|
+
self._hidden_columns = _hidden_columns if _hidden_columns else {}
|
|
19
|
+
|
|
20
|
+
def __getitem__(self, item):
|
|
21
|
+
if isinstance(item, list):
|
|
22
|
+
return {key: value for key, value in self._dict.items()
|
|
23
|
+
if key in item}
|
|
24
|
+
|
|
25
|
+
if item in self._hidden_columns:
|
|
26
|
+
return self._hidden_columns[item]
|
|
27
|
+
|
|
28
|
+
return self._dict[item]
|
|
29
|
+
|
|
30
|
+
def __setitem__(self, key, value):
|
|
31
|
+
self.update(**{key: value})
|
|
32
|
+
|
|
33
|
+
def __contains__(self, item):
|
|
34
|
+
if item in self._hidden_columns:
|
|
35
|
+
return True
|
|
36
|
+
|
|
37
|
+
return item in self._dict
|
|
38
|
+
|
|
39
|
+
def __iter__(self):
|
|
40
|
+
return iter(self._dict)
|
|
41
|
+
|
|
42
|
+
def items(self):
|
|
43
|
+
return self._dict.items()
|
|
44
|
+
|
|
45
|
+
def keys(self):
|
|
46
|
+
return self._dict.keys()
|
|
47
|
+
|
|
48
|
+
def copy(self):
|
|
49
|
+
return self._dict.copy()
|
|
50
|
+
|
|
51
|
+
def set(self, **new_schema: type):
|
|
52
|
+
"""
|
|
53
|
+
Drops the python schema representation of a source and sets the new one from the `new_schema`
|
|
54
|
+
|
|
55
|
+
Parameters
|
|
56
|
+
----------
|
|
57
|
+
new_schema: Dict[str, type]
|
|
58
|
+
schema in the column-name -> type format
|
|
59
|
+
|
|
60
|
+
Returns
|
|
61
|
+
-------
|
|
62
|
+
None
|
|
63
|
+
"""
|
|
64
|
+
self._base_source.set_schema(**new_schema)
|
|
65
|
+
|
|
66
|
+
def update(self, **other_schema: type):
|
|
67
|
+
"""
|
|
68
|
+
Updates the python schema representation of a source: values from matching keys
|
|
69
|
+
will be overridden from the `other_schema`, values from new keys will be added.
|
|
70
|
+
|
|
71
|
+
Parameters
|
|
72
|
+
----------
|
|
73
|
+
other_schema:
|
|
74
|
+
schema in the column-name -> type format
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
None
|
|
79
|
+
"""
|
|
80
|
+
current_schema = self._base_source.columns(skip_meta_fields=True)
|
|
81
|
+
current_schema.update(other_schema)
|
|
82
|
+
|
|
83
|
+
self._base_source.set_schema(**current_schema)
|
|
84
|
+
|
|
85
|
+
def __len__(self):
|
|
86
|
+
return len(self._dict)
|
|
87
|
+
|
|
88
|
+
def __repr__(self):
|
|
89
|
+
return repr(self._dict)
|
|
90
|
+
|
|
91
|
+
def __hash__(self):
|
|
92
|
+
if self._hash is None:
|
|
93
|
+
h = 0
|
|
94
|
+
for key, value in self._dict.items():
|
|
95
|
+
h ^= hash((key, value))
|
|
96
|
+
self._hash = h
|
|
97
|
+
return self._hash
|
|
File without changes
|