在根据多个条件向pandas DataFrame添加数据时,np.where()函数有什么更好的替代方法

时间:2017-02-19 20:20:35

标签: python pandas dataframe

概述
我正在建立一个测试我的投资策略盈利能力的功能。战略很简单;如果股票当天收盘,我会在第二天下注,如果收盘当天,我会在第二天下注。这基本上是一种逆向策略。

方法
我正在使用np.where(numpy)函数来确定天气与否,这是一个成败的交易。如果股票今天收盘然后第二天上涨,那么它就是“胜利”,或者如果它下跌了#34;亏损"。如果它今天上升然后明天下来" Win"如果它今天上升然后第二天上升"损失"

代码

df = pd.DataFrame({'Day':['Mon','Tues','Wed','Thurs','Fri','Mon','Tues','Wed','Thurs','Fri','Mon','Tues','Wed','Thurs','Fri'],
                   'DaysGainOrLoss':[0.02,-0.05,0.01,0.02,-0.01,-0.03,0.03,-0.01,0.01,0.03,-0.03,-0.05,-0.01,0.03,0.02]})

df['NextDaysGainOrLoss'] = df['DaysGainOrLoss'].shift(-1)
df['WinOrLoss'] = np.where(df.NextDaysGainOrLoss > 0,np.where(df.DaysGainOrLoss <=0, "Win","Loss"),np.where(df.DaysGainOrLoss > 0,"Win","Loss"))

print(df)  

输出

      Day  DaysGainOrLoss  NextDaysGainOrLoss WinOrLoss
0     Mon            0.02               -0.05       Win
1    Tues           -0.05                0.01       Win
2     Wed            0.01                0.02      Loss
3   Thurs            0.02               -0.01       Win
4     Fri           -0.01               -0.03      Loss
5     Mon           -0.03                0.03       Win
6    Tues            0.03               -0.01       Win
7     Wed           -0.01                0.01       Win
8   Thurs            0.01                0.03      Loss
9     Fri            0.03               -0.03       Win
10    Mon           -0.03               -0.05      Loss
11   Tues           -0.05               -0.01      Loss
12    Wed           -0.01                0.03      Loss
13  Thurs            0.03                0.02      Loss
14    Fri            0.02                 NaN       Win

问题
此代码适用于二元结果,无论是赢还是亏。如果我添加一个更复杂的标准,问题就变成了,即现在我只想交换它,DaysGainOrLoss是&gt; = .05或&lt; = -.05。现在,我不需要输赢,而是在不符合标准的情况下,我需要出现NoTrade。 np.where在二进制结果方面表现不错,但现在这已经变得复杂了。我知道必须有一个更好的方法来管理这个,但我不确定它是什么。

期望

      Day  DaysGainOrLoss  NextDaysGainOrLoss WinOrLoss
0     Mon            0.02               -0.05   NoTrade
1    Tues           -0.05                0.01   Win
2     Wed            0.01                0.02   NoTrade
3   Thurs            0.02               -0.01   NoTrade
4     Fri           -0.01               -0.03   NoTrade
5     Mon           -0.03                0.03   NoTrade
6    Tues            0.03               -0.01   NoTrade
7     Wed           -0.01                0.01   NoTrade
8   Thurs            0.01                0.03   NoTrade
9     Fri            0.03               -0.03   NoTrade
10    Mon           -0.03               -0.05   NoTrade
11   Tues           -0.05               -0.01   Loss
12    Wed           -0.01                0.03   NoTrade
13  Thurs            0.03                0.02   NoTrade
14    Fri            0.02                 NaN   NoTrade

1 个答案:

答案 0 :(得分:1)

您可以使用apply应用任意变换:

def myfunc(x):
    if x > 0.5: 
        return 'Win'
    if x < 0: 
        return 'Loss'
    return 'No Trade'
df['action'] = df[0].apply(myfunc)
print(df)

输出

                            0    action
2011-01-01 00:00:00 -0.324398      Loss
2011-01-01 01:00:00 -0.761585      Loss
2011-01-01 02:00:00  0.057204  No Trade
2011-01-01 03:00:00 -1.162510      Loss
2011-01-01 04:00:00 -0.680896      Loss
2011-01-01 05:00:00 -0.701835      Loss
2011-01-01 06:00:00 -0.431338      Loss
2011-01-01 07:00:00  0.306935  No Trade
2011-01-01 08:00:00 -0.503177      Loss
2011-01-01 09:00:00 -0.507444      Loss
2011-01-01 10:00:00  0.230590  No Trade
2011-01-01 11:00:00 -2.326702      Loss
2011-01-01 12:00:00 -0.034664      Loss
2011-01-01 13:00:00  0.224373  No Trade
2011-01-01 14:00:00 -0.242884      Loss
2011-01-01 15:00:00 -0.134757      Loss
2011-01-01 16:00:00 -1.177362      Loss
2011-01-01 17:00:00  0.931335       Win

你可以使myfunc任意复杂。