计算比特币Money Flow Index时触发TypeError:numpy.float64无len()方法
解决比特币MFI计算中的TypeError问题
看起来你在使用pyti库计算资金流指数(MFI)时遇到了参数传递的问题,这个TypeError: object of type 'numpy.float64' has no len()错误,通常是因为给money_flow_index函数传入了单个数值而非数组,或者参数格式不符合要求。我们一步步来修复你的代码:
1. 先修正数据顺序问题
GDAX的get_product_historic_rates返回的数据是从最新到最旧的倒序排列,直接用的话会导致技术指标计算逻辑错误,所以第一步要反转数据:
historic = public_client.get_product_historic_rates('BTC-USD', granularity=60) # 反转数据,让时间从旧到新 historic = historic[::-1]
2. 准备MFI所需的核心数据
MFI的计算依赖两个关键数据:
- 典型价格(Typical Price):公式为
(High + Low + Close) / 3 - 成交量(Volume):直接用数据里的Volume字段
在你的DataFrame中添加典型价格列:
df = pd.DataFrame(historic) df.columns = ['Time', 'Low', 'High', 'Open', 'Close', 'Volume'] # 计算典型价格 df['Typical_Price'] = (df['High'] + df['Low'] + df['Close']) / 3
3. 正确调用pyti的money_flow_index函数
pyti的money_flow_index函数需要三个参数(最后一个可选):
- 第一个参数:典型价格的数组/Series
- 第二个参数:成交量的数组/Series
- 第三个参数:计算周期(默认14,可选)
注意不要传入单个数值(比如某一行的Close值),必须传入整个序列。修改后的调用代码如下:
# 计算MFI,这里用默认的14周期 df['MFI'] = mfi(df['Typical_Price'], df['Volume'], period=14)
4. 完整修正后的代码
把所有步骤整合起来,完整代码如下:
import gdax import pandas as pd from pyti.money_flow_index import money_flow_index as mfi public_client = gdax.PublicClient() # 获取历史数据并反转顺序 historic = public_client.get_product_historic_rates('BTC-USD', granularity=60) historic = historic[::-1] pd.set_option('display.max_rows', 30) df = pd.DataFrame(historic) df.columns = ['Time', 'Low', 'High', 'Open', 'Close', 'Volume'] # 计算典型价格 df['Typical_Price'] = (df['High'] + df['Low'] + df['Close']) / 3 # 计算MFI df['MFI'] = mfi(df['Typical_Price'], df['Volume'], period=14) # 取前30行查看 df = df.head(n=30) print(df, '\n')
错误原因分析
你代码里的close_data是未定义的变量,而且没有正确调用mfi函数。如果之前尝试调用时错误地传入了单个数值(比如mfi(df['Close'].iloc[0], ...)),就会触发numpy.float64没有len()的错误——因为函数期望接收一个可迭代的数组/序列,而非单个数值。
内容的提问来源于stack exchange,提问作者This play nay mm
相关产品推荐
相关产品推荐

