-1

範囲の有効性に基づいて生データを選択したいと思います。最も感度の高い設定が C、次に B、次に A である機器があります。したがって、C から始めて、すべての値がしきい値よりも小さいかどうかを確認し、はいの場合は完璧であり、この感度のすべてのデータを最高に設定します = 1.

from StringIO import StringIO

a = """category,val,sensitivity_level
x,20,A
x,31,B
x,60,C
x,20,A
x,25,B
x,60,C
y,20,A
y,40,B
y,60,C
y,20,A
y,24,B
y,30,C"""

df = pd.read_csv(StringIO(a))

def grp_1evel_1(x):
    """ 
    return if all the elements are less than threshold
    """

    return x<=30

def grp_1evel_0(x):
"""
Input: data grouped by category. Here I want to go through this categories, in an descending order, 
that is C, B and then A, and wherever one of this categories has x<=30 valid for all elements select 
that category as best category. Think about a device sensitivity, that at the highest sensitivity the 
data maybe garbage, so you would like to move down the sensitivity and check again.
"""


    x['islessthan30'] = x.groupby('sensitivity_level').transform(grp_1evel_1)
    return x

print df.groupby('category').apply(grp_1evel_0)

しかし残念ながら、上記のコードはこの行列を生成しません。なぜなら - groupby を降順でソートできない - groupby の groupby に値を割り当てることができないからです

:

x,20,A,1
x,31,B,0
x,60,C,0
x,20,A,1
x,25,B,0
x,60,C,0
y,20,A,0
y,29,B,1
y,60,C,0
y,20,A,0
y,24,B,1
y,30,C,0

ヒントはありますか?

アルゴリズムは次のようになります

カテゴリ内で、最高の感度から開始し、すべての値がしきい値よりも小さい場合は、この感度を 1 に設定し、他の低い感度をスキップします。

4

1 に答える 1

5

私はあなたがこのようなものを探していると思います:

In [28]: df
Out[28]: 
   category  val sensitivity_level
0         x   20                 A
1         x   31                 B
2         x   60                 C
3         x   20                 A
4         x   25                 B
5         x   60                 C
6         y   20                 A
7         y   40                 B
8         y   60                 C
9         y   20                 A
10        y   24                 B
11        y   30                 C

In [29]: 

In [29]: res = df.groupby(['category', 'sensitivity_level']).max()

In [30]: res
Out[30]: 
                            val
category sensitivity_level     
x        A                   20
         B                   31
         C                   60
y        A                   20
         B                   40
         C                   60

In [31]: res[res.val <= 30]
Out[31]: 
                            val
category sensitivity_level     
x        A                   20
y        A                   20

したがって、カテゴリと感度レベルでグループ化します。最後の行は、各カテゴリに必要な機密レベルを示します。この方法では、各レベルが 30 未満かどうかを示す中間列を作成することを回避できます。

1 つx=31が実際には 20 だったとします。

In [33]: df.val.iloc[1] = 20

In [34]: df
Out[34]: 
   category  val sensitivity_level
0         x   20                 A
1         x   20                 B
2         x   60                 C
3         x   20                 A
4         x   25                 B
5         x   60                 C
6         y   20                 A
7         y   40                 B
8         y   60                 C
9         y   20                 A
10        y   24                 B
11        y   30                 C

次に、x が B を使用し、y が引き続き A を使用することを期待します。最後のステップを少し修正できます。

In [51]: res = df.groupby(['category', 'sensitivity_level']).max()
In [48]: x = res[res.val <= 30]

In [49]: 

In [49]: x
Out[49]: 
                            val
category sensitivity_level     
x        A                   20
         B                   25
y        A                   20

In [71]: x.reset_index('category').sort_index(ascending=False).groupby(level='sensitivity_level').first()
Out[71]: 
                  category  val
sensitivity_level              
A                        y   20
B                        x   25

最後のステップを実行するためのより良い方法がおそらくあります。

于 2013-11-05T18:04:53.727 に答える