Python 如果对应(相同索引点)列B的条件成立,则将函数应用于列A
我有一个数据框,在“关闭”列上有定价信息。我在“买入”和“卖出”列中有指标,它们是布尔值。我想对“close”列中的实例应用一个函数,当且仅当“BUY”的条件成立时,即当“BUY”==1时,对相应的“close”值应用一个函数(在给定时间段内返回)。我添加了一张图片,说明了我的意思,并显示了数据帧 谢谢 尝试:Python 如果对应(相同索引点)列B的条件成立,则将函数应用于列A,python,pandas,function,dataframe,boolean,Python,Pandas,Function,Dataframe,Boolean,我有一个数据框,在“关闭”列上有定价信息。我在“买入”和“卖出”列中有指标,它们是布尔值。我想对“close”列中的实例应用一个函数,当且仅当“BUY”的条件成立时,即当“BUY”==1时,对相应的“close”值应用一个函数(在给定时间段内返回)。我添加了一张图片,说明了我的意思,并显示了数据帧 谢谢 尝试: >>定义我的功能: ... 如果s['A']: ... s['B']=s['B']**2 ... 返回s ... >>>thing=pd.DataFr
>>定义我的功能:
... 如果s['A']:
... s['B']=s['B']**2
... 返回s
...
>>>thing=pd.DataFrame({'A':[True,False,True],'B':[1,2,3]})
>>>应用(my_func,axis=1)
A B
0对1
1假2
2对81
不过有一个警告:这比你想要的要慢得多。它消除了从矢量化计算中获得的所有速度,因为您的函数没有矢量化。如果您计划下一步要做的是精确地提取那些修改后的值(如results=thing[thing['A']]['B']
),您应该将函数应用于该系列:
>>>东西[thing['A']['B']**2
0 1
2 81
名称:B,数据类型:int64
以下代码将获得您想要的回报:
import pandas as pd
data = pd.DataFrame({
'Index':range(452, 464),
'close':[113.05,112.05,111.45,114.20,109.45,110.50,109.65,114.4,110.15,110.90,112.25,117.75],
'BUY':[1,1,0,0,0,0,0,0,0,0,0,0],
'SELL':[0,0,0,0,0,0,0,0,0,0,0,0]
})
def calculate_buy_returns(data, n):
returns = []
for i, row in data.iterrows():
if row.BUY == 1:
if (i + n) < len(data):
# get the close price at index + n
close_n = data[data.index == (i + n)].iloc[0].close
returns.append((close_n - row.close)/row.close)
else:
returns.append(0)
else:
returns.append(0)
return returns
data['returns'] = calculate_buy_returns(data, 10)
print(data)
为什么不把样本数据复制粘贴到这里?这有助于ppl更好地测试他们的答案。我将添加数据的尾部,其中包含一些条件。谢谢第462行需要sell=1,对吗?不。当SELL=1时,将为SELL列生成一个稍微不同的函数,但前提/规则与BUY列相同。您想要的函数需要基于最近的BUY=1工作吗?还是像你在例子中展示的第一个?i、 e.在计算回报时,是否应考虑第452行或第453行的买入?这是完美的。但我一直收到一个错误:“AttributeError:‘DataFrame’对象没有属性‘Index’”。你知道如何解决这个问题吗?检查你的数据框中是否有一个名为“Index”的显式列,就像你在截图中的示例中所示的那样?如果没有,则将用于设置close\n的行更改为:close\n=data[data.index==(i+n)].iloc[0]。close最后一件事。如果我将函数中的n更改为大于11的任何值,我将收到一个“IndexError:single positional indexer is out bounds”。如何解决这个问题,使n完全不明确且没有约束?您需要确保当前索引+n不大于数据帧中的行数。您可以使用len(data)找到数据帧的行数,并为其添加检查。是的,buy=1的最后一个实例是距离数据帧末尾12行。建议创建虚拟行以使其在适当的n范围内的实例中工作?
import pandas as pd
data = pd.DataFrame({
'Index':range(452, 464),
'close':[113.05,112.05,111.45,114.20,109.45,110.50,109.65,114.4,110.15,110.90,112.25,117.75],
'BUY':[1,1,0,0,0,0,0,0,0,0,0,0],
'SELL':[0,0,0,0,0,0,0,0,0,0,0,0]
})
def calculate_buy_returns(data, n):
returns = []
for i, row in data.iterrows():
if row.BUY == 1:
if (i + n) < len(data):
# get the close price at index + n
close_n = data[data.index == (i + n)].iloc[0].close
returns.append((close_n - row.close)/row.close)
else:
returns.append(0)
else:
returns.append(0)
return returns
data['returns'] = calculate_buy_returns(data, 10)
print(data)
Index close BUY SELL returns
0 452 113.05 1 0 -0.007077
1 453 112.05 1 0 0.050870
2 454 111.45 0 0 0.000000
3 455 114.20 0 0 0.000000
4 456 109.45 0 0 0.000000
5 457 110.50 0 0 0.000000
6 458 109.65 0 0 0.000000
7 459 114.40 0 0 0.000000
8 460 110.15 0 0 0.000000
9 461 110.90 0 0 0.000000
10 462 112.25 0 0 0.000000
11 463 117.75 0 0 0.000000