pandas使用transform归一化股价时报ValueError传递项数不符如何解决
报错原因
- 时间切片操作未生效:执行
df.loc['2020-01-01':]后没有赋值回df,此时df仍然保留全量历史数据。同时如果读取数据时没有将Date列转换为Datetime格式并设置为索引,时间切片的逻辑也不会正常生效。 transform调用逻辑错误:你定义的normalized函数接收了series参数,但函数内部全程没有使用该参数,反而直接调用全量的df['Adj Close']做计算,返回的是一整个和df行数长度相等的序列。而transform对单列调用时,预期自定义函数返回和输入单元长度匹配的结果,你相当于给每个位置都传入了一整段355个元素的数组,和预期的1个值不匹配,因此抛出该错误。
解决方法
全局最小最大归一化不需要额外调用transform,直接对整列计算即可,完整代码如下:
import pandas as pd import numpy as np # 读取数据时直接解析日期并设置为索引 df = pd.read_csv('filename.csv', parse_dates=['Date'], index_col='Date') # 完成时间切片并赋值回df,加copy避免后续操作出现链式赋值警告 df = df.loc['2020-01-01':'2023-05-31'].copy() # 直接计算归一化值 min_adj = df['Adj Close'].min() max_adj = df['Adj Close'].max() df['Prices Normalized'] = (df['Adj Close'] - min_adj) / (max_adj - min_adj)
如果你需要保留transform的写法,只需要修改自定义函数,使用传入的series参数即可:
def normalized(series): minimum = series.min() maximum = series.max() return (series - minimum) / (maximum - minimum) df['Prices Normalized'] = df['Adj Close'].transform(normalized)
补充说明:如果你的数据集包含多只股票的价格,需要按个股单独归一化,只需配合
groupby使用即可:df['Prices Normalized'] = df.groupby('Ticker')['Adj Close'].transform(normalized)
内容的提问来源于stack exchange,提问作者Alfredo Di Massimo
相关产品推荐
相关产品推荐

