gpt4 book ai didi

python - 将 for 循环变成 dataframe.apply 问题

转载 作者:太空宇宙 更新时间:2023-11-03 21:17:23 25 4
gpt4 key购买 nike

这是我在这里提出的第一个问题,所以如果我没有解释清楚或解释过度,请原谅我。任务是将包含 2 个 if 语句的 for 循环转换为 dataframe.apply 而不是循环。我认为这样做的方法是将 for 循环内的 if 语句转换为定义的函数,然后在 .apply 行中调用该函数,但只能到此为止。甚至不确定我是否正在尝试以正确的方式解决这个问题。如果需要可以提供原始的For循环代码。提前致谢。

目标是导入股票价格的 csv,将一列中的价格与需要创建的移动平均线进行比较,如果 > MA,则买入,如果 < MA,则卖出。跟踪所有买卖并最终确定总体财富/返回。它的工作方式类似于 for 循环:对于价格中的每个 x,使用 2 个 if,将价格附加到列表中以确定最终财富。我想我已经到了将定义的函数调用到 .apply 行并出错的地步。在我下面的代码中,for 循环使用中可能仍然存在一些不必要的延迟代码,但不应干扰 .apply 尝试,只会造成困惑的编码,直到我弄清楚为止。

df2 = pd.read_csv("MSFT.csv", index_col=0, parse_dates=True).sort_index(axis=0 ,ascending=True)      #could get yahoo to work but not quandl, so imported the csv file from class

buyPrice = 0
sellPrice = 0
maWealth = 1.0
cash = 1
stock = 0
sma = 200

ma = np.round(df2['AdjClose'].rolling(window=sma, center=False).mean(), 2) #to create the moving average to compare to
n_days = len(df2['AdjClose'])

closePrices = df2['AdjClose'] #to only work with one column from original csv import

buy_data = []
sell_data = []
trade_price = []
wealth = []

def myiffunc(adjclose):
if closePrices > ma and cash == 1: # Buy if stock price > MA & if not bought yet
buyPrice = closePrices[0+ 1]
buy_data.append(buyPrice)
trade_price.append(buyPrice)
cash = 0
stock = 1

if closePrices < ma and stock == 1: # Sell if stock price < MA and if you have a stock to sell
sellPrice = closePrices[0+ 1]
sell_data.append(sellPrice)
trade_price.append(sellPrice)
cash = 1
stock = 0

wealth.append(1*(sellPrice / buyPrice))

closePrices.apply(myiffunc)

最佳答案

检查docs for apply,看来您需要使用 index=1 版本一次处理每一行,并传递两列:移动平均线和收盘价。

类似这样的事情:

df2 = ...
df2['MovingAverage'] = ...

have_shares = False

def my_func(row):
global have_shares

if not have_shares and row['AdjClose'] > row['MovingAverage']:
# buy shares
have_shares = True
elif have_shares and row['AdjClose'] < row['MovingAverage']:
# sell shares
have_shares = False

但是,值得指出的是,您也可以使用 numpy/pandas 进行比较,只需将结果存储在另一列中即可:

df2['BuySignal'] = (df2.AdjClose > df2.MovingAverage)
df2['SellSignal'] = (df2.AdjClose < df2.MovingAverage)

然后您可以.apply()一个使用买入/卖出信号列的函数。

关于python - 将 for 循环变成 dataframe.apply 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54586219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com