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,142 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Tuple
|
|
2
|
+
|
|
3
|
+
from onetick import py as otp
|
|
4
|
+
from onetick.py.otq import otq
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
from onetick.py.core.source import Source
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def split(self: 'Source', expr, cases, default=False) -> Tuple['Source', ...]:
|
|
11
|
+
"""
|
|
12
|
+
The method splits data using passed expression ``expr`` for several
|
|
13
|
+
outputs by passed ``cases``. The method is the alias for the :meth:`Source.switch`
|
|
14
|
+
|
|
15
|
+
Parameters
|
|
16
|
+
----------
|
|
17
|
+
expr : Operation
|
|
18
|
+
column or column based expression
|
|
19
|
+
cases : list
|
|
20
|
+
list of values or :py:class:`onetick.py.range` objects to split by
|
|
21
|
+
default : bool
|
|
22
|
+
``True`` adds the default output
|
|
23
|
+
|
|
24
|
+
Returns
|
|
25
|
+
-------
|
|
26
|
+
Outputs according to passed cases, number of outputs is number of cases plus one if ``default=True``
|
|
27
|
+
|
|
28
|
+
See also
|
|
29
|
+
--------
|
|
30
|
+
| :meth:`Source.switch`
|
|
31
|
+
| **SWITCH** OneTick event processor
|
|
32
|
+
|
|
33
|
+
Examples
|
|
34
|
+
--------
|
|
35
|
+
>>> # OTdirective: snippet-name: Source operations.split;
|
|
36
|
+
>>> data = otp.Ticks(X=[0.33, -5.1, otp.nan, 9.4])
|
|
37
|
+
>>> r1, r2, r3 = data.split(data['X'], [otp.nan, otp.range(0, 100)], default=True)
|
|
38
|
+
>>> otp.run(r1)
|
|
39
|
+
Time X
|
|
40
|
+
0 2003-12-01 00:00:00.002 NaN
|
|
41
|
+
>>> otp.run(r2)
|
|
42
|
+
Time X
|
|
43
|
+
0 2003-12-01 00:00:00.000 0.33
|
|
44
|
+
1 2003-12-01 00:00:00.003 9.40
|
|
45
|
+
>>> otp.run(r3)
|
|
46
|
+
Time X
|
|
47
|
+
0 2003-12-01 00:00:00.001 -5.1
|
|
48
|
+
|
|
49
|
+
See Also
|
|
50
|
+
--------
|
|
51
|
+
Source.switch
|
|
52
|
+
:py:class:`onetick.py.range`
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
output_num = len(cases)
|
|
56
|
+
|
|
57
|
+
# format cases
|
|
58
|
+
def to_str(v):
|
|
59
|
+
if isinstance(v, otp.utils.range):
|
|
60
|
+
return "[" + str(v.start) + "," + str(v.stop) + "]"
|
|
61
|
+
elif isinstance(v, str):
|
|
62
|
+
return '"' + v + '"'
|
|
63
|
+
elif isinstance(v, tuple):
|
|
64
|
+
return ",".join(map(to_str, list(v)))
|
|
65
|
+
|
|
66
|
+
return str(v)
|
|
67
|
+
|
|
68
|
+
cases = [f"{to_str(cases[inx])}:OUT{inx}" for inx in range(output_num)]
|
|
69
|
+
|
|
70
|
+
# create ep
|
|
71
|
+
params = dict(switch=str(expr), cases=";".join(cases))
|
|
72
|
+
if default:
|
|
73
|
+
params["default_output"] = "DEF_OUT"
|
|
74
|
+
|
|
75
|
+
switch_branch = self.copy(ep=otq.SwitchEp(**params))
|
|
76
|
+
|
|
77
|
+
# construct results
|
|
78
|
+
result = []
|
|
79
|
+
|
|
80
|
+
for inx in range(output_num):
|
|
81
|
+
res = switch_branch.copy()
|
|
82
|
+
res.node().out_pin(f"OUT{inx}")
|
|
83
|
+
res.sink(otq.Passthrough())
|
|
84
|
+
|
|
85
|
+
result.append(res)
|
|
86
|
+
|
|
87
|
+
if default:
|
|
88
|
+
res = switch_branch.copy()
|
|
89
|
+
res.node().out_pin("DEF_OUT")
|
|
90
|
+
res.sink(otq.Passthrough())
|
|
91
|
+
|
|
92
|
+
result.append(res)
|
|
93
|
+
|
|
94
|
+
return tuple(result)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def switch(self: 'Source', expr, cases, default=False) -> Tuple['Source', ...]:
|
|
98
|
+
"""
|
|
99
|
+
The method splits data using passed expression for several
|
|
100
|
+
outputs by passed cases. This method is an alias for
|
|
101
|
+
:meth:`Source.split` method.
|
|
102
|
+
|
|
103
|
+
Parameters
|
|
104
|
+
----------
|
|
105
|
+
expr : Operation
|
|
106
|
+
column or column based expression
|
|
107
|
+
cases : list
|
|
108
|
+
list of values or :py:class:`onetick.py.range` objects to split by
|
|
109
|
+
default : bool
|
|
110
|
+
``True`` adds the default output
|
|
111
|
+
|
|
112
|
+
Returns
|
|
113
|
+
-------
|
|
114
|
+
Outputs according to passed cases, number of outputs is number of cases plus one if ``default=True``
|
|
115
|
+
|
|
116
|
+
See also
|
|
117
|
+
--------
|
|
118
|
+
| :meth:`Source.split`
|
|
119
|
+
| **SWITCH** OneTick event processor
|
|
120
|
+
|
|
121
|
+
Examples
|
|
122
|
+
--------
|
|
123
|
+
>>> data = otp.Ticks(X=[0.33, -5.1, otp.nan, 9.4])
|
|
124
|
+
>>> r1, r2, r3 = data.switch(data['X'], [otp.nan, otp.range(0, 100)], default=True)
|
|
125
|
+
>>> otp.run(r1)
|
|
126
|
+
Time X
|
|
127
|
+
0 2003-12-01 00:00:00.002 NaN
|
|
128
|
+
>>> otp.run(r2)
|
|
129
|
+
Time X
|
|
130
|
+
0 2003-12-01 00:00:00.000 0.33
|
|
131
|
+
1 2003-12-01 00:00:00.003 9.40
|
|
132
|
+
>>> otp.run(r3)
|
|
133
|
+
Time X
|
|
134
|
+
0 2003-12-01 00:00:00.001 -5.1
|
|
135
|
+
|
|
136
|
+
See Also
|
|
137
|
+
--------
|
|
138
|
+
Source.split
|
|
139
|
+
:py:class:`onetick.py.range`
|
|
140
|
+
"""
|
|
141
|
+
|
|
142
|
+
return self.split(expr, cases, default)
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Optional, Union
|
|
2
|
+
|
|
3
|
+
from onetick.py import types as ott
|
|
4
|
+
from onetick.py.core.column_operations.base import _Operation
|
|
5
|
+
from onetick.py.otq import otq
|
|
6
|
+
|
|
7
|
+
from .misc import inplace_operation
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
import onetick.py as otp
|
|
11
|
+
from onetick.py.core.source import Source
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@inplace_operation
|
|
15
|
+
def show_symbol_name_in_db(self: 'Source', inplace=False) -> Optional['Source']:
|
|
16
|
+
"""
|
|
17
|
+
Adds the **SYMBOL_NAME_IN_DB** field to input ticks,
|
|
18
|
+
indicating the symbol name of the tick in the database.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
inplace: bool
|
|
23
|
+
The flag controls whether operation should be applied inplace or not.
|
|
24
|
+
If ``inplace=True``, then it returns nothing.
|
|
25
|
+
Otherwise method returns a new modified object.
|
|
26
|
+
|
|
27
|
+
See also
|
|
28
|
+
--------
|
|
29
|
+
**SHOW_SYMBOL_NAME_IN_DB** OneTick event processor
|
|
30
|
+
|
|
31
|
+
Returns
|
|
32
|
+
-------
|
|
33
|
+
:class:`Source` or ``None``
|
|
34
|
+
|
|
35
|
+
Examples
|
|
36
|
+
--------
|
|
37
|
+
|
|
38
|
+
For example, it can be used to display
|
|
39
|
+
the actual symbol name for the contract (e.g., **ESM23**)
|
|
40
|
+
instead of the artificial continuous name **ES_r_tdi**.
|
|
41
|
+
Notice how actual symbol name can be different for each tick,
|
|
42
|
+
e.g. in this case it is different for each month.
|
|
43
|
+
|
|
44
|
+
>>> data = otp.DataSource('TDI_FUT', tick_type='TRD') # doctest: +SKIP
|
|
45
|
+
>>> data = data[['PRICE']] # doctest: +SKIP
|
|
46
|
+
>>> data = data.first(bucket_interval=31, bucket_units='days') # doctest: +SKIP
|
|
47
|
+
>>> data['SYMBOL_NAME'] = data.Symbol.name # doctest: +SKIP
|
|
48
|
+
>>> data = data.show_symbol_name_in_db() # doctest: +SKIP
|
|
49
|
+
>>> otp.run(data, # doctest: +SKIP
|
|
50
|
+
... symbols='ES_r_tdi', symbol_date=otp.dt(2023, 3, 1),
|
|
51
|
+
... start=otp.dt(2023, 3, 1), end=otp.dt(2023, 5, 1))
|
|
52
|
+
Time PRICE SYMBOL_NAME SYMBOL_NAME_IN_DB
|
|
53
|
+
0 2023-03-01 00:00:00.549 3976.75 ES_r_tdi ESH23
|
|
54
|
+
1 2023-04-02 18:00:00.039 4127.00 ES_r_tdi ESM23
|
|
55
|
+
"""
|
|
56
|
+
if 'SYMBOL_NAME_IN_DB' in self.schema:
|
|
57
|
+
raise ValueError("Column 'SYMBOL_NAME_IN_DB' already exists.")
|
|
58
|
+
self.sink(otq.ShowSymbolNameInDb())
|
|
59
|
+
self.schema['SYMBOL_NAME_IN_DB'] = str
|
|
60
|
+
return self
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@inplace_operation
|
|
64
|
+
def modify_symbol_name(
|
|
65
|
+
self: 'Source', symbol_name: Union[str, 'otp.Operation', 'otp.Column'], inplace=False
|
|
66
|
+
) -> Optional['Source']:
|
|
67
|
+
"""
|
|
68
|
+
Modifies the name of the symbol that provides input ticks for this node.
|
|
69
|
+
Uses MODIFY_SYMBOL_NAME EP.
|
|
70
|
+
|
|
71
|
+
Parameters
|
|
72
|
+
----------
|
|
73
|
+
symbol_name: str, :py:class:`~onetick.py.Column`, :py:class:`~onetick.py.Operation`
|
|
74
|
+
String or expression with new `SYMBOL_NAME` value.
|
|
75
|
+
New `SYMBOL_NAME` must not depend on ticks, if set via expression.
|
|
76
|
+
inplace: bool
|
|
77
|
+
The flag controls whether operation should be applied inplace or not.
|
|
78
|
+
If ``inplace=True``, then it returns nothing.
|
|
79
|
+
Otherwise method returns a new modified object.
|
|
80
|
+
|
|
81
|
+
See also
|
|
82
|
+
--------
|
|
83
|
+
**MODIFY_SYMBOL_NAME** OneTick event processor
|
|
84
|
+
|
|
85
|
+
Returns
|
|
86
|
+
-------
|
|
87
|
+
:class:`Source` or ``None``
|
|
88
|
+
|
|
89
|
+
Examples
|
|
90
|
+
--------
|
|
91
|
+
Replacing with static string:
|
|
92
|
+
|
|
93
|
+
>>> data = otp.DataSource('SOME_DB', symbol='S1', tick_type='TT')
|
|
94
|
+
>>> data = data.modify_symbol_name(symbol_name='S2')
|
|
95
|
+
>>> otp.run(data)
|
|
96
|
+
Time X
|
|
97
|
+
0 2003-12-01 00:00:00.000 -3
|
|
98
|
+
1 2003-12-01 00:00:00.001 -2
|
|
99
|
+
2 2003-12-01 00:00:00.002 -1
|
|
100
|
+
|
|
101
|
+
Replacing with expression:
|
|
102
|
+
|
|
103
|
+
>>> data = otp.DataSource('SOME_DB', symbol='S2', tick_type='TT')
|
|
104
|
+
>>> data = data.modify_symbol_name(symbol_name=data['_SYMBOL_NAME'].str.replace('2', '1'))
|
|
105
|
+
>>> otp.run(data)
|
|
106
|
+
Time X
|
|
107
|
+
0 2003-12-01 00:00:00.000 1
|
|
108
|
+
1 2003-12-01 00:00:00.001 2
|
|
109
|
+
2 2003-12-01 00:00:00.002 3
|
|
110
|
+
|
|
111
|
+
"""
|
|
112
|
+
if not isinstance(symbol_name, (str, _Operation)):
|
|
113
|
+
raise ValueError("Unsupported symbol_name argument value type")
|
|
114
|
+
|
|
115
|
+
self.sink(otq.ModifySymbolName(symbol_name=ott.value2str(symbol_name)))
|
|
116
|
+
|
|
117
|
+
return self
|