首页 > 解决方案 > 如果相应(相同索引点)列 B 的条件成立,则将函数应用于列 A

问题描述

我有一个数据框,其中包含“关闭”列的定价信息。我在“买入”和“卖出”列中有指标,它们是布尔值。当且仅当“购买”的条件成立时,我想将一个函数应用于“关闭”列中的实例。当 'BUY' == 1 时,将函数(在给定时间段内返回)应用于相应的 'close' 值。我添加了一张图片来说明我的意思并显示数据框。

谢谢

在此处输入图像描述

3233  108.60  0.0   0.0
3234  107.15  0.0   0.0
3235  106.70  0.0   0.0
3236  109.85  0.0   0.0
3237  107.45  0.0   0.0
3238  109.65  0.0   0.0
3239  107.25  0.0   0.0
3240  106.05  0.0   0.0
3241  101.00  0.0   0.0
3242  100.45  0.0   0.0
3243  100.75  0.0   0.0
3244   99.80  0.0   0.0
3245   96.70  0.0   0.0
3246   94.80  0.0   0.0
3247   94.05  0.0   0.0
3248   92.95  0.0   0.0
3249   93.55  0.0   0.0
3250   91.90  0.0   0.0
3251   91.25  1.0   0.0
3252   95.15  0.0   0.0
3253   93.80  0.0   0.0
3254   95.05  0.0   0.0
3255   95.80  0.0   0.0
3256  101.70  0.0   0.0
3257  106.90  0.0   0.0
3258  102.50  0.0   0.0
3259   96.75  0.0   0.0
3260  100.25  0.0   0.0
3261   98.00  0.0   0.0
3262   98.20  0.0   0.0

标签: pythonpandasfunctiondataframeboolean

解决方案


下面的代码将获得您想要的回报:

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

推荐阅读