onetick-py 1.169.0__py3-none-any.whl → 1.170.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.
onetick/py/_version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  # This file was generated automatically. DO NOT CHANGE.
2
- VERSION = '1.169.0'
2
+ VERSION = '1.170.0'
@@ -956,7 +956,7 @@ def generic(*args, **kwargs):
956
956
 
957
957
  >>> data = otp.Ticks({'A': [1, 2, 1]})
958
958
  >>> def count_values(source, value):
959
- ... values, _ = source[source['A'] == value]
959
+ ... values = source.where(source['A'] == value)
960
960
  ... return values.agg({'count': otp.agg.count()})
961
961
  >>> data = otp.agg.generic(count_values).apply(data, value=1)
962
962
  >>> otp.run(data)
@@ -146,6 +146,8 @@ class _OrderBookAggregation(_Aggregation, ABC):
146
146
  self.max_initialization_days = max_initialization_days
147
147
  self.book_uncross_method = book_uncross_method
148
148
  self.dq_events_that_clear_book = ','.join(dq_events_that_clear_book) if dq_events_that_clear_book else None
149
+ self.bound_symbols = None
150
+
149
151
  super().__init__(_Column('TIMESTAMP'), *args, **kwargs)
150
152
 
151
153
  def _param_validation(self):
@@ -170,6 +172,19 @@ class _OrderBookAggregation(_Aggregation, ABC):
170
172
  raise TypeError(f"Aggregation `{self.NAME}` need these columns: "
171
173
  f"BUY_SELL_FLAG, PRICE, SIZE and (UPDATE_TIME or DELETED_TIME)")
172
174
 
175
+ def to_ep(self, *args, **kwargs):
176
+ ob_ep = super().to_ep(*args, **kwargs)
177
+ if self.bound_symbols:
178
+ ob_ep = ob_ep.symbols(self.bound_symbols)
179
+
180
+ return ob_ep
181
+
182
+ def set_bound_symbols(self, bound_symbols=None):
183
+ if isinstance(bound_symbols, str):
184
+ bound_symbols = [bound_symbols]
185
+
186
+ self.bound_symbols = bound_symbols
187
+
173
188
 
174
189
  class ObSnapshot(_OrderBookAggregation):
175
190
  NAME = 'OB_SNAPSHOT'
@@ -165,7 +165,7 @@ class _StateBase(ABC):
165
165
  data.state_vars['VAR'] = otp.state.tick_list()
166
166
  def fun(min_value):
167
167
  t = otp.Ticks(X=[123, 234])
168
- t, _ = t[t['X'] > min_value]
168
+ t = t.where(t['X'] > min_value)
169
169
  return t
170
170
  data = data.state_vars['VAR'].modify_from_query(fun, params={'min_value': 200})
171
171
  data = data.state_vars['VAR'].dump()
@@ -344,8 +344,9 @@ class _TickSequence(_StateBase):
344
344
  def __init__(self, name, obj_ref, default_value, scope, schema=None, **kwargs):
345
345
  if kwargs:
346
346
  raise ValueError(f"Unknown parameters for '{self.__class__.__name__}': {list(kwargs)}")
347
- if default_value is not None and not isinstance(default_value, _QueryEvalWrapper):
348
- raise ValueError('only otp.eval can be used as initial value for tick sequences')
347
+ from onetick.py.core.source import Source
348
+ if default_value is not None and not isinstance(default_value, (_QueryEvalWrapper, Source)):
349
+ raise ValueError('only otp.eval and otp.Source objects can be used as initial value for tick sequences')
349
350
  if default_value is not None and schema is not None:
350
351
  # TODO: check that the two schemas align or possibly that they are exactly the same
351
352
  pass
@@ -396,9 +397,13 @@ class _TickSequence(_StateBase):
396
397
  self._schema = None
397
398
  if not self._schema:
398
399
  if self.default_value is not None:
399
- # If tick sequence is initialized from eval,
400
- # then we get schema from the Source in eval.
401
- self._schema = self.default_value.query.schema.copy()
400
+ from onetick.py.core.source import Source
401
+ if isinstance(self.default_value, _QueryEvalWrapper):
402
+ # If tick sequence is initialized from eval,
403
+ # then we get schema from the Source in eval.
404
+ self._schema = self.default_value.query.schema.copy()
405
+ elif isinstance(self.default_value, Source):
406
+ self._schema = self.default_value.schema.copy()
402
407
  else:
403
408
  # If tick sequence is initialized as empty,
404
409
  # then it's schema will be derived from the schema of the parent object (e.g. source)
@@ -81,7 +81,13 @@ class StateVars:
81
81
  str_type = type2str(base_type)
82
82
 
83
83
  expression = f'{str_type} {name}'
84
+
85
+ import onetick.py as otp
84
86
  if value.default_value is not None:
85
- # TODO: PY-952: use to_eval_string(self._owner._tmp_otq) here if otp.eval is passed
86
- expression += f' = {value2str(value.default_value)}'
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}'
87
93
  self._owner.sink(otq.DeclareStateVariables(variables=expression, scope=value.scope))
@@ -394,7 +394,7 @@ def join_with_collection(
394
394
  >>>
395
395
  >>> trd_qte = trd_qte.state_vars['LAST_QUOTE_PER_EXCHANGE'].update(where=trd_qte['TICK_TYPE'] == 'QTE',
396
396
  ... value_fields=['ASK_PRICE', 'BID_PRICE'])
397
- >>> trd, _ = trd_qte[trd_qte['TICK_TYPE'] == 'TRD']
397
+ >>> trd = trd_qte.where(trd_qte['TICK_TYPE'] == 'TRD')
398
398
  >>> trd.drop(['ASK_PRICE', 'BID_PRICE', 'EXCHANGE'], inplace=True)
399
399
  >>> trd = trd.join_with_collection('LAST_QUOTE_PER_EXCHANGE')
400
400
  >>> otp.run(trd)[['PRICE', 'SIZE', 'EXCHANGE', 'ASK_PRICE', 'BID_PRICE']]
@@ -227,7 +227,7 @@ class _StrAccessor(_Accessor):
227
227
 
228
228
  >>> q = otp.DataSource('US_COMP', tick_type='TRD', symbols=['SPY']) # doctest: +SKIP
229
229
  >>> q = q[['PRICE', 'SIZE', 'COND', 'EXCHANGE']] # doctest: +SKIP
230
- >>> q, _ = q[q['COND'].str.match('^[^O6TUHILNRWZ47QMBCGPV]*$')] # doctest: +SKIP
230
+ >>> q = q.where(q['COND'].str.match('^[^O6TUHILNRWZ47QMBCGPV]*$')) # doctest: +SKIP
231
231
  >>> otp.run(q, start=otp.dt(2023, 5, 15, 9, 30), end=otp.dt(2023, 5, 15, 9, 30, 1)) # doctest: +SKIP
232
232
  Time PRICE SIZE COND EXCHANGE
233
233
  0 2023-05-15 09:30:00.000776704 412.220 247 Z
@@ -1225,7 +1225,7 @@ class _StrAccessor(_Accessor):
1225
1225
  This function can be used to filter out ticks:
1226
1226
 
1227
1227
  >>> data = otp.Ticks(X=['a', 'ab', 'b_', 'b%'])
1228
- >>> data, _ = data[data['X'].str.like('a%')]
1228
+ >>> data = data.where(data['X'].str.like('a%'))
1229
1229
  >>> otp.run(data)
1230
1230
  Time X
1231
1231
  0 2003-12-01 00:00:00.000 a
@@ -1335,7 +1335,7 @@ class _StrAccessor(_Accessor):
1335
1335
  :skipif: not is_ilike_supported()
1336
1336
 
1337
1337
  data = otp.Ticks(X=['a', 'ab', 'Ab', 'b_'])
1338
- data, _ = data[data['X'].str.ilike('a%')]
1338
+ data = data.where(data['X'].str.ilike('a%'))
1339
1339
  df = otp.run(data)
1340
1340
  print(df)
1341
1341
 
@@ -725,7 +725,7 @@ class Operation:
725
725
  Examples
726
726
  --------
727
727
  >>> t = otp.Ticks(A=range(4))
728
- >>> t, _ = t[~(t['A'] > 1)]
728
+ >>> t = t.where(~(t['A'] > 1))
729
729
  >>> otp.run(t)[['A']]
730
730
  A
731
731
  0 0
@@ -741,7 +741,7 @@ class Operation:
741
741
  Examples
742
742
  --------
743
743
  >>> t = otp.Ticks(A=range(4))
744
- >>> t, _ = t[(t['A'] == 1)]
744
+ >>> t = t.where((t['A'] == 1))
745
745
  >>> otp.run(t)[['A']]
746
746
  A
747
747
  0 1
@@ -756,7 +756,7 @@ class Operation:
756
756
  Examples
757
757
  --------
758
758
  >>> t = otp.Ticks(A=range(4))
759
- >>> t, _ = t[(t['A'] != 1)]
759
+ >>> t = t.where((t['A'] != 1))
760
760
  >>> otp.run(t)[['A']]
761
761
  A
762
762
  0 0
@@ -773,7 +773,7 @@ class Operation:
773
773
  Examples
774
774
  --------
775
775
  >>> t = otp.Ticks(A=range(4))
776
- >>> t, _ = t[(t['A'] == 1) | (t['A'] == 2)]
776
+ >>> t = t.where((t['A'] == 1) | (t['A'] == 2))
777
777
  >>> otp.run(t)[['A']]
778
778
  A
779
779
  0 1
@@ -789,7 +789,7 @@ class Operation:
789
789
  Examples
790
790
  --------
791
791
  >>> t = otp.Ticks(A=[1, 1], B=[1, 2])
792
- >>> t, _ = t[(t['A'] == 1) & (t['B'] == 1)]
792
+ >>> t = t.where((t['A'] == 1) & (t['B'] == 1))
793
793
  >>> otp.run(t)[['A', 'B']]
794
794
  A B
795
795
  0 1 1
@@ -804,7 +804,7 @@ class Operation:
804
804
  Examples
805
805
  --------
806
806
  >>> t = otp.Ticks(A=range(4))
807
- >>> t, _ = t[t['A'] <= 2]
807
+ >>> t = t.where(t['A'] <= 2)
808
808
  >>> otp.run(t)[['A']]
809
809
  A
810
810
  0 0
@@ -821,7 +821,7 @@ class Operation:
821
821
  Examples
822
822
  --------
823
823
  >>> t = otp.Ticks(A=range(4))
824
- >>> t, _ = t[t['A'] < 2]
824
+ >>> t = t.where(t['A'] < 2)
825
825
  >>> otp.run(t)[['A']]
826
826
  A
827
827
  0 0
@@ -837,7 +837,7 @@ class Operation:
837
837
  Examples
838
838
  --------
839
839
  >>> t = otp.Ticks(A=range(4))
840
- >>> t, _ = t[t['A'] >= 2]
840
+ >>> t = t.where(t['A'] >= 2)
841
841
  >>> otp.run(t)[['A']]
842
842
  A
843
843
  0 2
@@ -853,7 +853,7 @@ class Operation:
853
853
  Examples
854
854
  --------
855
855
  >>> t = otp.Ticks(A=range(4))
856
- >>> t, _ = t[t['A'] > 2]
856
+ >>> t = t.where(t['A'] > 2)
857
857
  >>> otp.run(t)[['A']]
858
858
  A
859
859
  0 3
@@ -171,7 +171,7 @@ def eval(query, symbol=None, start=None, end=None,
171
171
  >>> data = otp.Ticks(X=[1, 2, 3])
172
172
  >>> # note that in this case column WHERE must be specified,
173
173
  >>> # because evaluated query returns tick with more than one field
174
- >>> data, _ = data[otp.eval(get_filter, a=0, b=2)['WHERE']]
174
+ >>> data = data.where(otp.eval(get_filter, a=0, b=2)['WHERE'])
175
175
  >>> otp.run(data)
176
176
  Time X
177
177
  0 2003-12-01 1
@@ -183,12 +183,12 @@ def eval(query, symbol=None, start=None, end=None,
183
183
  ... 'TICK_TYPE': ['TRD', 'QTE'],
184
184
  ... 'WHERE': ['PRICE>=1.4', 'ASK_PRICE>=1.4']
185
185
  ... })
186
- ... res, _ = res[res['TICK_TYPE'] == tick_type]
186
+ ... res = res.where(res['TICK_TYPE'] == tick_type)
187
187
  ... return res.drop(['TICK_TYPE'])
188
188
  >>> t = otp.DataSource('US_COMP::TRD')
189
189
  >>> # note that in this case column WHERE do not need to be specified,
190
190
  >>> # because evaluated query returns tick with only one field
191
- >>> t, _ = t[otp.eval(filter_by_tt, tick_type=t['_TICK_TYPE'])]
191
+ >>> t = t.where(otp.eval(filter_by_tt, tick_type=t['_TICK_TYPE']))
192
192
  >>> otp.run(t, start=otp.dt(2022, 3, 1), end=otp.dt(2022, 3, 2))
193
193
  Time PRICE SIZE
194
194
  0 2022-03-01 00:00:00.001 1.4 10
@@ -977,14 +977,7 @@ class DataSource(Source):
977
977
  src = self._table_schema(src)
978
978
  return src
979
979
 
980
- def _base_ep_for_cross_symbol(
981
- self, db, symbol, tick_type, identify_input_ts,
982
- back_to_first_tick=0, keep_first_tick_timestamp=None,
983
- presort=utils.adaptive, batch_size=None, concurrency=utils.default,
984
- max_back_ticks_to_prepend=1,
985
- where_clause_for_back_ticks=None,
986
- symbol_date=None,
987
- ):
980
+ def _cross_symbol_convert(self, symbol, symbol_date=None):
988
981
  tmp_otq = TmpOtq()
989
982
 
990
983
  if isinstance(symbol, _QueryEvalWrapper):
@@ -996,6 +989,18 @@ class DataSource(Source):
996
989
  elif isinstance(symbol, (Source, otq.GraphQuery)):
997
990
  symbol = Source._convert_symbol_to_string(symbol, tmp_otq, symbol_date=symbol_date)
998
991
 
992
+ return symbol, tmp_otq
993
+
994
+ def _base_ep_for_cross_symbol(
995
+ self, db, symbol, tick_type, identify_input_ts,
996
+ back_to_first_tick=0, keep_first_tick_timestamp=None,
997
+ presort=utils.adaptive, batch_size=None, concurrency=utils.default,
998
+ max_back_ticks_to_prepend=1,
999
+ where_clause_for_back_ticks=None,
1000
+ symbol_date=None,
1001
+ ):
1002
+ symbol, tmp_otq = self._cross_symbol_convert(symbol, symbol_date)
1003
+
999
1004
  self.logger.info(f'symbol={symbol}')
1000
1005
 
1001
1006
  tick_type = convert_tick_type_to_str(tick_type, db)
@@ -1030,6 +1035,7 @@ class DataSource(Source):
1030
1035
  src.sink(
1031
1036
  otq.Merge(identify_input_ts=identify_input_ts).symbols(symbol).tick_type(tick_type)
1032
1037
  )
1038
+
1033
1039
  src._tmp_otq.merge(tmp_otq)
1034
1040
 
1035
1041
  src = self._table_schema(src)
@@ -15,6 +15,7 @@ from ..aggregations.order_book import (
15
15
  from ..aggregations.functions import (
16
16
  ob_snapshot, ob_snapshot_wide, ob_snapshot_flat, ob_summary, ob_size, ob_vwap, ob_num_levels,
17
17
  )
18
+ from .. import utils
18
19
 
19
20
  from .data_source import DataSource, DATA_SOURCE_DOC_PARAMS
20
21
 
@@ -24,17 +25,43 @@ class _ObSource(DataSource):
24
25
  OB_AGG_PARAMS: Iterable
25
26
  _PROPERTIES = DataSource._PROPERTIES + ['_ob_agg']
26
27
 
27
- def __init__(self, *args, schema=None, **kwargs):
28
- if self._try_default_constructor(*args, schema=schema, **kwargs):
28
+ def __init__(self, db=None, schema=None, **kwargs):
29
+ if self._try_default_constructor(schema=schema, **kwargs):
29
30
  return
30
31
 
31
32
  ob_agg_params = {
32
33
  param.name: kwargs.pop(param.name, param.default)
33
34
  for _, param in self.OB_AGG_PARAMS
34
35
  }
36
+
37
+ symbol_param = kwargs.get('symbol')
38
+ symbols_param = kwargs.get('symbols')
39
+
40
+ if symbol_param and symbols_param:
41
+ raise ValueError(
42
+ 'You have set the `symbol` and `symbols` parameters together, it is not allowed. '
43
+ 'Please, clarify parameters'
44
+ )
45
+
46
+ symbols = symbol_param if symbol_param else symbols_param
47
+ tmp_otq = None
48
+
49
+ # Use bound symbols only in case, if db not passed
50
+ use_bound_symbols = not db and symbols and symbols is not utils.adaptive
51
+ if use_bound_symbols:
52
+ symbols, tmp_otq = self._cross_symbol_convert(symbols, kwargs.get('symbol_date'))
53
+
54
+ if symbols_param:
55
+ del kwargs['symbols']
56
+
57
+ kwargs['symbol'] = None
58
+
35
59
  self._ob_agg = self.__class__.OB_AGG_FUNC(**ob_agg_params)
36
60
 
37
- super().__init__(*args, schema=schema, **kwargs)
61
+ if use_bound_symbols:
62
+ self._ob_agg.set_bound_symbols(symbols)
63
+
64
+ super().__init__(db=db, schema=schema, **kwargs)
38
65
 
39
66
  ob_agg_output_schema = self._ob_agg._get_output_schema(otp.Empty())
40
67
 
@@ -43,6 +70,9 @@ class _ObSource(DataSource):
43
70
  else:
44
71
  self.schema.set(**ob_agg_output_schema)
45
72
 
73
+ if tmp_otq:
74
+ self._tmp_otq.merge(tmp_otq)
75
+
46
76
  def base_ep(self, *args, **kwargs):
47
77
  src = super().base_ep(*args, **kwargs)
48
78
  return self._ob_agg.apply(src)
@@ -5,6 +5,8 @@ from onetick.py.otq import otq
5
5
 
6
6
  from onetick.py.core.source import Source
7
7
  from onetick.py.core.column_operations.base import Raw, OnetickParameter
8
+ from onetick.py.core.eval_query import _QueryEvalWrapper
9
+ from onetick.py.core._source.tmp_otq import TmpOtq
8
10
 
9
11
  from .. import types as ott
10
12
  from .. import utils
@@ -20,7 +22,7 @@ class Symbols(Source):
20
22
 
21
23
  Parameters
22
24
  ----------
23
- db: str
25
+ db: str, :py:func:`eval query <onetick.py.eval>`
24
26
  Name of the database where to search symbols.
25
27
  By default the database used by :py:func:`otp.run <onetick.py.run>` will be inherited.
26
28
  keep_db: bool
@@ -276,9 +278,13 @@ class Symbols(Source):
276
278
  end = date.end
277
279
 
278
280
  _symbol = utils.adaptive
281
+ _tmp_otq = None
279
282
  if db:
280
283
  if isinstance(db, list):
281
284
  _symbol = [f"{str(_db).split(':')[0]}::" for _db in db] # noqa
285
+ elif isinstance(db, _QueryEvalWrapper):
286
+ _tmp_otq = TmpOtq()
287
+ _symbol = db.to_eval_string(tmp_otq=_tmp_otq)
282
288
  else:
283
289
  _symbol = f"{str(db).split(':')[0]}::" # noqa
284
290
 
@@ -336,6 +342,9 @@ class Symbols(Source):
336
342
  if _find_params['symbology'] and _find_params['show_original_symbols']:
337
343
  self.schema['ORIGINAL_SYMBOL_NAME'] = str
338
344
 
345
+ if _tmp_otq:
346
+ self._tmp_otq.merge(_tmp_otq)
347
+
339
348
  def base_ep(self, ep_tick_type, keep_db, **params):
340
349
  src = Source(otq.FindDbSymbols(**params))
341
350
 
onetick/py/state.py CHANGED
@@ -75,7 +75,7 @@ def tick_list(default_value=None, scope='query', schema=None) -> TickList:
75
75
 
76
76
  Parameters
77
77
  ----------
78
- default_value: :py:func:`eval query <onetick.py.eval>`
78
+ default_value: :class:`otp.Source <onetick.py.Source>`, :py:func:`eval query <onetick.py.eval>`
79
79
  Evaluated query to initialize tick list from.
80
80
  scope: str
81
81
  Scope for the state variable.
@@ -85,14 +85,12 @@ def tick_list(default_value=None, scope='query', schema=None) -> TickList:
85
85
  if ``default_value`` is not passed as well, schema will contain fields of the main Source object.
86
86
 
87
87
  If schema is passed as a list, it will select only these fields from the schema of ``default_value``
88
- or main Source object.
88
+ or main :class:`Source <onetick.py.Source>` object.
89
89
 
90
90
  Examples
91
91
  --------
92
- >>> def fsq():
93
- ... return otp.Ticks(B=[1, 2, 3])
94
92
  >>> data = otp.Tick(A=1)
95
- >>> data.state_vars['LIST'] = otp.state.tick_list(otp.eval(fsq))
93
+ >>> data.state_vars['LIST'] = otp.state.tick_list(otp.Ticks(B=[1, 2, 3]))
96
94
  >>> data = data.state_vars['LIST'].dump()
97
95
  >>> otp.run(data)[['B']]
98
96
  B
@@ -115,7 +113,7 @@ def tick_set(insertion_policy, key_fields, default_value=None, scope='query', sc
115
113
  'latest' makes the last inserted tick overwrite the one with the same keys (if existing).
116
114
  key_fields: str, list of str
117
115
  The values of the specified fields will be used as keys.
118
- default_value: :py:func:`eval query <onetick.py.eval>`
116
+ default_value: :class:`otp.Source <onetick.py.Source>`, :py:func:`eval query <onetick.py.eval>`
119
117
  Evaluated query to initialize tick set from.
120
118
  scope: str
121
119
  Scope for the state variable.
@@ -125,14 +123,12 @@ def tick_set(insertion_policy, key_fields, default_value=None, scope='query', sc
125
123
  if ``default_value`` is not passed as well, schema will contain fields of the main Source object.
126
124
 
127
125
  If schema is passed as a list, it will select only these fields from the schema of ``default_value``
128
- or main Source object.
126
+ or main :class:`Source <onetick.py.Source>` object.
129
127
 
130
128
  Examples
131
129
  --------
132
- >>> def fsq():
133
- ... return otp.Ticks(B=[1, 1, 2, 2, 3, 3])
134
130
  >>> data = otp.Tick(A=1)
135
- >>> data.state_vars['SET'] = otp.state.tick_set('oldest', 'B', otp.eval(fsq))
131
+ >>> data.state_vars['SET'] = otp.state.tick_set('oldest', 'B', otp.Ticks(B=[1, 1, 2, 2, 3, 3]))
136
132
  >>> data = data.state_vars['SET'].dump()
137
133
  >>> otp.run(data)[['B']]
138
134
  B
@@ -175,7 +171,7 @@ def tick_set_unordered(insertion_policy,
175
171
  may be considerably worse than that of normal tick set.
176
172
  In particular, **default value of -1 will lead to bad performance and should be avoided**
177
173
 
178
- default_value: :py:func:`eval query <onetick.py.eval>`
174
+ default_value: :class:`otp.Source <onetick.py.Source>`, :py:func:`eval query <onetick.py.eval>`
179
175
  Evaluated query to initialize unordered tick set from.
180
176
  scope: str,
181
177
  Scope for the state variable.
@@ -186,14 +182,14 @@ def tick_set_unordered(insertion_policy,
186
182
  if ``default_value`` is not passed as well, schema will contain fields of the main Source object.
187
183
 
188
184
  If schema is passed as a list, it will select only these fields from the schema of ``default_value``
189
- or main Source object.
185
+ or main :class:`Source <onetick.py.Source>` object.
190
186
 
191
187
  Examples
192
188
  --------
193
- >>> def fsq():
194
- ... return otp.Ticks(B=[1, 1, 2, 2, 3, 3])
195
189
  >>> data = otp.Tick(A=1)
196
- >>> data.state_vars['SET'] = otp.state.tick_set_unordered('oldest', 'B', otp.eval(fsq), max_distinct_keys=5)
190
+ >>> data.state_vars['SET'] = otp.state.tick_set_unordered('oldest', 'B',
191
+ ... otp.Ticks(B=[1, 1, 2, 2, 3, 3]),
192
+ ... max_distinct_keys=5)
197
193
  >>> data = data.state_vars['SET'].dump()
198
194
  >>> otp.run(data)[['B']]
199
195
  B
@@ -218,7 +214,7 @@ def tick_deque(default_value=None, scope='query', schema=None) -> TickDeque:
218
214
 
219
215
  Parameters
220
216
  ----------
221
- default_value: :py:func:`eval query <onetick.py.eval>`
217
+ default_value: :class:`otp.Source <onetick.py.Source>`, :py:func:`eval query <onetick.py.eval>`
222
218
  Evaluated query to initialize tick deque from.
223
219
  scope: str
224
220
  Scope for the state variable.
@@ -228,14 +224,12 @@ def tick_deque(default_value=None, scope='query', schema=None) -> TickDeque:
228
224
  if ``default_value`` is not passed as well, schema will contain fields of the main Source object.
229
225
 
230
226
  If schema is passed as a list, it will select only these fields from the schema of ``default_value``
231
- or main Source object.
227
+ or main :class:`Source <onetick.py.Source>` object.
232
228
 
233
229
  Examples
234
230
  --------
235
- >>> def fsq():
236
- ... return otp.Ticks(B=[1, 2, 3])
237
231
  >>> data = otp.Tick(A=1)
238
- >>> data.state_vars['DEQUE'] = otp.state.tick_deque(otp.eval(fsq))
232
+ >>> data.state_vars['DEQUE'] = otp.state.tick_deque(otp.Ticks(B=[1, 2, 3]))
239
233
  >>> data = data.state_vars['DEQUE'].dump()
240
234
  >>> otp.run(data)[['B']]
241
235
  B
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onetick-py
3
- Version: 1.169.0
3
+ Version: 1.170.0
4
4
  Summary: Python package that allows you to work with OneTick
5
5
  Author-email: solutions <solutions@onetick.com>
6
6
  License-Expression: MIT
@@ -13,7 +13,7 @@ onetick/lib/__init__.py,sha256=Rp7CIDoA4E6LIm1f2mNvl_5b_n-0U3suA3FmBXbmKoU,114
13
13
  onetick/lib/instance.py,sha256=3FJB8PWs2ap-EGb6DzsnLRL2meTMUViTdy343m6tHvM,4825
14
14
  onetick/py/__init__.py,sha256=Kxqcimy3N2m0j7fKtLcJkUEzK8aVc1KadJBb4BMB7qI,11093
15
15
  onetick/py/_stack_info.py,sha256=PHZOkW_fK7Fbl4YEj5CaYK9L6vh4j-bUU7_cSYOWZ30,2546
16
- onetick/py/_version.py,sha256=zdZ7SW0iUPpIDmQxSgO1pTQzjGJpii2JfgGOiYSxrm0,76
16
+ onetick/py/_version.py,sha256=q9tkyCDIoC1A4hdf231eJ2gykhyFZpfpkA-kKijvrg8,76
17
17
  onetick/py/backports.py,sha256=mR00mxe7E7UgBljf-Wa93Mo6lpi-C4Op561uhPUoEt8,815
18
18
  onetick/py/cache.py,sha256=f9WwFFCTqCP3eaA4V57tNPjCBHNPzU8ZvH81IuUsBE8,12756
19
19
  onetick/py/compatibility.py,sha256=x-TXsOqPNb2gnARSDwyZba-1FE7bvuat2vrObRCSywo,30917
@@ -29,17 +29,17 @@ onetick/py/run.py,sha256=BSqRbp2061Ju8-DMiW2t2LvlsbE8qp2SC3uDaCxB_vA,37838
29
29
  onetick/py/servers.py,sha256=h6l0X55kcnpI25bZcYaBpPAAGBZjqk9mt1SQe4xZrh0,6840
30
30
  onetick/py/session.py,sha256=AqoS7BFN_Sz3JU2CAaZm0Bro8CmUy6VjmoDjwOU1wYM,49591
31
31
  onetick/py/sql.py,sha256=kJ0732bZ0OGF8x3VzcOUs38zEGsxcd1nZOSN75VKXhA,2993
32
- onetick/py/state.py,sha256=1fL0zgqm-mKi-1KkUc3OvqV6IstDxHEDxlHBIQI-4UM,10134
32
+ onetick/py/state.py,sha256=giQpUUXWwuz_CL_VvxNQDaM71LAMPqeRgHfoGhS1gTk,10330
33
33
  onetick/py/types.py,sha256=OfBTkKNQ7KrNceRXNPUJ36HyA-4sMUf_9T0TSYy-5Fc,64662
34
34
  onetick/py/aggregations/__init__.py,sha256=02WnTc9ocTp34OkGyXRHY2QAZi_QjDMHClE5tvx6Gtk,736
35
35
  onetick/py/aggregations/_base.py,sha256=YQWlFYlq_QvGwTIaNGuyoU8rQsYfx-Yd-lNNq4R_o6o,25702
36
36
  onetick/py/aggregations/_docs.py,sha256=7pz6XIhRuP_1vuOYO9UfTlzl6zGD2_jwbPMfJPOX-M8,34798
37
37
  onetick/py/aggregations/compute.py,sha256=GJpR8AWlEmfNsnl-L2oJPuY5rFb6PC-VwLZnnRGtCys,11854
38
- onetick/py/aggregations/functions.py,sha256=crwjUb4H7-h66aSY50RwSCcR_OE4vF9mF0gVLaXiXiQ,80798
38
+ onetick/py/aggregations/functions.py,sha256=MnjINLAxoLehgInxhY-xSI1xw8TtCGzT7APD5HdFmjE,80801
39
39
  onetick/py/aggregations/generic.py,sha256=7mWRRAPS-t-e_umQc2T3GPPuW1Pia7mKhgjaVB2sSBM,3896
40
40
  onetick/py/aggregations/high_low.py,sha256=B7_Y6KhJjIqJthK0msW0JRkTpxINpnKPuSQjQa2QyZs,2508
41
41
  onetick/py/aggregations/num_distinct.py,sha256=s-VrU92kBKnJ6LIAGq2-j-t8amnolIF2EHkEt78A7_s,2830
42
- onetick/py/aggregations/order_book.py,sha256=-QVtxh_VlzC0-jvZ5Lb6enQBW35Zc0O5uVLid129wc0,18657
42
+ onetick/py/aggregations/order_book.py,sha256=RLzQk0HOG4Why7tNag3pT1GG5nBL_bBnJtID0kFr2y4,19070
43
43
  onetick/py/aggregations/other.py,sha256=wCXrb3BCUJy5e39i35V2tslp0bVR2-8Fa8E1lf45hO4,39410
44
44
  onetick/py/callback/__init__.py,sha256=lF6u1jDy0dv-2qBvonqmSaQAU7dWQAuq5FWyR5LzvLI,108
45
45
  onetick/py/callback/callback.py,sha256=i8yVsbceqhVxNTcXU2ie0-nBRyC0nS2LVDFFtqfCMlw,8618
@@ -49,7 +49,7 @@ onetick/py/core/_csv_inspector.py,sha256=tSYjaMEeyvKdY4DJEhxDLj6AIvqcW-IdioLbXKZ
49
49
  onetick/py/core/column.py,sha256=KZToU5LoAAg4xeLEeKtlI3YY_wZ6JnJktSgJIyquhVg,6679
50
50
  onetick/py/core/cut_builder.py,sha256=rj5aPJ25Dr5fsd9Dw1SO8k9kPGy0hV06anxFqBppFWk,5848
51
51
  onetick/py/core/db_constants.py,sha256=OqBbBKLECf8Bw8ylw30jc72xgCJ0gRIC-K-QkkbQ4LI,437
52
- onetick/py/core/eval_query.py,sha256=jgFdkpum7bsognmM5aIU2xrdiqLYV-auuW6eaSVcY0s,11519
52
+ onetick/py/core/eval_query.py,sha256=mcsOVlQ2vNSfZ-tRUB2z1gdiMJw4MpU2fK2hW-ua3e4,11528
53
53
  onetick/py/core/lambda_object.py,sha256=ayob_2c2XYSG7vFsqp-2b9FSPD-3TFReLbx3de3tkqE,16812
54
54
  onetick/py/core/multi_output_source.py,sha256=i9mxtM3yIF30hsVZ-6XttU407VmHklCdPjNDabgB374,7769
55
55
  onetick/py/core/per_tick_script.py,sha256=thuNKR4T6v5vxADLaX4ldTAHo_Yvt5HCHGIrNMEK6z8,83237
@@ -59,8 +59,8 @@ onetick/py/core/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
59
59
  onetick/py/core/_internal/_manually_bound_value.py,sha256=a4JF63g9MtXsIwpDqm_PCLBH51_SaG1-T6jWV5-IJ1k,191
60
60
  onetick/py/core/_internal/_nodes_history.py,sha256=fCpJ4FWFDzM-bmi-YyCHmNYuFM-CL_lE2bXySOi-TPY,7194
61
61
  onetick/py/core/_internal/_proxy_node.py,sha256=1-UcOBBhAdzN5JHHxmMdXjbKUzaTouZLiDSMsiA0wNk,3537
62
- onetick/py/core/_internal/_state_objects.py,sha256=wQldQqZukN_suwhsLHCOkSXMVHyq7YmOhMo95mkixGg,90306
63
- onetick/py/core/_internal/_state_vars.py,sha256=ej_KBqt-QutAtmgjz_ZMS3CFJE617Oud6Z7SNybY7CQ,3242
62
+ onetick/py/core/_internal/_state_objects.py,sha256=HcGRJgeRQKknwhr0vO4jBlk4iqC0YiwPm1fLAhdbSC4,90661
63
+ onetick/py/core/_internal/_state_vars.py,sha256=SldGNCLl3G7roTZniH8NqfZqbLygCdRjze7Sy8jnxcc,3512
64
64
  onetick/py/core/_internal/_op_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
65
  onetick/py/core/_internal/_op_utils/every_operand.py,sha256=0mQSm92O_qZX15V2zzY_MwzCozJm5MedjK4zvQ2Gomw,265
66
66
  onetick/py/core/_internal/_op_utils/is_const.py,sha256=_8XV5gNZJMuwfd49PcJbaaeX57duMjmZSyAQzsznEgY,375
@@ -79,7 +79,7 @@ onetick/py/core/_source/source_methods/debugs.py,sha256=Hq08HYjF2sEZQAcBlwNMVKpu
79
79
  onetick/py/core/_source/source_methods/drops.py,sha256=3ZXfQWXsl0-ZLHdp6D-wTu2saqCYHZ-Gn777aMRSRp0,4403
80
80
  onetick/py/core/_source/source_methods/fields.py,sha256=6GozvRornClXfEu6oY9-JpN3gOceewB6OJweRR7x2Zw,22740
81
81
  onetick/py/core/_source/source_methods/filters.py,sha256=WuSnK-tQsP3fL2bqVfMZpbpPgk_LG4L8lrYULSSGoKE,33930
82
- onetick/py/core/_source/source_methods/joins.py,sha256=B7Nw3oSJIdTNvTDDHHTOMrmea5p0llQNXBEg9eoaMx0,61172
82
+ onetick/py/core/_source/source_methods/joins.py,sha256=edLIJ-BTWbwvxga1YCzsN6NdhIwtJyZIksZawvPWCbU,61175
83
83
  onetick/py/core/_source/source_methods/merges.py,sha256=efk-R4WOjB2pcAIGWPsZsDzYuitADztH5xtRWTBfutk,23115
84
84
  onetick/py/core/_source/source_methods/misc.py,sha256=Y6H-fJEVlTYNjiDVO9phVI-A9IaGzBSV-11GuoX4ZU4,57012
85
85
  onetick/py/core/_source/source_methods/pandases.py,sha256=BbvIlw6ipqC2dOiKSyyZ5jhAtE4ZtdL30OZXV_e_FuE,3670
@@ -90,7 +90,7 @@ onetick/py/core/_source/source_methods/symbols.py,sha256=MG0dgVVVJ6fD_-GJkkXEgTe
90
90
  onetick/py/core/_source/source_methods/times.py,sha256=2kbLHG-3RQM6uWmw8pBGDiAz4R83KK46Tp1smTY6SR8,27665
91
91
  onetick/py/core/_source/source_methods/writes.py,sha256=W00hAJtQ0phPv5vzS08rSj_N0-ofhih39DalpR8RntQ,42129
92
92
  onetick/py/core/column_operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
- onetick/py/core/column_operations/base.py,sha256=UmY64uznj6JCkSNQJtdmQ7KRuoJtLAgUVAx2vUK9wn8,33176
93
+ onetick/py/core/column_operations/base.py,sha256=ihNaKhhDFk7-v-wpXE11Wqy0WAqEGI1OC2PG4POK1mc,33203
94
94
  onetick/py/core/column_operations/_methods/__init__.py,sha256=_C5hpQG51MingtWW2N8vYzSVFpR314xIrtukBfEfPMk,207
95
95
  onetick/py/core/column_operations/_methods/_internal.py,sha256=M04DbbD9DjA3NrrbibuQPje8ylkaYnVB5Nmlwx1RvaE,878
96
96
  onetick/py/core/column_operations/_methods/conversions.py,sha256=QB8ZKJi5qlV8ydPn43nRHa3HMkaXCDV2Fkrq2gnVQ6U,7001
@@ -101,7 +101,7 @@ onetick/py/core/column_operations/accessors/_accessor.py,sha256=GJtqxDNzve6TM8ES
101
101
  onetick/py/core/column_operations/accessors/decimal_accessor.py,sha256=7B-h932PhUmUV3flAAvPpKeVR7BbaESwSPyBTkxdxoI,2930
102
102
  onetick/py/core/column_operations/accessors/dt_accessor.py,sha256=RvgIuCXs3nMXTNqJvP0Iqu7i_vUoUDgrG7QvfnrKvRs,16837
103
103
  onetick/py/core/column_operations/accessors/float_accessor.py,sha256=6di5Pw0nLwKEqnzQImzQ9ORv45xGm-uevFGCg-FZz4w,5541
104
- onetick/py/core/column_operations/accessors/str_accessor.py,sha256=EBncqEOx421PQvRPd3pTQInWBKN2ttpy1ltXIJI-V-U,55510
104
+ onetick/py/core/column_operations/accessors/str_accessor.py,sha256=65WdZQWayVy8HEh7xn5M3j08AO_fTJ5vSU8CyxNmOrY,55519
105
105
  onetick/py/db/__init__.py,sha256=-TKRO0suXTR-mLAppYt-Vegu9HQn7LU_JcObXpS3N9M,61
106
106
  onetick/py/db/_inspection.py,sha256=Ir2fauWhysUcNmX_84Z66HU891eEBJXy_RIxa8TT3xc,46177
107
107
  onetick/py/db/db.py,sha256=nlkwQ0cDo2T7am4stNbbP_5NVDWD-nOIcoWYFVzr-_w,55920
@@ -118,17 +118,17 @@ onetick/py/sources/common.py,sha256=ufXf5VwPtl6jZd42p29athOSlyLdwzMjRWu6jMEMuGw,
118
118
  onetick/py/sources/csv.py,sha256=GM9SVGgoUZIp4Jouktnp5n_uBgMKjD1yuYRTP36Dpfo,28075
119
119
  onetick/py/sources/custom.py,sha256=4ySuNmY9QTrNAWwbCP2kNLVLSofxl4Y8HmHMoHZheyc,2653
120
120
  onetick/py/sources/data_file.py,sha256=wvbNN0lKM_yYjOGR7hVbbvevEcpYtWeiB0lfECRl2zc,12242
121
- onetick/py/sources/data_source.py,sha256=t3Jm_8Dv4cGmrPeZLv70-fCHl_HnsOZXou8Y28J8Ivo,45191
121
+ onetick/py/sources/data_source.py,sha256=YLYeeSqZXqM14NanV7nAwC3-Z-7_sbbX6st7lxFyCJ0,45362
122
122
  onetick/py/sources/empty.py,sha256=XqSPk6iZ1iX4LLbV1aXb8I_o_YyezJJnmHgPhrR7dZ4,2830
123
123
  onetick/py/sources/odbc.py,sha256=GlimPb9XhnJxwPmPdd0JImr6E5_CV2VVdvYbbGXi4-k,14997
124
- onetick/py/sources/order_book.py,sha256=GQ8y-F1DuU0430mzPABAmv_u-nOtD-murGnqd1Amk0M,8207
124
+ onetick/py/sources/order_book.py,sha256=QpO3atMT79BXEQSBlR26xDnV36oLR9J_eq_K5jyPZ0E,9153
125
125
  onetick/py/sources/parquet.py,sha256=ltxqmkx4m8QUxURI-p9SaUgYnQuyDIFpj0bCDJbnGxU,5858
126
126
  onetick/py/sources/pit.py,sha256=MdLD_XwtwPAYCRtcawfygvQM082wLO1MsrFR0gN25oo,6936
127
127
  onetick/py/sources/query.py,sha256=ENwkdAVs2CeNnzWpLlProuNG6eT7I_88BlgcHFSFEYY,18320
128
128
  onetick/py/sources/snapshots.py,sha256=-CAHisUNUFexgFoeKcAVv6gK47TGWxh6bAbsHiHDrvc,17130
129
129
  onetick/py/sources/split_query_output_by_symbol.py,sha256=5fKIZfF8FAgLjx_TiHpts8J4JtxoetF-5bEj6nsxbdI,8157
130
130
  onetick/py/sources/symbology_mapping.py,sha256=01mwI4w9yxeg2VcxJRaR72MDafjyUBZvMopJC1hhjh0,4809
131
- onetick/py/sources/symbols.py,sha256=gvT2f2HBmGLq02d2PMKU2quUnktGcl9m32e1cBvBryU,14839
131
+ onetick/py/sources/symbols.py,sha256=SeJ-tzLBPDMk3OFsrUXjQ2HyxR_Oe1HkNFWzeotpVTc,15226
132
132
  onetick/py/sources/ticks.py,sha256=uBYeHgQIu_g4niatBQnbB4UKuvfnflc34HlWrcC2xn4,32492
133
133
  onetick/py/utils/__init__.py,sha256=c8YnEcQTOoU3LxZtshBbn6O-WNhyTcwkRvO2efML9k8,1329
134
134
  onetick/py/utils/acl.py,sha256=da4_rrV3pA7_9OcjvRxtZ0ofzwNxslGVbWqFUJK2rSw,2692
@@ -144,9 +144,9 @@ onetick/py/utils/script.py,sha256=Y8NujEo2_5QaP6KDnLKJiKQ7SmMjw8_dv8sYL9rHDCE,11
144
144
  onetick/py/utils/temp.py,sha256=j-BC155dE46k0zfKTTs26KTF0CK6WA1hO2GD54iunyM,17380
145
145
  onetick/py/utils/types.py,sha256=_tYf66r9JVgjtiCJfxIxrg_BQEjHkjlnck_i86dBYEY,3606
146
146
  onetick/py/utils/tz.py,sha256=QXclESLGU8YXysUT9DXkcBqLWWO47Bb_tanFUzYpPZI,2800
147
- onetick_py-1.169.0.dist-info/licenses/LICENSE,sha256=Yhu7lKNFS0fsaN-jSattEMRtCOPueP58Eu5BPH8ZGjM,1075
148
- onetick_py-1.169.0.dist-info/METADATA,sha256=c-XxrQHdZvEWeDNbuMgfQ7xP2m9lvr_jp0Rf_z4UEdQ,8024
149
- onetick_py-1.169.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
150
- onetick_py-1.169.0.dist-info/entry_points.txt,sha256=QmK_tFswIN-SQRmtnTSBEi8GvT0TVq-66IzXXZIsV3U,81
151
- onetick_py-1.169.0.dist-info/top_level.txt,sha256=Na1jSJmVMyYGOndaswt554QKIUwQjcYh6th2ATsmw0U,23
152
- onetick_py-1.169.0.dist-info/RECORD,,
147
+ onetick_py-1.170.0.dist-info/licenses/LICENSE,sha256=Yhu7lKNFS0fsaN-jSattEMRtCOPueP58Eu5BPH8ZGjM,1075
148
+ onetick_py-1.170.0.dist-info/METADATA,sha256=dNMjb5PlKNsSALPPCEE_0HfKBpvU1tuAQIDgodWCffo,8024
149
+ onetick_py-1.170.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
150
+ onetick_py-1.170.0.dist-info/entry_points.txt,sha256=QmK_tFswIN-SQRmtnTSBEi8GvT0TVq-66IzXXZIsV3U,81
151
+ onetick_py-1.170.0.dist-info/top_level.txt,sha256=Na1jSJmVMyYGOndaswt554QKIUwQjcYh6th2ATsmw0U,23
152
+ onetick_py-1.170.0.dist-info/RECORD,,