bta-lib adx() => Error (??!)
-
Hi there. I'm having trouble getting bta-lib's adx() to work. Would greatly appreciate any help I can get from this group.
Here's a small piece of code that demonstrates the problem, and below the code is the output I get from running it.
C O D E:
https://gist.github.com/randie/5cac0dbf845b8b323a311ed32abea2c7import pandas as pd import btalib as bta df = pd.read_csv("data/tickers/AMD.csv", parse_dates=True, index_col='Date') df['rsi'] = bta.rsi(df).df # works df['adx'] = bta.adx(df).df # does not work print(df.tail())
O U T P U T:
# # Output with adx() line commented out => works # (sandbox) 10:38 • screener • master • d5822cb ✗ ❯ /opt/anaconda3/envs/sandbox/bin/python /Users/randie/projects/screener/bta-adx.py Open High Low Close Adj Close Volume rsi Date 2021-03-19 78.489998 79.339996 77.589996 79.059998 79.059998 42247100 42.284132 2021-03-22 79.989998 81.269997 79.220001 80.300003 80.300003 39648600 44.939105 2021-03-23 80.129997 80.339996 77.949997 78.379997 78.379997 40466600 41.737588 2021-03-24 77.550003 78.800003 76.400002 76.480003 76.480003 43753600 38.792404 2021-03-25 75.849998 76.949997 74.959999 76.220001 76.220001 44663000 38.393151 # # Output with adx() line back in => does not work! # (sandbox) 10:38 • screener • master • d5822cb ✗ ❯ /opt/anaconda3/envs/sandbox/bin/python /Users/randie/projects/screener/bta-adx.py Traceback (most recent call last): File "/Users/randie/projects/sandbox/python/screener/adx.py", line 8, in <module> df['adx'] = bta.adx(df).df # does not work File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/indicator.py", line 152, in __call__ b_init(self, *args, **kwargs) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/indicators/directionalmove.py", line 97, in __init__ self._pdm = self._smoother(pdm, **smoothargs) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/indicator.py", line 152, in __call__ b_init(self, *args, **kwargs) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/indicators/directionalmove.py", line 52, in __init__ self.o.smacc = _ewm._lfilter(alpha=1.0, beta=(p - 1) / p) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/meta/lines.py", line 343, in _lfilter return self._apply(_sp_lfilter) # trigger __getattr__ for _apply File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/meta/lines.py", line 379, in call_op result[self._minidx:] = r = op(*sargs, **kwargs) # run/store File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 469, in _apply return self._apply_blockwise(homogeneous_func, name) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 384, in _apply_blockwise return self._apply_series(homogeneous_func, name) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 373, in _apply_series result = homogeneous_func(values) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 461, in homogeneous_func result = calc(values) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 455, in calc return func(x, start, end, min_periods) TypeError: _sp_lfilter() takes 1 positional argument but 4 were given
-
@randietrades I'm getting the same error.
-
I am also getting the same error. Probably the library is wrong or badly made, I deduce that because nobody apparently knows anything about how to solve the error ...
-
@randietrades Try running in the terminal or anything outside Jupyter. I suspect it's a notebook thing. Working for me in Pycharm.
-
@run-out Thanks for your response.
It's not a notebook thing- I am running in the terminal, not a Jupyter notebook.
A little surprised it works in Pycharm but fails in other environments because the error is a TypeError regarding positional args which makes me think it's either a coding error or some library version incompatibility? ¯\_(ツ)_/¯
Btw, I'm running python v3.8.8 from the Anaconda distribution. What version of python are you running? Can you post your output, the one that works in Pycharm?
From my terminal:
(sandbox) 20:32 • screener • master • d5822cb ✗ ❯ hardpath $(which python) /opt/anaconda3/envs/sandbox/bin/python3.8 (sandbox) 20:32 • screener • master • d5822cb ✗ ❯ python bta-adx.py Traceback (most recent call last): File "bta-adx.py", line 7, in <module> df['adx'] = bta.adx(df).df # does not work File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/indicator.py", line 152, in __call__ b_init(self, *args, **kwargs) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/indicators/directionalmove.py", line 97, in __init__ self._pdm = self._smoother(pdm, **smoothargs) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/indicator.py", line 152, in __call__ b_init(self, *args, **kwargs) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/indicators/directionalmove.py", line 52, in __init__ self.o.smacc = _ewm._lfilter(alpha=1.0, beta=(p - 1) / p) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/meta/lines.py", line 343, in _lfilter return self._apply(_sp_lfilter) # trigger __getattr__ for _apply File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/meta/lines.py", line 379, in call_op result[self._minidx:] = r = op(*sargs, **kwargs) # run/store File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 469, in _apply return self._apply_blockwise(homogeneous_func, name) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 384, in _apply_blockwise return self._apply_series(homogeneous_func, name) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 373, in _apply_series result = homogeneous_func(values) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 461, in homogeneous_func result = calc(values) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 455, in calc return func(x, start, end, min_periods) TypeError: _sp_lfilter() takes 1 positional argument but 4 were given
-
I ran this in terminal in a virtual environment. BTALIB is 1.0.0 for all.
Here is the log:
(venv) runout@runout-acer:~/projects/scratch$ python3 Python 3.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import btalib >>> btalib.__version__ '1.0.0' >>> import pandas as pd >>> pd.__version__ '1.0.4' >>> df = pd.read_csv("data/2006-day-001.txt", parse_dates=True, index_col='Date') >>> adx = btalib.ADX(df).df >>> print(f"ADX: \n{adx.tail()}") ADX: adx Date 2006-12-21 18.249594 2006-12-22 17.009876 2006-12-27 16.336722 2006-12-28 15.879341 2006-12-29 15.302485
As you can see adx running no problem. But I notice my pandas version is a bit old. So I upgrade:
... Installing collected packages: pandas Attempting uninstall: pandas Found existing installation: pandas 1.0.4 Uninstalling pandas-1.0.4: Successfully uninstalled pandas-1.0.4 Successfully installed pandas-1.2.3
Then I run the same script again as above.
Python 3.8.5 (default, Jan 27 2021, 15:41:15) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import btalib >>> btalib.__version__ '1.0.0' >>> import pandas as pd >>> pd.__version__ '1.2.3' >>> df = pd.read_csv("data/2006-day-001.txt", parse_dates=True, index_col='Date') >>> adx = btalib.ADX(df).df Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/btalib/indicator.py", line 152, in __call__ b_init(self, *args, **kwargs) File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/btalib/indicators/directionalmove.py", line 97, in __init__ self._pdm = self._smoother(pdm, **smoothargs) File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/btalib/indicator.py", line 152, in __call__ b_init(self, *args, **kwargs) File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/btalib/indicators/directionalmove.py", line 52, in __init__ self.o.smacc = _ewm._lfilter(alpha=1.0, beta=(p - 1) / p) File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/btalib/meta/lines.py", line 343, in _lfilter return self._apply(_sp_lfilter) # trigger __getattr__ for _apply File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/btalib/meta/lines.py", line 379, in call_op result[self._minidx:] = r = op(*sargs, **kwargs) # run/store File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 469, in _apply return self._apply_blockwise(homogeneous_func, name) File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 384, in _apply_blockwise return self._apply_series(homogeneous_func, name) File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 373, in _apply_series result = homogeneous_func(values) File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 461, in homogeneous_func result = calc(values) File "/home/runout/projects/scratch/venv/lib/python3.8/site-packages/pandas/core/window/rolling.py", line 455, in calc return func(x, start, end, min_periods) TypeError: _sp_lfilter() takes 1 positional argument but 4 were given
And now I have your error.
And just to triple check, if I revert pandas to 1.0.4
>>> import btalib >>> btalib.__version__ '1.0.0' >>> import pandas as pd >>> pd.__version__ '1.0.4' >>> df = pd.read_csv("data/2006-day-001.txt", parse_dates=True, index_col='Date') >>> adx = btalib.ADX(df).df >>> print(f"ADX: \n{adx.tail()}") ADX: adx Date 2006-12-21 18.249594 2006-12-22 17.009876 2006-12-27 16.336722 2006-12-28 15.879341 2006-12-29 15.302485 >>>
Try installing an older version of pandas and see if that helps.
-
@run-out Thanks again for responding 👍🏼
I tried pandas v1.0.4 (the version that worked for you), but some other error came up 🤨 This time the error looks like it's in numpy- what version of numpy is installed in your venv? Mine is v1.20.1.
Here's my output:
(sandbox) 11:47 • screener • master • d5822cb ✗ ❯ python Python 3.8.8 (default, Feb 24 2021, 13:46:16) [Clang 10.0.0 ] :: Anaconda, Inc. on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import btalib >>> btalib.__version__ '1.0.0' >>> import pandas as pd >>> pd.__version__ '1.0.4' >>> df = pd.read_csv("data/tickers/AMD.csv", parse_dates=True, index_col='Date') >>> adx = btalib.ADX(df).df Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/indicator.py", line 152, in __call__ b_init(self, *args, **kwargs) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/indicators/directionalmove.py", line 92, in __init__ upmove = self.i.high.diff(periods=self.p._period) # can apply diff File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/btalib/meta/lines.py", line 140, in real_standard_op result = pd.Series(np.nan, index=self._series.index) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/series.py", line 305, in __init__ data = sanitize_array(data, index, dtype, copy, raise_cast_failure=True) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/construction.py", line 465, in sanitize_array subarr = construct_1d_arraylike_from_scalar(value, len(index), dtype) File "/opt/anaconda3/envs/sandbox/lib/python3.8/site-packages/pandas/core/dtypes/cast.py", line 1452, in construct_1d_arraylike_from_scalar subarr = np.empty(length, dtype=dtype) TypeError: Cannot interpret '<attribute 'dtype' of 'numpy.generic' objects>' as a data type
-
@run-out I found the library version incompatibility! I was running with numpy v1.20.1, the latest version. I installed an older version, the version of numpy available right around when btalib v1.0.0 was released, numpy v1.18.2. It worked 🙌🏼 So that means bta-lib needs to be updated to work with the latest versions of pandas and numpy.
Thanks again for taking the time to work this out with me 👍🏼🌷
Here's my output now:
(sandbox) 13:13 • screener • master • d5822cb ✗ ❯ python bta-adx.py numpy v1.18.2 pandas v1.0.4 btalib v1.0.0 Open High Low ... Volume rsi adx Date ... 2021-03-22 79.989998 81.269997 79.220001 ... 39648600 44.939105 26.393616 2021-03-23 80.129997 80.339996 77.949997 ... 40466600 41.737588 26.112061 2021-03-24 77.550003 78.800003 76.400002 ... 43753600 38.792404 26.252038 2021-03-25 75.849998 76.949997 74.959999 ... 44735100 38.393151 26.729348 2021-03-26 76.620003 77.500000 75.029999 ... 49109400 41.367524 26.915669 [5 rows x 8 columns]