[docs]classColumn(_Operation):""" :py:class:`~onetick.py.Source` column container. This is the object you get when using :py:meth:`~onetick.py.Source.__getitem__`. You can use this object everywhere where :py:class:`~onetick.py.Operation` object can be used. Examples -------- >>> t = otp.Tick(A=1) >>> t['A'] Column(A, <class 'int'>) """def__init__(self,name,dtype=float,obj_ref=None,to_str_func=None,precision=None,pre_format=None,post_format=None):ifnotdtypeornotinspect.isclass(dtype)ornotott.is_type_supported(dtype):raiseTypeError(f'Column does not support "{dtype}" type')self.name=namesuper().__init__(dtype=dtype,obj_ref=obj_ref,op_str=name)ifto_str_func:self.to_str_func=to_str_funcelse:self.to_str_func=self.__str__self.pre_format=None# TODO: not used yet, but going to be used inself.post_format=None# PY-35# optional propertiesifprecisionisnotNone:ifissubclass(dtype,float):self._precision=precisionelse:raiseValueError("precision is supported only for columns with float or decimal dtypes")defrename(self,new_name,update_parent_object=True):ifself.obj_refandupdate_parent_object:self.obj_ref.rename({self.name:new_name},inplace=True)self.name=new_namedef__len__(self):ifissubclass(self.dtype,str):ifissubclass(self.dtype,ott.string):returnself.dtype.lengthelse:returnott.string.DEFAULT_LENGTHelse:raiseTypeError(f'It is not applicable for the column with type {self.dtype}')# TODO: testdef__hash__(self):returnhash(self.name)def__str__(self):fromonetick.py.core._source._symbol_param_sourceimport_SymbolParamSourceifself.obj_ref:result=""ifisinstance(self.obj_ref,_SymbolParamSource):# TODO: PY-35# This is ad-hoc check, really we need to change column formatting to# pre- and post-formats, and copy columns through the .copy() method# on the _Column instead of copying them manually in different places# of the _Source classifself.name!="_SYMBOL_NAME":result="_SYMBOL_PARAM."ifself.obj_ref.use_name_for_column_prefix():ifself.obj_ref.node_name().strip()=="":raiseException("You set to use name for column prefix, but name is empty")result=self.obj_ref.node_name()+"."result+=self.nameifisinstance(self.obj_ref,_SymbolParamSource):# symbol params always are string, need to convertifself.dtypeisfloat:result=f"atof({result})"elifself.dtypeisint:result=f"atol({result})"elifself.dtypeisott.msectime:result=f"msec_str_to_nsectime({result})"elifself.dtypeisott.nsectime:result=f"msec_str_to_nsectime({result})"else:result=self.namereturnresultdef__repr__(self):returnf"Column({str(self)}, {self.dtype})"defcopy(self,obj_ref=None):return_Column(self.name,self.dtype,obj_ref,pre_format=self.pre_format,post_format=self.post_format)def__bool__(self):if_Column.emulation_enabled:ifissubclass(self.dtype,int):return(self!=0).__bool__()ifissubclass(self.dtype,float):return(self!=0).__bool__()ifissubclass(self.dtype,str):return(self!="").__bool__()raiseTypeError("It is not allowed to use columns in if-else and while clauses")
[docs]def__getitem__(self,item):""" Provides an ability to get values from future or past ticks. - Negative values refer to past ticks - Zero to current tick - Positive - future ticks Boundary values will be defaulted. For instance for ``item=-1`` first tick value will be defaulted (there is no tick before first tick) Parameters ---------- item: int number of ticks to look back/forward Returns ------- Operation Examples -------- >>> data = otp.Ticks({'A': [1, 2, 3]}) >>> data['PAST1'] = data['A'][-1] >>> data['PAST2'] = data['A'][-2] >>> data['FUTURE1'] = data['A'][1] >>> data['FUTURE2'] = data['A'][2] >>> otp.run(data) Time A PAST1 PAST2 FUTURE1 FUTURE2 0 2003-12-01 00:00:00.000 1 0 0 2 3 1 2003-12-01 00:00:00.001 2 1 0 3 0 2 2003-12-01 00:00:00.002 3 2 1 0 0 """ifnotisinstance(item,int):raiseTypeError("Lag operation supports only integer const values,"f" but passed value of type '{type(item)}'")ifitem==0:returnselfreturn_LagOperator(self,item)
def__iter__(self):raiseTypeError("It is not allowed to use columns in for-clauses")
class_LagOperator(_Operation):""" Implements referencing to the prior tick """def__init__(self,base_column,inx):self._inx=inxop_str=f"{str(base_column)}[{self.index}]"super().__init__(op_params=[base_column],dtype=base_column.dtype,op_str=op_str,obj_ref=base_column.obj_ref)@propertydefindex(self):returnself._inx_Column=Column# alias for backward compatibility