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.
Files changed (160) hide show
  1. {onetick_py-1.168.0 → onetick_py-1.170.0}/PKG-INFO +1 -1
  2. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/_version.py +1 -1
  3. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/functions.py +1 -1
  4. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/order_book.py +15 -0
  5. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/compatibility.py +7 -0
  6. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/configuration.py +8 -0
  7. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_state_objects.py +11 -6
  8. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_state_vars.py +8 -2
  9. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/joins.py +1 -1
  10. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/str_accessor.py +3 -3
  11. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/base.py +9 -9
  12. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/eval_query.py +3 -3
  13. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/db/_inspection.py +48 -7
  14. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/run.py +14 -12
  15. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/data_source.py +14 -8
  16. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/order_book.py +33 -3
  17. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/symbols.py +10 -1
  18. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/state.py +14 -20
  19. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/PKG-INFO +1 -1
  20. {onetick_py-1.168.0 → onetick_py-1.170.0}/LICENSE +0 -0
  21. {onetick_py-1.168.0 → onetick_py-1.170.0}/README.md +0 -0
  22. {onetick_py-1.168.0 → onetick_py-1.170.0}/pyproject.toml +0 -0
  23. {onetick_py-1.168.0 → onetick_py-1.170.0}/requirements.strict.txt +0 -0
  24. {onetick_py-1.168.0 → onetick_py-1.170.0}/requirements.txt +0 -0
  25. {onetick_py-1.168.0 → onetick_py-1.170.0}/setup.cfg +0 -0
  26. {onetick_py-1.168.0 → onetick_py-1.170.0}/setup.py +0 -0
  27. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/__init__.py +0 -0
  28. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/acl.py +0 -0
  29. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/actions.py +0 -0
  30. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/common.py +0 -0
  31. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/io.py +0 -0
  32. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/locator_parser/locator.py +0 -0
  33. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/__init__.py +0 -0
  34. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/doc_utilities/__init__.py +0 -0
  35. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/doc_utilities/napoleon.py +0 -0
  36. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/doc_utilities/ot_doctest.py +0 -0
  37. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/doc_utilities/snippets.py +0 -0
  38. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/lib/__init__.py +0 -0
  39. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/lib/instance.py +0 -0
  40. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/__init__.py +0 -0
  41. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/_stack_info.py +0 -0
  42. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/__init__.py +0 -0
  43. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/_base.py +0 -0
  44. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/_docs.py +0 -0
  45. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/compute.py +0 -0
  46. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/generic.py +0 -0
  47. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/high_low.py +0 -0
  48. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/num_distinct.py +0 -0
  49. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/aggregations/other.py +0 -0
  50. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/backports.py +0 -0
  51. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/cache.py +0 -0
  52. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/callback/__init__.py +0 -0
  53. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/callback/callback.py +0 -0
  54. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/callback/callbacks.py +0 -0
  55. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/__init__.py +0 -0
  56. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_csv_inspector.py +0 -0
  57. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/__init__.py +0 -0
  58. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_manually_bound_value.py +0 -0
  59. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_nodes_history.py +0 -0
  60. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_op_utils/__init__.py +0 -0
  61. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_op_utils/every_operand.py +0 -0
  62. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_op_utils/is_const.py +0 -0
  63. {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
  64. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_internal/_proxy_node.py +0 -0
  65. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/__init__.py +0 -0
  66. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/_symbol_param.py +0 -0
  67. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/schema.py +0 -0
  68. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/__init__.py +0 -0
  69. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/aggregations.py +0 -0
  70. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/applyers.py +0 -0
  71. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/columns.py +0 -0
  72. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/data_quality.py +0 -0
  73. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/debugs.py +0 -0
  74. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/drops.py +0 -0
  75. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/fields.py +0 -0
  76. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/filters.py +0 -0
  77. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/merges.py +0 -0
  78. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/misc.py +0 -0
  79. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/pandases.py +0 -0
  80. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/renames.py +0 -0
  81. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/sorts.py +0 -0
  82. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/switches.py +0 -0
  83. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/symbols.py +0 -0
  84. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/times.py +0 -0
  85. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/source_methods/writes.py +0 -0
  86. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/symbol.py +0 -0
  87. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/_source/tmp_otq.py +0 -0
  88. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column.py +0 -0
  89. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/__init__.py +0 -0
  90. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/_methods/__init__.py +0 -0
  91. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/_methods/_internal.py +0 -0
  92. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/_methods/conversions.py +0 -0
  93. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/_methods/methods.py +0 -0
  94. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/_methods/op_types.py +0 -0
  95. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/__init__.py +0 -0
  96. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/_accessor.py +0 -0
  97. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/decimal_accessor.py +0 -0
  98. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/dt_accessor.py +0 -0
  99. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/column_operations/accessors/float_accessor.py +0 -0
  100. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/cut_builder.py +0 -0
  101. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/db_constants.py +0 -0
  102. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/lambda_object.py +0 -0
  103. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/multi_output_source.py +0 -0
  104. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/per_tick_script.py +0 -0
  105. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/query_inspector.py +0 -0
  106. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/core/source.py +0 -0
  107. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/db/__init__.py +0 -0
  108. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/db/db.py +0 -0
  109. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/db/utils.py +0 -0
  110. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/docs/__init__.py +0 -0
  111. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/docs/docstring_parser.py +0 -0
  112. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/docs/utils.py +0 -0
  113. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/functions.py +0 -0
  114. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/license.py +0 -0
  115. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/log.py +0 -0
  116. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/math.py +0 -0
  117. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/misc.py +0 -0
  118. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/oqd/__init__.py +0 -0
  119. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/oqd/eps.py +0 -0
  120. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/oqd/sources.py +0 -0
  121. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/otq.py +0 -0
  122. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/pyomd_mock.py +0 -0
  123. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/servers.py +0 -0
  124. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/session.py +0 -0
  125. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/__init__.py +0 -0
  126. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/cache.py +0 -0
  127. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/common.py +0 -0
  128. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/csv.py +0 -0
  129. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/custom.py +0 -0
  130. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/data_file.py +0 -0
  131. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/empty.py +0 -0
  132. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/odbc.py +0 -0
  133. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/parquet.py +0 -0
  134. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/pit.py +0 -0
  135. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/query.py +0 -0
  136. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/snapshots.py +0 -0
  137. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/split_query_output_by_symbol.py +0 -0
  138. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/symbology_mapping.py +0 -0
  139. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sources/ticks.py +0 -0
  140. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/sql.py +0 -0
  141. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/types.py +0 -0
  142. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/__init__.py +0 -0
  143. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/acl.py +0 -0
  144. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/config.py +0 -0
  145. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/default.py +0 -0
  146. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/file.py +0 -0
  147. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/helpers.py +0 -0
  148. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/locator.py +0 -0
  149. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/perf.py +0 -0
  150. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/query.py +0 -0
  151. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/render.py +0 -0
  152. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/script.py +0 -0
  153. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/temp.py +0 -0
  154. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/types.py +0 -0
  155. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick/py/utils/tz.py +0 -0
  156. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/SOURCES.txt +0 -0
  157. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/dependency_links.txt +0 -0
  158. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/entry_points.txt +0 -0
  159. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/requires.txt +0 -0
  160. {onetick_py-1.168.0 → onetick_py-1.170.0}/src/onetick_py.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: onetick-py
3
- Version: 1.168.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
@@ -1,2 +1,2 @@
1
1
  # This file was generated automatically. DO NOT CHANGE.
2
- VERSION = '1.168.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'
@@ -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, _ = 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
@@ -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(context=utils.default, derived=False, readable_only: bool = True) -> dict[str, DB]:
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('DATABASE_NAME')
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
- db_dict = {db_name: DB(db_name, context=context) for db_name in db_list}
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, :py:attr:`default_auth_username<onetick.py.configuration.Config.default_auth_username>` is used.
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
- :py:attr:`max_expected_ticks_per_symbol<onetick.py.configuration.Config.max_expected_ticks_per_symbol>`
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 _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