Python 如何使用Shift()和Apply()函数对行进行迭代?
对于以日期为索引的股价数据框,当我使用shift()获取上一个值并使用apply()创建存储上一个值的列时,会出现以下错误:Python 如何使用Shift()和Apply()函数对行进行迭代?,python,pandas,apply,shift,Python,Pandas,Apply,Shift,对于以日期为索引的股价数据框,当我使用shift()获取上一个值并使用apply()创建存储上一个值的列时,会出现以下错误: AttributeError: 'numpy.float64' object has no attribute 'shift' 以下是生成此错误的代码: df.head(10) Open High Low Close Volume Date
AttributeError: 'numpy.float64' object has no attribute 'shift'
以下是生成此错误的代码:
df.head(10)
Open High Low Close Volume
Date
2004-01-01 66.60 71.55 66.70 71.55 664600.0
2004-01-02 71.55 76.85 73.55 74.50 608500.0
2004-01-05 74.50 77.00 73.50 73.50 249400.0
2004-01-06 73.50 74.45 72.30 73.30 248600.0
2004-01-07 73.30 74.75 72.95 73.50 98600.0
2004-01-08 73.50 74.25 72.00 72.60 97000.0
2004-01-09 72.60 73.50 72.05 72.80 66900.0
2004-01-12 72.80 74.10 72.65 72.65 75100.0
2004-01-13 72.65 73.50 71.55 72.50 80500.0
2004-01-14 72.50 72.75 68.90 68.90 176100.0
下面的代码段之所以有效,是因为它将一列括在一个额外的方括号内,返回一个
DataFrame
df['Pre_Close'] = df[['Close']].shift(-1)
df[['Column Name']] -----> returns a DataFrame
df['Column Name'] -----> returns a Series
另外,关于从列shift
中提取以前的值的目标,这是最简单的使用方法,也正好达到了目的
否则,一种更为程序化的方法如下所示
因为每列值都是最低本质的list/numpy array
下面的函数非常简单,只适用于一维输入
def shift_vector(inp,shift):
if isinstance(inp,list):
n = len(inp)
first_half = [0] * shift
return return first_half + inp[shift:]
elif isinstance(inp,numpy.ndarray):
n = len(inp)
first_half = np.zeros(1,shift)
return numpy.concatenate([first_half,inp[shift:])
我们的想法是在一个非常简单的层面上演示如何使用索引实现移位您的意思是
df['Pre_Close']=df['Close'].shift(-1)
?lambda函数和函数需要什么?只要df['Pre\u Close']=df['Close'].shift(-1)
就可以了。df['Pre\u Close']=df['Close'].shift(-1)
试试这个out@NYCCoder:是的,如果是简单的一行代码。这就够了。但我从一个更大的复杂函数中提取了一条线,它是动量函数循环的一部分。只有这条线产生了问题,所以解决它很困难。非常感谢您的帮助。@AndrejKesely:是的,兄弟。@Vaehav:代码没有产生任何错误,但功能仍然不起作用。对于此函数:def momentum(df):if((df[''u close\u positive']==1.0)和\(df['Call'].shift(1.values!=100.0)):返回100.0其他:当我们通过此行填充“Call”列时返回0.0
:df['Call']=df.apply(lambda df:momentum(df),axis=1)
该函数不检查列的上一个值是否为100。本质上,它会检查shift()命令if else语句。请参考上面的注释。
df['Pre_Close'] = df[['Close']].shift(-1)
df[['Column Name']] -----> returns a DataFrame
df['Column Name'] -----> returns a Series
def shift_vector(inp,shift):
if isinstance(inp,list):
n = len(inp)
first_half = [0] * shift
return return first_half + inp[shift:]
elif isinstance(inp,numpy.ndarray):
n = len(inp)
first_half = np.zeros(1,shift)
return numpy.concatenate([first_half,inp[shift:])