Pd['Column1] > Pd['Column2'] 键错误:0

问题描述

我正在尝试编写一个函数,该函数循环遍历 Pandas 数据框并比较 column1 > column2,如果是,则将 1 附加到列表中,然后返回该列表。

从雅虎金融导入金融数据,计算2 Std并分配到上列和下列,以及移动平均值。

    import pandas as pd 
    import pandas_datareader as web
    import matplotlib.pyplot as plt
    %matplotlib inline
    from datetime import datetime
    import numpy as np

    end = datetime(2021,1,16)
    start = datetime(2020,16)

    symbols = ['ETH-USD']
    stock_df = web.get_data_yahoo(symbols,start,end)
    period = 20
    # Simple Moving Average
    stock_df['SMA'] = stock_df['Close'].rolling(window=period).mean()
    # Standard deviation
    stock_df['STD'] = stock_df['Close'].rolling(window=period).std() 
    # Upper Bollinger Band
    stock_df['Upper'] = stock_df['SMA'] + (stock_df['STD'] * 2)
    # Lower Bollinger Band
    stock_df['Lower'] = stock_df['SMA'] - (stock_df['STD'] * 2)
    # List of columns
    column_list = ['Close','SMA','Upper','Lower']
    stock_df[column_list].plot(figsize=(12.2,6.4)) #Plot the data
    plt.title('ETH-USD')
    plt.ylabel('USD Price ($)')
    plt.show();

    #Create a new data frame,Period for calculation,removes NAN's
    bolldf = stock_df[period-1:]
    #Show the new data frame
    bolldf

函数,遍历列行并进行比较,如果满足条件,则附加 df['Close'][0] 以买入/卖出信号。


    def signal(df):
         buy_signal = []
         sell_signal = [] 

         for i in range(len(df['Close'])):
            if df['Close'][i] > df['Upper'][i]:
               buy_signal.append(1)
         return buy_signal

    buy_signal = signal(bolldf)

    buy_signal

有关错误的信息:

密钥错误:0

在处理上述异常的过程中,又发生了一个异常: ---> 12 购买信号 = 大于(stock_df)

密钥错误:0

在处理上述异常的过程中,又发生了一个异常: 11 ---> 12 购买信号 = 大于(stock_df) 13

----> 8 if bolldf['Close'][i] > bolldf['Open'][i]:

密钥错误:0

当我在 df['Upper'] > df['Lower] 或 df['SMA']

任何帮助都会很棒。谢谢。

解决方法

由于是多索引,所以列也必须以多索引格式指定。可以用bolldf.columns查看列的内容,修改如下即可获取。

bolldf.columns
MultiIndex([('Adj Close','ETH-USD'),(    'Close',(     'High',(      'Low',(     'Open',(   'Volume',(      'SMA',''),(      'STD',(    'Upper',(    'Lower','')],names=['Attributes','Symbols'])

def signal(df):
    buy_signal = []
    sell_signal = []    
    for i in range(len(df[('Close','ETH-USD')])):
        if df[('Close','ETH-USD')][i] > df[('Upper','')][i]:
            buy_signal.append(1)
    return buy_signal

buy_signal = signal(bolldf)