Python 如何使用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

对于以日期为索引的股价数据框,当我使用shift()获取上一个值并使用apply()创建存储上一个值的列时,会出现以下错误:

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
  • 我们创建一个函数,然后使用apply创建列:
  • 问题:请帮助解决此错误。(注意:为了保持函数的简单性,我跳过了很多代码)


    下面的代码段之所以有效,是因为它将一列括在一个额外的方括号内,返回一个
    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:])