TypeError: Argument has incorrect type (expected numpy.ndarray, got DataFrame) 解决方案
在conda环境中升级软件包后,talib无法接受DataFrame作为输入,错误信息如下所示:TypeError: Argument 'xxx' has incorrect type (expected numpy.ndarray, got DataFrame)
:
Traceback (most recent call last):
File "/data/1.py", line 7, in <module>
df['SMA_5'] = ta.SMA(df['Close'], timeperiod=5)
File "/data/miniconda3/envs/a/lib/python3.10/site-packages/talib/__init__.py", line 64, in wrapper
result = func(*_args, **_kwds)
TypeError: Argument 'real' has incorrect type (expected numpy.ndarray, got DataFrame)
大多数网络搜索结果都具有误导性,比如将df转换为np数组。由于在更新软件包之前代码能够正常运行,因此问题应为软件包不兼容的问题。
问题复现:
import talib as ta
import yfinance as yf
df = yf.download("MSFT", period='5d')
df['SMA'] = ta.SMA(df['Close'], timeperiod=3)
使用 $ conda list
检查版本差异:
不可用的版本:
python 3.10.13 hd12c33a_1_cpython conda-forge
pandas 2.1.4 py310h1128e8f_0
ta-lib 0.4.32 py310h8a78493_0 conda-forge
yfinance 0.2.48 pyhd8ed1ab_0 conda-forge
可用的版本:
python 3.8.20 he870216_0
pandas 1.5.3 py38h417a72b_0
ta-lib 0.4.32 py38he82f83a_0 conda-forge
yfinance 0.2.40 pyhd8ed1ab_0 conda-forge
发现根本原因是yfinance而不是talib和pandas费了点功夫。
最终发现talib在yfinance 0.2.44版本正常工作,但在0.2.46及以上版本无法正常工作。
解决方案是将yfinance降级到0.2.44:
$ conda install yfinance=0.2.44
然后talib和pandas就能正常工作了。
发布了一个yfinance的github issue:https://github.com/ranaroussi/yfinance/issues/2107