多币种收盘价同时计算移动平均线报错问题求助
问题原因
你遇到的ValueError是因为forex_data_1['Close']包含多列(对应AUDUSD=X、EURUSD=X等不同币种的收盘价),调用rolling(window=30).mean()后返回的是多列DataFrame,但你试图将其赋值给一个名为Moving average的单列,数据结构不匹配导致报错。
解决方案
方案1:为每个币种单独生成移动均线列(保留宽表结构)
如果想维持原有的宽表格式,给每个币种的收盘价对应生成一列均线,可以通过添加后缀的方式命名新列,再合并回原DataFrame:
# 计算所有币种的30日均线,为新列添加"_MA30"后缀 ma_data = forex_data_1['Close'].rolling(window=30).mean().add_suffix('_MA30') # 将均线数据合并到原DataFrame中 forex_data_1 = forex_data_1.join(ma_data)
执行后会生成AUDUSD=X_MA30、EURUSD=X_MA30这类列,分别对应每个币种的30日均线。
方案2:转长表后统一计算均线(适合按币种分析)
如果希望把所有币种的收盘价和均线放在同一列(长表格式),方便后续按币种做可视化或分析,可以先将宽表转成长表,再分组计算均线:
# 将宽表转成长表:新增"Currency"列标记币种,"Close"列统一存储收盘价 long_data = forex_data_1.melt( id_vars=['Date'], # 假设你的DataFrame有Date列作为时间标识 value_vars=forex_data_1['Close'].columns, var_name='Currency', value_name='Close' ) # 按币种分组,计算每组的30日均线 long_data['Moving average'] = long_data.groupby('Currency')['Close'].rolling(window=30).mean().reset_index(level=0, drop=True)
转长表后,每条记录对应一个币种的单日收盘价及对应均线,结构更规整。
内容的提问来源于stack exchange,提问作者Thokozani
相关产品推荐
相关产品推荐

