0

我有一个 df[n,f] 例如,n 行 x 35 个特征。每行所有特征的总和 = 1.0。我试图通过将不高于某个最低平均值的所有特征分组到“所有其他”类别中来创建堆叠条形图。我正在尝试使用掩码来完成此操作。例如,如果我将阈值设置为 5%:

[In]
mask = (df.sum(axis = 0) > num_selected * 0.05).values
mask

[Out]
array([False, False,  True,  True, False, False, False, False, False,
   False, False,  True, False, False, False, False, False, False,
    True,  True, False, False, False, False,  True, False, False,
   False, False, False, False, False, False, False, False], dtype=bool)

我的问题是:给定这个掩码,我如何将所有不符合标准的特征(例如,“假”)分组到“所有其他”中,并使用它来创建一个堆叠条形图,其中包含所有其他“真”特征?

4

2 回答 2

1

由于您使用的是 NumPy ndarray,因此您可以使用花哨的索引方法,即

import numpy as np

df = np.random.randint(0,100,size=(10,35))
mask = df.sum(axis=0) > 500

trueFeatures = df[:,~mask]
allOthers = df[:,mask]

print mask
print trueFeatures
print allOthers

给出以下输出:

[ True False  True  True  True False False  True False False False False
 False  True  True False False False  True  True False  True False  True
  True False  True  True False False  True  True  True  True  True]
[[39 52 37 70 50 43 94 13 88  2 20 52 26  0 31 38]
 [40 25  9 26 64 34 22 35  0 28 15 60 49 58 74 99]
 [84 24  4 46 26 42 60 39 54 46 85 87 37 72 22 54]
 [59 34 47 29 20 91 11 36 39 43 72 76 46 47 51 36]
 [38 82 30 39 54 21 19 35 61 80 69 38 25 97 36 77]
 [15 50 43  3  1  3 75 36  1 40 46 19 61 24 40 34]
 [47 92 70 23 37  1  3 95 34 93 10 23 11 14 68  2]
 [70  2 60 94 63 92 34  6 15 71  2 30 82 59 63  5]
 [94 33 77 86 12  4 69  9 31 42 30 23 35 17  8  5]
 [ 4 75 19 73 27 79 87 69 59 55 54 71 31 50 54 86]]
[[83 11 19 58 20 41 71 36 73 91 91 30 60 48 83 30 78 27 86]
 [46 67 81 62 75 88 71 33 23 71 79 52 18 33 72 89 54 50 99]
 [80  4 59 82 45 99 71 38 99 83 36 51  3 88 84 87 69 55 50]
 [62 34 53 77  3 79 74 27 77 28 85 82 87 13 96 60 69 13 99]
 [90 83 51 10 94 14 31 45  9 98 43 40 66 92 13  3 52 76 55]
 [99 73 50 97 41 34 90 63 97 73 58 14 92 25 94 43 74 71 65]
 [ 8  5 33 86 98 96 81 94 84 65 32 18 47 48 64 17 74 53 68]
 [18 84 50  9 61 55 65 72 26 37 24 91 87 81 97  1 36 38 93]
 [45 97 96 76 18  5  1 95 32 33 40 86 39 37 41 80  2 74 80]
 [64 75 10 63 96 44 44 86 32 99 53 57 91 37 87 91 65 64 62]]

根据我对问题的理解,它回答了您的问题:)

于 2015-11-24T17:17:06.370 回答
0

在“小王子”的帮助下,我解决了这个问题。将它发布给那些可能想让它更“pythoneseque”的人。特别是,我注意到我选择列表项的方法可能会得到改进。注意 df["Asset Type"] 是一个用作标签的特征。

import pylab
num_selected = 20

# Create an array with the n highest elements of the ordered portfolio
x_range = np.arange(0,num_selected)
test = df[n,f]

# create a mask to choose features which are at least 5% of the portfolio
mask = np.sum(test,axis = 0) > num_selected* 0.05

# output will be two arrays concatenated. 
others = np.sum(test[:,~mask],axis = 1).reshape(num_selected,1)
primary = test[:,mask]

# Create legend which is is defined as a subset of all asset types
graph_legend = list(df['Asset Type'])
new_legend = []
for i in range(0, len(graph_legend)):
    if mask[i] == True:
        new_legend.append(graph_legend[i])
new_legend.append('All Others')

#create output dataframe with feature labels determined by mask. 
output = pd.DataFrame(np.concatenate((primary, others),axis =1),columns = new_legend)

# create plot
fig, ax = plt.subplots()

plt.ylabel('Composition')
plt.xlabel('Top Portfolios')
plt.title('Portfolio Composition, Top %d Portfolios, >  %.0f%% Capital' % (num_selected,8))

output.plot(kind='bar', stacked= True, figsize=(12,9),ax=ax)
于 2015-11-24T22:50:31.753 回答