onetick-py 1.168.0__tar.gz → 1.170.0__tar.gz
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-1.168.0 → onetick_py-1.170.0}/PKG-INFO +1 -1
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/_version.py +1 -1
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/functions.py +1 -1
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/order_book.py +15 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/compatibility.py +7 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/configuration.py +8 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_state_objects.py +11 -6
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_state_vars.py +8 -2
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/joins.py +1 -1
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/str_accessor.py +3 -3
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/base.py +9 -9
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/eval_query.py +3 -3
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/db/_inspection.py +48 -7
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/run.py +14 -12
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/data_source.py +14 -8
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/order_book.py +33 -3
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/symbols.py +10 -1
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/state.py +14 -20
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/PKG-INFO +1 -1
- {onetick_py-1.168.0 → onetick_py-1.170.0}/LICENSE +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/README.md +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/pyproject.toml +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/requirements.strict.txt +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/requirements.txt +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/setup.cfg +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/setup.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/acl.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/actions.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/common.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/io.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/locator.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/doc_utilities/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/doc_utilities/napoleon.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/doc_utilities/ot_doctest.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/doc_utilities/snippets.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/lib/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/lib/instance.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/_stack_info.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/_base.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/_docs.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/compute.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/generic.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/high_low.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/num_distinct.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/other.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/backports.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/cache.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/callback/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/callback/callback.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/callback/callbacks.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_csv_inspector.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_manually_bound_value.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_nodes_history.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_op_utils/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_op_utils/every_operand.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_op_utils/is_const.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_per_tick_scripts/tick_list_sort_template.script +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_proxy_node.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/_symbol_param.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/schema.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/aggregations.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/applyers.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/columns.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/data_quality.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/debugs.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/drops.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/fields.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/filters.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/merges.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/misc.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/pandases.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/renames.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/sorts.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/switches.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/symbols.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/times.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/writes.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/symbol.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/tmp_otq.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/_methods/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/_methods/_internal.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/_methods/conversions.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/_methods/methods.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/_methods/op_types.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/_accessor.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/decimal_accessor.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/dt_accessor.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/float_accessor.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/cut_builder.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/db_constants.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/lambda_object.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/multi_output_source.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/per_tick_script.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/query_inspector.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/source.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/db/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/db/db.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/db/utils.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/docs/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/docs/docstring_parser.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/docs/utils.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/functions.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/license.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/log.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/math.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/misc.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/oqd/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/oqd/eps.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/oqd/sources.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/otq.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/pyomd_mock.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/servers.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/session.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/cache.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/common.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/csv.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/custom.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/data_file.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/empty.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/odbc.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/parquet.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/pit.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/query.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/snapshots.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/split_query_output_by_symbol.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/symbology_mapping.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/ticks.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sql.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/types.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/__init__.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/acl.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/config.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/default.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/file.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/helpers.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/locator.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/perf.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/query.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/render.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/script.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/temp.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/types.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/tz.py +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/SOURCES.txt +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/dependency_links.txt +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/entry_points.txt +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/requires.txt +0 -0
- {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/top_level.txt +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# This file was generated automatically. DO NOT CHANGE.
|
|
2
|
-
VERSION = '1.
|
|
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
|
|
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'
|
|
@@ -767,3 +767,10 @@ def is_join_with_query_symbol_time_otq_supported():
|
|
|
767
767
|
# to the equivalent value, except in YYYYMMDDhhmmss format
|
|
768
768
|
return _is_min_build_or_version(None, None,
|
|
769
769
|
20250227120000)
|
|
770
|
+
|
|
771
|
+
|
|
772
|
+
def is_show_db_list_show_description_supported():
|
|
773
|
+
# 20240301: Implemented 0032320: 0032320: SHOW_DB_LIST should have a new EP parameter, SHOW_DESCRIPTION
|
|
774
|
+
# However on 20240330 builds it returns SHOW_DESCRIPTION column instead of DESCRIPTION
|
|
775
|
+
return _is_min_build_or_version(1.25, 20241229055942,
|
|
776
|
+
20240501000000)
|
|
@@ -537,6 +537,14 @@ class Config:
|
|
|
537
537
|
allowed_types=str,
|
|
538
538
|
)
|
|
539
539
|
|
|
540
|
+
default_username = OtpProperty(
|
|
541
|
+
description='Default username to call queries. '
|
|
542
|
+
'By default the name of the owner of the current process is used.',
|
|
543
|
+
base_default=None,
|
|
544
|
+
allowed_types=str,
|
|
545
|
+
env_var_name='OTP_DEFAULT_USERNAME',
|
|
546
|
+
)
|
|
547
|
+
|
|
540
548
|
default_auth_username = OtpProperty(
|
|
541
549
|
description='Default username used for authentication.',
|
|
542
550
|
base_default=None,
|
|
@@ -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
|
|
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
|
-
|
|
348
|
-
|
|
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
|
-
|
|
400
|
-
|
|
401
|
-
|
|
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
|
-
|
|
86
|
-
|
|
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))
|
{onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/joins.py
RENAMED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
@@ -7,7 +7,7 @@ from dateutil.tz import gettz
|
|
|
7
7
|
|
|
8
8
|
import onetick.py as otp
|
|
9
9
|
from onetick.py import configuration, utils
|
|
10
|
-
from onetick.py.compatibility import is_native_plus_zstd_supported
|
|
10
|
+
from onetick.py.compatibility import is_native_plus_zstd_supported, is_show_db_list_show_description_supported
|
|
11
11
|
from onetick.py.core import db_constants
|
|
12
12
|
from onetick.py.otq import otq
|
|
13
13
|
|
|
@@ -25,8 +25,9 @@ class DB:
|
|
|
25
25
|
dates with data, symbols, tick schema, etc.
|
|
26
26
|
"""
|
|
27
27
|
|
|
28
|
-
def __init__(self, name, context=utils.default):
|
|
28
|
+
def __init__(self, name, description='', context=utils.default):
|
|
29
29
|
self.name = name
|
|
30
|
+
self.description = description
|
|
30
31
|
if context is utils.default or context is None:
|
|
31
32
|
self.context = otp.config.context
|
|
32
33
|
else:
|
|
@@ -907,7 +908,9 @@ class DB:
|
|
|
907
908
|
return df
|
|
908
909
|
|
|
909
910
|
|
|
910
|
-
def databases(
|
|
911
|
+
def databases(
|
|
912
|
+
context=utils.default, derived: bool = False, readable_only: bool = True, fetch_description: bool = False,
|
|
913
|
+
) -> dict[str, DB]:
|
|
911
914
|
"""
|
|
912
915
|
Gets all available databases in the ``context``
|
|
913
916
|
|
|
@@ -925,6 +928,9 @@ def databases(context=utils.default, derived=False, readable_only: bool = True)
|
|
|
925
928
|
readable_only: bool
|
|
926
929
|
If set to True (default), then return only the databases with read-access for the current user.
|
|
927
930
|
Otherwise return all databases visible from the current process.
|
|
931
|
+
fetch_description: bool
|
|
932
|
+
If set to True, retrieves descriptions for databases and puts them into ``description`` property of
|
|
933
|
+
:py:class:`~onetick.py.DB` objects in a returned dict.
|
|
928
934
|
|
|
929
935
|
See also
|
|
930
936
|
--------
|
|
@@ -938,17 +944,47 @@ def databases(context=utils.default, derived=False, readable_only: bool = True)
|
|
|
938
944
|
Dict where keys are database names and values are :class:`DB <onetick.py.db._inspection.DB>` objects
|
|
939
945
|
with ``context`` specified.
|
|
940
946
|
"""
|
|
947
|
+
if fetch_description and not is_show_db_list_show_description_supported():
|
|
948
|
+
fetch_description = False
|
|
949
|
+
|
|
941
950
|
if readable_only:
|
|
942
951
|
node = (
|
|
943
952
|
otq.AccessInfo(info_type='DATABASES', show_for_all_users=False, deep_scan=True).tick_type('ANY')
|
|
944
953
|
>> otq.Passthrough('DB_NAME,READ_ACCESS')
|
|
945
954
|
>> otq.WhereClause(where='READ_ACCESS = 1')
|
|
946
955
|
)
|
|
956
|
+
|
|
957
|
+
if fetch_description:
|
|
958
|
+
join = otq.Join(
|
|
959
|
+
left_source='LEFT', join_type='LEFT_OUTER', join_criteria='LEFT.DB_NAME = RIGHT.DATABASE_NAME'
|
|
960
|
+
)
|
|
961
|
+
|
|
962
|
+
_ = node.set_node_name('LEFT') >> join
|
|
963
|
+
_ = (
|
|
964
|
+
otq.ShowDbList(show_description=fetch_description).tick_type('ANY')
|
|
965
|
+
>> otq.Passthrough('DATABASE_NAME,DESCRIPTION').set_node_name('RIGHT')
|
|
966
|
+
>> join
|
|
967
|
+
)
|
|
968
|
+
|
|
969
|
+
node = (
|
|
970
|
+
join >> otq.Passthrough('LEFT.DB_NAME,RIGHT.DESCRIPTION')
|
|
971
|
+
>> otq.RenameFields("LEFT.DB_NAME=DB_NAME,RIGHT.DESCRIPTION=DESCRIPTION")
|
|
972
|
+
)
|
|
947
973
|
else:
|
|
974
|
+
db_list_kwargs = {}
|
|
975
|
+
output_fields = ['DATABASE_NAME']
|
|
976
|
+
if fetch_description:
|
|
977
|
+
db_list_kwargs['show_description'] = fetch_description
|
|
978
|
+
output_fields.append('DESCRIPTION')
|
|
979
|
+
|
|
948
980
|
node = (
|
|
949
|
-
otq.ShowDbList().tick_type('ANY')
|
|
950
|
-
>> otq.Passthrough('
|
|
981
|
+
otq.ShowDbList(**db_list_kwargs).tick_type('ANY')
|
|
982
|
+
>> otq.Passthrough(','.join(output_fields))
|
|
951
983
|
)
|
|
984
|
+
|
|
985
|
+
if not fetch_description:
|
|
986
|
+
node = node >> otq.AddField('DESCRIPTION', '""')
|
|
987
|
+
|
|
952
988
|
dbs = otp.run(node,
|
|
953
989
|
symbols='LOCAL::',
|
|
954
990
|
# start and end times don't matter for this query, use some constants
|
|
@@ -961,9 +997,14 @@ def databases(context=utils.default, derived=False, readable_only: bool = True)
|
|
|
961
997
|
return {}
|
|
962
998
|
|
|
963
999
|
db_list = list(dbs['DB_NAME'] if readable_only else dbs['DATABASE_NAME'])
|
|
964
|
-
|
|
1000
|
+
merged_db_list = list(zip(db_list, dbs['DESCRIPTION']))
|
|
1001
|
+
|
|
1002
|
+
db_dict = {
|
|
1003
|
+
db_name: DB(db_name, description=db_description, context=context) for db_name, db_description in merged_db_list
|
|
1004
|
+
}
|
|
1005
|
+
|
|
965
1006
|
if derived:
|
|
966
|
-
kwargs = derived if isinstance(derived, dict) else {}
|
|
1007
|
+
kwargs: dict = derived if isinstance(derived, dict) else {}
|
|
967
1008
|
kwargs.setdefault('context', context)
|
|
968
1009
|
db_dict.update(
|
|
969
1010
|
derived_databases(**kwargs)
|
|
@@ -84,14 +84,14 @@ def run(query: Union[Callable, Dict, otp.Source, otp.MultiOutputSource, # NOSON
|
|
|
84
84
|
start: :py:class:`datetime.datetime`, :py:class:`otp.datetime <onetick.py.datetime>`,\
|
|
85
85
|
:py:class:`pyomd.timeval_t`, optional
|
|
86
86
|
The start time of the query. Can be timezone-naive or timezone-aware. See also ``timezone`` argument.
|
|
87
|
-
onetick.py uses :py:attr:`default_start_time<onetick.py.configuration.Config.default_start_time>`
|
|
87
|
+
onetick.py uses :py:attr:`otp.config.default_start_time<onetick.py.configuration.Config.default_start_time>`
|
|
88
88
|
as default value, if you don't want to specify start time, e.g. to use saved time of the query,
|
|
89
89
|
then you should specify None value.
|
|
90
90
|
end: :py:class:`datetime.datetime`, :py:class:`otp.datetime <onetick.py.datetime>`,\
|
|
91
91
|
:py:class:`pyomd.timeval_t`, optional
|
|
92
92
|
The end time of the query (note that it's non-inclusive).
|
|
93
93
|
Can be timezone-naive or timezone-aware. See also ``timezone`` argument.
|
|
94
|
-
onetick.py uses :py:attr:`default_end_time<onetick.py.configuration.Config.default_end_time>`
|
|
94
|
+
onetick.py uses :py:attr:`otp.config.default_end_time<onetick.py.configuration.Config.default_end_time>`
|
|
95
95
|
as default value, if you don't want to specify end time, e.g. to use saved time of the query,
|
|
96
96
|
then you should specify None value.
|
|
97
97
|
date: :py:class:`datetime.date`, :py:class:`otp.date <onetick.py.date>`, optional
|
|
@@ -109,28 +109,30 @@ def run(query: Union[Callable, Dict, otp.Source, otp.MultiOutputSource, # NOSON
|
|
|
109
109
|
The timezone of output timestamps.
|
|
110
110
|
Also, when start and/or end arguments are timezone-naive, it will define their timezone.
|
|
111
111
|
If parameter is omitted timestamps of ticks will be formatted
|
|
112
|
-
with the default :py:attr:`tz<onetick.py.configuration.Config.tz>`.
|
|
112
|
+
with the default :py:attr:`otp.config.tz<onetick.py.configuration.Config.tz>`.
|
|
113
113
|
context: str, optional
|
|
114
114
|
Allows specification of different contexts from OneTick configuration to connect to.
|
|
115
|
-
If not set then default :py:attr:`context<onetick.py.configuration.Config.context>` is used.
|
|
115
|
+
If not set then default :py:attr:`otp.config.context<onetick.py.configuration.Config.context>` is used.
|
|
116
116
|
See :ref:`guide about switching contexts <switching contexts>` for examples.
|
|
117
117
|
username
|
|
118
118
|
The username to make the connection.
|
|
119
|
-
By default the user which executed the process is used
|
|
119
|
+
By default the user which executed the process is used or the value specified in
|
|
120
|
+
:py:attr:`otp.config.default_username<onetick.py.configuration.Config.default_username>`.
|
|
120
121
|
alternative_username: str
|
|
121
122
|
The username used for authentication.
|
|
122
123
|
Needs to be set only when the tick server is configured to use password-based authentication.
|
|
123
|
-
By default,
|
|
124
|
+
By default,
|
|
125
|
+
:py:attr:`otp.config.default_auth_username<onetick.py.configuration.Config.default_auth_username>` is used.
|
|
124
126
|
Not supported for WebAPI mode.
|
|
125
127
|
password: str, optional
|
|
126
128
|
The password used for authentication.
|
|
127
129
|
Needs to be set only when the tick server is configured to use password-based authentication.
|
|
128
130
|
Note: not supported and ignored on older OneTick versions.
|
|
129
|
-
By default, :py:attr:`default_password<onetick.py.configuration.Config.default_password>` is used.
|
|
131
|
+
By default, :py:attr:`otp.config.default_password<onetick.py.configuration.Config.default_password>` is used.
|
|
130
132
|
batch_size: int
|
|
131
133
|
number of symbols to run in one batch.
|
|
132
134
|
By default, the value from
|
|
133
|
-
:py:attr:`default_batch_size<onetick.py.configuration.Config.default_batch_size>` is used.
|
|
135
|
+
:py:attr:`otp.config.default_batch_size<onetick.py.configuration.Config.default_batch_size>` is used.
|
|
134
136
|
Not supported for WebAPI mode.
|
|
135
137
|
running: bool, optional
|
|
136
138
|
Indicates whether a query is CEP or not. Default is `False`.
|
|
@@ -139,7 +141,7 @@ def run(query: Union[Callable, Dict, otp.Source, otp.MultiOutputSource, # NOSON
|
|
|
139
141
|
concurrency: int, optional
|
|
140
142
|
The maximum number of CPU cores to use to process the query.
|
|
141
143
|
By default, the value from
|
|
142
|
-
:py:attr:`default_concurrency<onetick.py.configuration.Config.default_concurrency>` is used.
|
|
144
|
+
:py:attr:`otp.config.default_concurrency<onetick.py.configuration.Config.default_concurrency>` is used.
|
|
143
145
|
apply_times_daily: bool
|
|
144
146
|
Runs the query for every day in the ``start``-``end`` time range,
|
|
145
147
|
using the time components of ``start`` and ``end`` datetimes.
|
|
@@ -195,9 +197,8 @@ def run(query: Union[Callable, Dict, otp.Source, otp.MultiOutputSource, # NOSON
|
|
|
195
197
|
If set to True, result will be forced to be a dictionary even if it's returned for a single symbol
|
|
196
198
|
max_expected_ticks_per_symbol: int
|
|
197
199
|
Expected maximum number of ticks per symbol (used for performance optimizations).
|
|
198
|
-
By default,
|
|
199
|
-
|
|
200
|
-
is used.
|
|
200
|
+
By default, :py:attr:`otp.config.max_expected_ticks_per_symbol \
|
|
201
|
+
<onetick.py.configuration.Config.max_expected_ticks_per_symbol>` is used.
|
|
201
202
|
Not supported for WebAPI mode.
|
|
202
203
|
log_symbol: bool
|
|
203
204
|
Log currently executed symbol.
|
|
@@ -547,6 +548,7 @@ def run(query: Union[Callable, Dict, otp.Source, otp.MultiOutputSource, # NOSON
|
|
|
547
548
|
start, end = _get_start_end(start, end, timezone)
|
|
548
549
|
|
|
549
550
|
# authentication
|
|
551
|
+
username = username or otp.config.default_username
|
|
550
552
|
alternative_username = alternative_username or otp.config.default_auth_username
|
|
551
553
|
password = password or otp.config.default_password
|
|
552
554
|
kwargs = {}
|
|
@@ -977,14 +977,7 @@ class DataSource(Source):
|
|
|
977
977
|
src = self._table_schema(src)
|
|
978
978
|
return src
|
|
979
979
|
|
|
980
|
-
def
|
|
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,
|
|
28
|
-
if self._try_default_constructor(
|
|
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
|
-
|
|
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
|
|