onetick-py 1.177.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- locator_parser/__init__.py +0 -0
- locator_parser/acl.py +73 -0
- locator_parser/actions.py +262 -0
- locator_parser/common.py +368 -0
- locator_parser/io.py +43 -0
- locator_parser/locator.py +150 -0
- onetick/__init__.py +101 -0
- onetick/doc_utilities/__init__.py +3 -0
- onetick/doc_utilities/napoleon.py +40 -0
- onetick/doc_utilities/ot_doctest.py +140 -0
- onetick/doc_utilities/snippets.py +279 -0
- onetick/lib/__init__.py +4 -0
- onetick/lib/instance.py +141 -0
- onetick/py/__init__.py +293 -0
- onetick/py/_stack_info.py +89 -0
- onetick/py/_version.py +2 -0
- onetick/py/aggregations/__init__.py +11 -0
- onetick/py/aggregations/_base.py +648 -0
- onetick/py/aggregations/_docs.py +948 -0
- onetick/py/aggregations/compute.py +286 -0
- onetick/py/aggregations/functions.py +2216 -0
- onetick/py/aggregations/generic.py +104 -0
- onetick/py/aggregations/high_low.py +80 -0
- onetick/py/aggregations/num_distinct.py +83 -0
- onetick/py/aggregations/order_book.py +501 -0
- onetick/py/aggregations/other.py +1014 -0
- onetick/py/backports.py +26 -0
- onetick/py/cache.py +374 -0
- onetick/py/callback/__init__.py +5 -0
- onetick/py/callback/callback.py +276 -0
- onetick/py/callback/callbacks.py +131 -0
- onetick/py/compatibility.py +798 -0
- onetick/py/configuration.py +771 -0
- onetick/py/core/__init__.py +0 -0
- onetick/py/core/_csv_inspector.py +93 -0
- onetick/py/core/_internal/__init__.py +0 -0
- onetick/py/core/_internal/_manually_bound_value.py +6 -0
- onetick/py/core/_internal/_nodes_history.py +250 -0
- onetick/py/core/_internal/_op_utils/__init__.py +0 -0
- onetick/py/core/_internal/_op_utils/every_operand.py +9 -0
- onetick/py/core/_internal/_op_utils/is_const.py +10 -0
- onetick/py/core/_internal/_per_tick_scripts/tick_list_sort_template.script +121 -0
- onetick/py/core/_internal/_proxy_node.py +140 -0
- onetick/py/core/_internal/_state_objects.py +2312 -0
- onetick/py/core/_internal/_state_vars.py +93 -0
- onetick/py/core/_source/__init__.py +0 -0
- onetick/py/core/_source/_symbol_param.py +95 -0
- onetick/py/core/_source/schema.py +97 -0
- onetick/py/core/_source/source_methods/__init__.py +0 -0
- onetick/py/core/_source/source_methods/aggregations.py +809 -0
- onetick/py/core/_source/source_methods/applyers.py +296 -0
- onetick/py/core/_source/source_methods/columns.py +141 -0
- onetick/py/core/_source/source_methods/data_quality.py +301 -0
- onetick/py/core/_source/source_methods/debugs.py +272 -0
- onetick/py/core/_source/source_methods/drops.py +120 -0
- onetick/py/core/_source/source_methods/fields.py +619 -0
- onetick/py/core/_source/source_methods/filters.py +1002 -0
- onetick/py/core/_source/source_methods/joins.py +1413 -0
- onetick/py/core/_source/source_methods/merges.py +605 -0
- onetick/py/core/_source/source_methods/misc.py +1455 -0
- onetick/py/core/_source/source_methods/pandases.py +155 -0
- onetick/py/core/_source/source_methods/renames.py +356 -0
- onetick/py/core/_source/source_methods/sorts.py +183 -0
- onetick/py/core/_source/source_methods/switches.py +142 -0
- onetick/py/core/_source/source_methods/symbols.py +117 -0
- onetick/py/core/_source/source_methods/times.py +627 -0
- onetick/py/core/_source/source_methods/writes.py +986 -0
- onetick/py/core/_source/symbol.py +205 -0
- onetick/py/core/_source/tmp_otq.py +222 -0
- onetick/py/core/column.py +209 -0
- onetick/py/core/column_operations/__init__.py +0 -0
- onetick/py/core/column_operations/_methods/__init__.py +4 -0
- onetick/py/core/column_operations/_methods/_internal.py +28 -0
- onetick/py/core/column_operations/_methods/conversions.py +216 -0
- onetick/py/core/column_operations/_methods/methods.py +292 -0
- onetick/py/core/column_operations/_methods/op_types.py +160 -0
- onetick/py/core/column_operations/accessors/__init__.py +0 -0
- onetick/py/core/column_operations/accessors/_accessor.py +28 -0
- onetick/py/core/column_operations/accessors/decimal_accessor.py +104 -0
- onetick/py/core/column_operations/accessors/dt_accessor.py +537 -0
- onetick/py/core/column_operations/accessors/float_accessor.py +184 -0
- onetick/py/core/column_operations/accessors/str_accessor.py +1367 -0
- onetick/py/core/column_operations/base.py +1121 -0
- onetick/py/core/cut_builder.py +150 -0
- onetick/py/core/db_constants.py +20 -0
- onetick/py/core/eval_query.py +245 -0
- onetick/py/core/lambda_object.py +441 -0
- onetick/py/core/multi_output_source.py +232 -0
- onetick/py/core/per_tick_script.py +2256 -0
- onetick/py/core/query_inspector.py +464 -0
- onetick/py/core/source.py +1744 -0
- onetick/py/db/__init__.py +2 -0
- onetick/py/db/_inspection.py +1128 -0
- onetick/py/db/db.py +1327 -0
- onetick/py/db/utils.py +64 -0
- onetick/py/docs/__init__.py +0 -0
- onetick/py/docs/docstring_parser.py +112 -0
- onetick/py/docs/utils.py +81 -0
- onetick/py/functions.py +2398 -0
- onetick/py/license.py +190 -0
- onetick/py/log.py +88 -0
- onetick/py/math.py +935 -0
- onetick/py/misc.py +470 -0
- onetick/py/oqd/__init__.py +22 -0
- onetick/py/oqd/eps.py +1195 -0
- onetick/py/oqd/sources.py +325 -0
- onetick/py/otq.py +216 -0
- onetick/py/pyomd_mock.py +47 -0
- onetick/py/run.py +916 -0
- onetick/py/servers.py +173 -0
- onetick/py/session.py +1347 -0
- onetick/py/sources/__init__.py +19 -0
- onetick/py/sources/cache.py +167 -0
- onetick/py/sources/common.py +128 -0
- onetick/py/sources/csv.py +642 -0
- onetick/py/sources/custom.py +85 -0
- onetick/py/sources/data_file.py +305 -0
- onetick/py/sources/data_source.py +1045 -0
- onetick/py/sources/empty.py +94 -0
- onetick/py/sources/odbc.py +337 -0
- onetick/py/sources/order_book.py +271 -0
- onetick/py/sources/parquet.py +168 -0
- onetick/py/sources/pit.py +191 -0
- onetick/py/sources/query.py +495 -0
- onetick/py/sources/snapshots.py +419 -0
- onetick/py/sources/split_query_output_by_symbol.py +198 -0
- onetick/py/sources/symbology_mapping.py +123 -0
- onetick/py/sources/symbols.py +374 -0
- onetick/py/sources/ticks.py +825 -0
- onetick/py/sql.py +70 -0
- onetick/py/state.py +251 -0
- onetick/py/types.py +2131 -0
- onetick/py/utils/__init__.py +70 -0
- onetick/py/utils/acl.py +93 -0
- onetick/py/utils/config.py +186 -0
- onetick/py/utils/default.py +49 -0
- onetick/py/utils/file.py +38 -0
- onetick/py/utils/helpers.py +76 -0
- onetick/py/utils/locator.py +94 -0
- onetick/py/utils/perf.py +498 -0
- onetick/py/utils/query.py +49 -0
- onetick/py/utils/render.py +1374 -0
- onetick/py/utils/script.py +244 -0
- onetick/py/utils/temp.py +471 -0
- onetick/py/utils/types.py +120 -0
- onetick/py/utils/tz.py +84 -0
- onetick_py-1.177.0.dist-info/METADATA +137 -0
- onetick_py-1.177.0.dist-info/RECORD +152 -0
- onetick_py-1.177.0.dist-info/WHEEL +5 -0
- onetick_py-1.177.0.dist-info/entry_points.txt +2 -0
- onetick_py-1.177.0.dist-info/licenses/LICENSE +21 -0
- onetick_py-1.177.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from onetick.py.core.source import Source, _Source # _Source for backward compatibility
|
|
2
|
+
|
|
3
|
+
from .ticks import Tick, Ticks, TTicks
|
|
4
|
+
from .data_source import DataSource, Custom
|
|
5
|
+
|
|
6
|
+
from .cache import ReadCache
|
|
7
|
+
from .csv import CSV, LocalCSVTicks
|
|
8
|
+
from .data_file import DataFile
|
|
9
|
+
from .empty import Empty
|
|
10
|
+
from .custom import Orders, Quotes, Trades, NBBO
|
|
11
|
+
from .order_book import ObSnapshot, ObSnapshotFlat, ObSnapshotWide, ObSummary, ObSize, ObVwap, ObNumLevels
|
|
12
|
+
from .odbc import ODBC
|
|
13
|
+
from .parquet import ReadParquet
|
|
14
|
+
from .query import query, Query
|
|
15
|
+
from .snapshots import ReadSnapshot, ShowSnapshotList, FindSnapshotSymbols
|
|
16
|
+
from .split_query_output_by_symbol import SplitQueryOutputBySymbol, by_symbol
|
|
17
|
+
from .symbology_mapping import SymbologyMapping
|
|
18
|
+
from .symbols import Symbols
|
|
19
|
+
from .pit import PointInTime
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
from typing import Union
|
|
2
|
+
|
|
3
|
+
import onetick.py as otp
|
|
4
|
+
from onetick.py.otq import otq
|
|
5
|
+
|
|
6
|
+
from onetick.py.core.source import Source
|
|
7
|
+
|
|
8
|
+
from .. import types as ott
|
|
9
|
+
from .. import utils
|
|
10
|
+
|
|
11
|
+
from .common import update_node_tick_type
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def process_otq_params(params: Union[dict, None]) -> str:
|
|
15
|
+
if not params:
|
|
16
|
+
return ""
|
|
17
|
+
|
|
18
|
+
return ",".join([f"{k}={ott.value2str(v)}" for k, v in params.items()])
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ReadCache(Source):
|
|
22
|
+
def __init__(
|
|
23
|
+
self,
|
|
24
|
+
cache_name=None,
|
|
25
|
+
db=utils.adaptive_to_default,
|
|
26
|
+
symbol=utils.adaptive,
|
|
27
|
+
tick_type=utils.adaptive,
|
|
28
|
+
start=utils.adaptive,
|
|
29
|
+
end=utils.adaptive,
|
|
30
|
+
read_mode="automatic",
|
|
31
|
+
update_cache=True,
|
|
32
|
+
otq_params=None,
|
|
33
|
+
create_cache_query="",
|
|
34
|
+
schema=None,
|
|
35
|
+
**kwargs,
|
|
36
|
+
):
|
|
37
|
+
"""
|
|
38
|
+
Make cached query
|
|
39
|
+
|
|
40
|
+
Cache is initialized on the first read attempt.
|
|
41
|
+
|
|
42
|
+
Parameters
|
|
43
|
+
----------
|
|
44
|
+
cache_name: str
|
|
45
|
+
Name of cache for a query.
|
|
46
|
+
symbol: str, list of str, :class:`Source`, :class:`query`, :py:func:`eval query <onetick.py.eval>`
|
|
47
|
+
Symbol(s) from which data should be taken.
|
|
48
|
+
db: str
|
|
49
|
+
Database to use for tick generation.
|
|
50
|
+
tick_type: str
|
|
51
|
+
Tick type.
|
|
52
|
+
Default: ANY.
|
|
53
|
+
start: :py:class:`otp.datetime <onetick.py.datetime>`
|
|
54
|
+
Start time for tick generation. By default the start time of the query will be used.
|
|
55
|
+
end: :py:class:`otp.datetime <onetick.py.datetime>`
|
|
56
|
+
End time for tick generation. By default the end time of the query will be used.
|
|
57
|
+
read_mode: str
|
|
58
|
+
Mode of querying cache. One of these:
|
|
59
|
+
|
|
60
|
+
* ``cache_only`` - only cached results are returned and queries are not performed.
|
|
61
|
+
* ``query_only`` - the query is run irrespective of whether the result is already available in the cache.
|
|
62
|
+
* ``automatic`` (default) - perform the query if the data is not found in the cache.
|
|
63
|
+
update_cache: bool
|
|
64
|
+
If set to ``True``, updates the cached data if ``read_mode=query_only`` or if ``read_mode=automatic`` and
|
|
65
|
+
the result data not found in the cache. Otherwise, the cache remains unchanged.
|
|
66
|
+
otq_params: dict
|
|
67
|
+
OTQ parameters to override ``otq_params`` that are passed during creation of cache.
|
|
68
|
+
Query result will be cached separately for each unique pair of OTQ parameters.
|
|
69
|
+
create_cache_query: str
|
|
70
|
+
If a cache with the given name is not present, the query provided in this param will be invoked,
|
|
71
|
+
which should contain CREATE_CACHE EP to create the corresponding cache.
|
|
72
|
+
schema: Optional, dict
|
|
73
|
+
Dictionary of columns names with their types.
|
|
74
|
+
kwargs:
|
|
75
|
+
Deprecated. Use ``schema`` instead.
|
|
76
|
+
Dictionary of columns names with their types.
|
|
77
|
+
|
|
78
|
+
See also
|
|
79
|
+
--------
|
|
80
|
+
| **READ_CACHE** OneTick event processor
|
|
81
|
+
| :py:func:`onetick.py.create_cache`
|
|
82
|
+
|
|
83
|
+
Examples
|
|
84
|
+
--------
|
|
85
|
+
Simple cache read:
|
|
86
|
+
|
|
87
|
+
>>> def query_func():
|
|
88
|
+
... return otp.DataSource("DEMO_L1", tick_type="TRD", symbols="AAPL")
|
|
89
|
+
>>> otp.create_cache(
|
|
90
|
+
... cache_name="some_cache", query=query_func, tick_type="TRD", db="DEMO_L1",
|
|
91
|
+
... )
|
|
92
|
+
>>> src = otp.ReadCache("some_cache")
|
|
93
|
+
>>> otp.run(src) # doctest: +SKIP
|
|
94
|
+
|
|
95
|
+
Make cache query for specific time interval:
|
|
96
|
+
|
|
97
|
+
>>> src = otp.ReadCache(
|
|
98
|
+
... "some_cache",
|
|
99
|
+
... start=otp.datetime(2024, 1, 1, 12, 30),
|
|
100
|
+
... end=otp.datetime(2024, 1, 2, 18, 0),
|
|
101
|
+
... )
|
|
102
|
+
>>> otp.run(src) # doctest: +SKIP
|
|
103
|
+
|
|
104
|
+
Override or set `otq_params` for one query:
|
|
105
|
+
|
|
106
|
+
>>> src = otp.ReadCache(
|
|
107
|
+
... "some_cache",
|
|
108
|
+
... otq_params={"some_param": "test_value"},
|
|
109
|
+
... )
|
|
110
|
+
>>> otp.run(src) # doctest: +SKIP
|
|
111
|
+
"""
|
|
112
|
+
if self._try_default_constructor(schema=schema, **kwargs):
|
|
113
|
+
return
|
|
114
|
+
|
|
115
|
+
if cache_name is None:
|
|
116
|
+
raise ValueError("Missing required parameter `cache_name`")
|
|
117
|
+
|
|
118
|
+
if read_mode not in {"automatic", "cache_only", "query_only"}:
|
|
119
|
+
raise ValueError(f"Incorrect value of `read_mode` parameter passed: {read_mode}")
|
|
120
|
+
|
|
121
|
+
if update_cache and read_mode == 'cache_only':
|
|
122
|
+
raise ValueError("`update_cache` parameter couldn't be set to True with `read_mode` set to cache_only")
|
|
123
|
+
|
|
124
|
+
read_mode = read_mode.upper()
|
|
125
|
+
|
|
126
|
+
otq_params = process_otq_params(otq_params)
|
|
127
|
+
|
|
128
|
+
super().__init__(
|
|
129
|
+
_symbols=symbol,
|
|
130
|
+
_start=start,
|
|
131
|
+
_end=end,
|
|
132
|
+
_base_ep_func=lambda: self.base_ep(
|
|
133
|
+
db=db,
|
|
134
|
+
tick_type=tick_type,
|
|
135
|
+
cache_name=cache_name,
|
|
136
|
+
read_mode=read_mode,
|
|
137
|
+
update_cache=update_cache,
|
|
138
|
+
otq_params=otq_params,
|
|
139
|
+
create_cache_query=create_cache_query,
|
|
140
|
+
),
|
|
141
|
+
schema=schema,
|
|
142
|
+
**kwargs,
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
def base_ep(
|
|
146
|
+
self,
|
|
147
|
+
db=utils.adaptive_to_default,
|
|
148
|
+
tick_type=utils.adaptive,
|
|
149
|
+
cache_name=None,
|
|
150
|
+
read_mode="automatic",
|
|
151
|
+
update_cache=True,
|
|
152
|
+
otq_params="",
|
|
153
|
+
create_cache_query="",
|
|
154
|
+
):
|
|
155
|
+
src = Source(
|
|
156
|
+
otq.ReadCache(
|
|
157
|
+
cache_name=cache_name,
|
|
158
|
+
per_cache_otq_params=otq_params,
|
|
159
|
+
read_mode=read_mode,
|
|
160
|
+
update_cache=update_cache,
|
|
161
|
+
create_cache_query=create_cache_query,
|
|
162
|
+
)
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
update_node_tick_type(src, tick_type, db)
|
|
166
|
+
|
|
167
|
+
return src
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import datetime as dt
|
|
2
|
+
|
|
3
|
+
from typing import Optional, Union, Type, List
|
|
4
|
+
|
|
5
|
+
from onetick.py.otq import otq
|
|
6
|
+
import pandas as pd
|
|
7
|
+
|
|
8
|
+
from onetick.py.core._source._symbol_param import _SymbolParamColumn
|
|
9
|
+
from onetick.py.core.source import Source
|
|
10
|
+
from onetick.py.core.column_operations.base import OnetickParameter
|
|
11
|
+
|
|
12
|
+
from .. import types as ott
|
|
13
|
+
from .. import utils, configuration
|
|
14
|
+
|
|
15
|
+
AdaptiveTickType = Union[str, OnetickParameter, _SymbolParamColumn, Type[utils.adaptive]]
|
|
16
|
+
AdaptiveDBType = Union[str, OnetickParameter, _SymbolParamColumn, Type[utils.adaptive], List[str]]
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def get_start_end_by_date(date):
|
|
20
|
+
if isinstance(date, (ott.datetime, ott.date)):
|
|
21
|
+
start = date.start
|
|
22
|
+
end = date.end
|
|
23
|
+
elif isinstance(date, (dt.datetime, dt.date)):
|
|
24
|
+
start = dt.datetime(date.year, date.month, date.day)
|
|
25
|
+
end = start + dt.timedelta(days=1, milliseconds=-1)
|
|
26
|
+
else:
|
|
27
|
+
raise ValueError(f"Unsupported value of parameter 'date': {type(date)}")
|
|
28
|
+
return start, end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def convert_tick_type_to_str(
|
|
32
|
+
tick_type: Optional[AdaptiveTickType],
|
|
33
|
+
db: Optional[AdaptiveDBType] = None,
|
|
34
|
+
) -> Optional[str]:
|
|
35
|
+
if not isinstance(db, list) and not isinstance(db, (OnetickParameter, _SymbolParamColumn)):
|
|
36
|
+
if tick_type is utils.adaptive:
|
|
37
|
+
tick_type = 'ANY'
|
|
38
|
+
|
|
39
|
+
if isinstance(tick_type, type) or tick_type is None:
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
if db is utils.adaptive_to_default or db is utils.adaptive:
|
|
43
|
+
# if default database is not set, tick type will be set without it
|
|
44
|
+
# and symbols will have to be specified in otp.run
|
|
45
|
+
db = configuration.config.get('default_db')
|
|
46
|
+
|
|
47
|
+
str_db = str(db) if db is not None else ''
|
|
48
|
+
str_tt = str(tick_type) if tick_type is not None else ''
|
|
49
|
+
|
|
50
|
+
is_db_symbol_param = isinstance(db, _SymbolParamColumn)
|
|
51
|
+
is_tt_symbol_param = isinstance(tick_type, _SymbolParamColumn)
|
|
52
|
+
|
|
53
|
+
if isinstance(db, OnetickParameter):
|
|
54
|
+
str_db = db.parameter_expression
|
|
55
|
+
|
|
56
|
+
if isinstance(tick_type, OnetickParameter):
|
|
57
|
+
str_tt = tick_type.parameter_expression
|
|
58
|
+
|
|
59
|
+
if db is None:
|
|
60
|
+
if is_tt_symbol_param:
|
|
61
|
+
return f"expr({str_tt})"
|
|
62
|
+
return str_tt
|
|
63
|
+
|
|
64
|
+
if isinstance(db, list):
|
|
65
|
+
str_db = "+".join(db)
|
|
66
|
+
|
|
67
|
+
if tick_type is not None:
|
|
68
|
+
if is_db_symbol_param:
|
|
69
|
+
if is_tt_symbol_param:
|
|
70
|
+
return f"expr({str_db} + '::' + {str_tt})"
|
|
71
|
+
|
|
72
|
+
return f"expr({str_db} + '::{str_tt}')"
|
|
73
|
+
|
|
74
|
+
if is_tt_symbol_param:
|
|
75
|
+
return f"expr('{str_db}::' + {str_tt})"
|
|
76
|
+
elif "::" not in str_db:
|
|
77
|
+
return str_db + "::" + str_tt
|
|
78
|
+
elif is_db_symbol_param:
|
|
79
|
+
return f"expr({str_db})"
|
|
80
|
+
|
|
81
|
+
return str_db
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def update_node_tick_type(
|
|
85
|
+
src: "Source",
|
|
86
|
+
tick_type: Optional[AdaptiveTickType],
|
|
87
|
+
db: Optional[AdaptiveDBType] = None,
|
|
88
|
+
):
|
|
89
|
+
"""
|
|
90
|
+
Update tick type of the node of the source ``src`` according to ``db`` name and ``tick_type``.
|
|
91
|
+
|
|
92
|
+
Adaptive tick type means that tick type value doesn't affect query results
|
|
93
|
+
and, thus, we change it to some constant value.
|
|
94
|
+
|
|
95
|
+
Parameters
|
|
96
|
+
----------
|
|
97
|
+
src: Source
|
|
98
|
+
source to set tick type on
|
|
99
|
+
tick_type: Optional[AdaptiveTickType]
|
|
100
|
+
string tick type or :py:class:`onetick.py.adaptive`
|
|
101
|
+
db: Optional[AdaptiveDBType]
|
|
102
|
+
optional db name or list of strings with db names and tick types
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
str_db = convert_tick_type_to_str(tick_type, db)
|
|
106
|
+
if str_db is None:
|
|
107
|
+
return
|
|
108
|
+
|
|
109
|
+
src.tick_type(str_db)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _common_passthrough_base_ep(db, tick_type):
|
|
113
|
+
src = Source(otq.Passthrough(fields="SYMBOL_NAME,TICK_TYPE", drop_fields=True))
|
|
114
|
+
update_node_tick_type(src, tick_type, db)
|
|
115
|
+
return src
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def default_date_converter(date):
|
|
119
|
+
return pd.to_datetime(date, format='%Y%m%d%H%M%S.%f')
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def to_timestamp_nanos(date, date_converter, tz):
|
|
123
|
+
date = date_converter(date)
|
|
124
|
+
if isinstance(date, ott.dt):
|
|
125
|
+
date = date.ts
|
|
126
|
+
else:
|
|
127
|
+
date = pd.to_datetime(date)
|
|
128
|
+
return date.tz_localize(tz)
|