如果对应(相同的索引点)列B的条件成立,则将函数应用于列A

时间:2019-05-23 02:24:30

标签: python pandas function dataframe boolean

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

谢谢

enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

尝试DataFrame.apply

results = thing[thing['A']]['B']

但是警告:这比您想要的要慢得多。因为您的函数不是矢量化的,所以它将消除您从矢量化计算获得的所有速度。如果您打算做的下一件事是完全提取那些修改后的值(例如>>> thing[thing['A']]['B'] ** 2 0 1 2 81 Name: B, dtype: int64 ),则应将函数应用于masked系列:

import urllib3
import serial
import json

s = serial.Serial('com4', 9600)

conn = urllib3.PoolManager()

def get_speed(conn):
    r = conn.request('GET', 'http://localhost:8180/crest2/v1/api')
    data = json.loads(r.data.decode())
    metersPerSec = int(data['carState']['mSpeed'])
    kilometersPerHour = int(metersPerSec * 3.6)
    kilometersPerHour = str(kilometersPerHour) + '\n'
    print(kilometersPerHour)
    s.write((kilometersPerHour.encode()))
    s.flush()

running=True
while running:
    get_speed(conn)