mirror of
https://github.com/wassname/pandas-ta.git
synced 2026-08-09 12:20:21 +08:00
Add above and below functions
This commit is contained in:
@@ -836,6 +836,40 @@ class AnalysisIndicators(BasePandasObject):
|
||||
self._append(result, **kwargs)
|
||||
return result
|
||||
|
||||
def above(self, a=None, b=None, asint=True, offset=None, **kwargs):
|
||||
if a is None and b is None: return self._df
|
||||
else:
|
||||
a = self._get_column(a, f"{a}")
|
||||
b = self._get_column(b, f"{b}")
|
||||
result = above(series_a=a, series_b=b, asint=asint, offset=offset, **kwargs)
|
||||
self._append(result, **kwargs)
|
||||
return result
|
||||
|
||||
def above_value(self, a=None, value=None, asint=True, offset=None, **kwargs):
|
||||
if a is None and value is None: return self._df
|
||||
else:
|
||||
a = self._get_column(a, f"{a}")
|
||||
result = above_value(series_a=a, value=value, asint=asint, offset=offset, **kwargs)
|
||||
self._append(result, **kwargs)
|
||||
return result
|
||||
|
||||
def below(self, a=None, b=None, asint=True, offset=None, **kwargs):
|
||||
if a is None and b is None: return self._df
|
||||
else:
|
||||
a = self._get_column(a, f"{a}")
|
||||
b = self._get_column(b, f"{b}")
|
||||
result = below(series_a=a, series_b=b, asint=asint, offset=offset, **kwargs)
|
||||
self._append(result, **kwargs)
|
||||
return result
|
||||
|
||||
def below_value(self, a=None, value=None, asint=True, offset=None, **kwargs):
|
||||
if a is None and value is None: return self._df
|
||||
else:
|
||||
a = self._get_column(a, f"{a}")
|
||||
result = below_value(series_a=a, value=value, asint=asint, offset=offset, **kwargs)
|
||||
self._append(result, **kwargs)
|
||||
return result
|
||||
|
||||
|
||||
|
||||
# Volatility Indicators
|
||||
|
||||
@@ -57,6 +57,52 @@ def cross(series_a:pd.Series, series_b:pd.Series, above:bool =True, asint:bool =
|
||||
return cross
|
||||
|
||||
|
||||
def above(series_a:pd.Series, series_b:pd.Series, asint:bool =True, offset:int =None, **kwargs):
|
||||
return _above_below(series_a, series_b, above=True, asint=asint, offset=offset, **kwargs)
|
||||
|
||||
|
||||
def above_value(series_a:pd.Series, value:float, asint:bool =True, offset:int =None, **kwargs):
|
||||
series_b = pd.Series(value, index=series_a.index, name=f'{value}'.replace('.','_'))
|
||||
return _above_below(series_a, series_b, above=True, asint=asint, offset=offset, **kwargs)
|
||||
|
||||
|
||||
def below(series_a:pd.Series, series_b:pd.Series, asint:bool =True, offset:int =None, **kwargs):
|
||||
return _above_below(series_a, series_b, above=False, asint=asint, offset=offset, **kwargs)
|
||||
|
||||
|
||||
def below_value(series_a:pd.Series, value:float, asint:bool =True, offset:int =None, **kwargs):
|
||||
series_b = pd.Series(value, index=series_a.index, name=f'{value}'.replace('.','_'))
|
||||
return _above_below(series_a, series_b, above=False, asint=asint, offset=offset, **kwargs)
|
||||
|
||||
|
||||
def _above_below(series_a:pd.Series, series_b:pd.Series, above:bool =True, asint:bool =True, offset:int =None, **kwargs):
|
||||
series_a = verify_series(series_a)
|
||||
series_b = verify_series(series_b)
|
||||
offset = get_offset(offset)
|
||||
|
||||
series_a.apply(zero)
|
||||
series_b.apply(zero)
|
||||
|
||||
# Calculate Result
|
||||
if above:
|
||||
current = series_a >= series_b
|
||||
else:
|
||||
current = series_a <= series_b
|
||||
|
||||
if asint:
|
||||
current = current.astype(int)
|
||||
|
||||
# Offset
|
||||
if offset != 0:
|
||||
current = current.shift(offset)
|
||||
|
||||
# Name & Category
|
||||
current.name = f"{series_a.name}_{'A' if above else 'B'}_{series_b.name}"
|
||||
current.category = 'utility'
|
||||
|
||||
return current
|
||||
|
||||
|
||||
def df_error_analysis(dfA:pd.DataFrame, dfB:pd.DataFrame, **kwargs):
|
||||
""" """
|
||||
col = kwargs.pop('col', None)
|
||||
|
||||
Reference in New Issue
Block a user