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