问题描述
我正在尝试编写一个函数,该函数循环遍历 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)