使用Decimal列表的scipy.stats.pearsonr?

0 投票
1 回答
622 浏览
提问于 2025-04-20 21:41

我在用 scipy.stats.pearsonr 这个函数处理两个 Decimal 类型的列表时,发现 scipy 不太高兴,出现了问题:

print type(signals)
print type(signals[0])
print type(prices)
print type(prices[0])

<type 'list'>
<class 'decimal.Decimal'>
<type 'list'>
<class 'decimal.Decimal'>

correlation = stats.pearsonr(signals, prices)

Traceback (most recent call last):
   File "commod.py", line 74, in <module>
    main()
  File "commod.py", line 69, in main
    correlation = stats.pearsonr(signals, prices)
  File "/home/.../venv/local/lib/python2.7/site-packages/scipy/stats/stats.py", line 2445, in pearsonr
    t_squared = r*r * (df / ((1.0 - r) * (1.0 + r)))
TypeError: unsupported operand type(s) for -: 'float' and 'Decimal'

有没有人遇到过这个问题,有什么解决办法吗?

1 个回答

0

这个错误的意思是,问题出在 pearsonr 函数试图对浮点数和十进制数进行数学运算,而Python不喜欢这样。你可以把十进制数的列表转换成浮点数来解决这个问题。

stats.pearsonr([float(val) for val in signals], [float(val) for val in prices])

虽然你在评论中提到想用十进制数来保持精确的格式,但实际上,浮点数的误差对你的结果影响不大。

撰写回答