熊猫:如何测试结果?

时间:2015-07-05 21:36:00

标签: python pandas

想象一下,你有一个简单的数据框

   low_signal  high_signal  condition  prevision
0         1.2          1.3          1        1.7
1         1.7          1.8          1        1.8
2         1.9          2.0          1        1.9
3         1.6          1.7         -1        1.5
4         1.3          1.4         -1        1.4

现在我想研究我的预测是否正确,如果是的话我想知道时间(在这种情况下我们可以说它等于指数)

我的第一个条件

if df.condition == 1

第二个是检查df.prevision是否会低于或等于df.low_signal

如果该条件为True,那么

return is the index (in study) of the df.predicted - the index of df.low_signal


   low_signal  high_signal  condition  prevision verification
0         1.2          1.3          1        1.7            1
1         1.7          1.8          1        1.8            1
2         1.9          2.0          1        1.9            0
3         1.6          1.7         -1        1.5            1
4         1.3          1.4         -1        1.4            0

这仅适用于df.condition == 1

df.condition == -1 几乎相同,但检查是df.prevision will ever be greater or equal than the df.high_signal

1 个答案:

答案 0 :(得分:2)

解决问题的简单方法:

In [18]:

df['verification'] = ((df['high_signal'] <= df['prevision']) & (df['condition'] == 1)) \
                     | ((df['low_signal'] <= df['prevision']) & (df['condition'] == -1))

In [19]:

df
Out[19]:
            low_signal  high_signal condition   prevision   verification
0           1.2         1.3         1           1.7         True
1           1.7         1.8         1           1.8         True
2           1.9         2.0         1           1.9         False
3           1.6         1.7         -1          1.5         False
4           1.3         1.4         -1          1.4         True

可能你知道在python中,True和False对应于1和0,但是如果你想将verification列看作int,那就行了:

In [20]:

df['verification'] = df['verification'].astype(int)

希望它有所帮助。

编辑:我根据您的评论更新答案。我不太了解功能要求,但无论如何,如果你有更复杂的操作,你可以使用熊猫&#39; apply

在你的情况下有点棘手:

  • 您想要访问apply功能中的索引,我认为您不能
  • 您希望迭代整个数据框

但无论如何,要解决您在评论中添加的表达式,您可以先在数据框中添加一个包含索引副本的列,

In [27]:

df['index_cp'] = df.index

然后使用apply函数

In [28]:

len_df = len(df)
​
def f(x):
    for n in range(len_df):    
        if x.condition == 1 & (x.prevision <= df.low_signal[n]):
            return n - x.index_cp
​
df.apply(f, axis=1)
Out[28]:
0     1
1     1
2     0
3   NaN
4   NaN
dtype: float64

可能你需要修改这个功能,但正如我所说,我没有得到&#34;功能&#34;查看,我刚刚实施了您发布的内容。希望它有所帮助。