如何绘制数据帧最大值的直方图

时间:2017-11-01 23:27:10

标签: python pandas dataframe matplotlib statistics

我有一个包含3列df=["a", "b", "value"]的数据框。 (实际上这是一个片段,解决方案应该能够处理n个变量,例如" a"," b"," c"," d& #34; ...)在这种情况下,"值"已生成列,具体取决于" a"和" b"值,做类似的事情:

        for a in range(1,10):
            for b in range (1,10):
                generate_value(a,b)

结果数据类似于:

  a b value
0 1 1 0.23
1 1 2 6.34
2 1 3 0.25
3 1 4 2.17
4 1 5 5.97
[...]

我想知道" a"的统计更好的组合。和" b"这给了我更大的价值"。所以我想绘制某种直方图,向我展示" a"和" b"统计上产生更大的价值"。我尝试过类似的东西:

fig = plot.figure()
ax=fig.add_subplot(111)
ax.hist(df["a"],bins=50, normed=True)

或:

 plot.plot(df["a"].values, df["value"].values, "o")

但结果并不好。我认为我应该使用某种直方图或高斯钟形曲线,但我不确定如何绘制它。

那么,如何在统计上更好地绘制" a"和" b"获得最大值"价值"?

注意: 答案1对于两个变量a和b是完美的,但问题是正确的答案需要适用于多个变量,a,b ,c,d ......

编辑1:请注意,虽然我询问了两个变量,但解决方案无法绑定" a"轴x和" b"到y轴,因为可能有更多的变量。因此,如果我们有" a"," b"," c"," d"," e",解决方案应该有效

编辑2 :尝试更好地解释一下:让我们采取以下数据框:

  a b c d value
0 1 6 9 7 0.23
1 5 2 3 5 11.34
2 6 7 8 4 0.25
3 1 4 9 3 2.17
4 1 5 9 1 4.97
5 6 6 4 7 25.9
6 3 5 5 2 10.37
7 1 5 1 2 7.87
8 2 5 3 3 8.12
9 1 5 2 1 2.97
10 7 5 4 9 5.97
11 3 5 2 3 9.92
[...]

第5行显然是赢家,值为25.9,因此a,b,c,d的所谓更好的值是:6 6 4 7。但我们可以从统计上看到这是一个奇怪的结果,它是唯一一个如此高的a,b,c,d的值,所以我们将来不太可能得到它,为a,b,c,d选择那些值的高值。相反,选择已生成"值"的数字似乎更安全。虽然8到11的增益小于25.9,但是a,b,c,d(5,2,3,3)的值产生这个更高的值的概率"更大

编辑3:虽然a,b,c,d是离散的,但它们的组合/顺序会产生不同的结果。我的意思是,有一个函数会返回一个小范围内的值,如:value = func(a,b,c,d)。该值不仅取决于a,b,c,d的值,还取决于一些随机事物。因此,例如,func(5,2,3,5)可以返回值11.34,但它也可以返回类似的值,如10.8,9.5或类似的值(范围值介于8和11之间)。此外,func(1,6,9,7)将返回0.23,或者它可能返回2.7,但可能它不会返回10.1,因为它也离它的范围很远。

根据这个例子,我试图获得最有可能产生8-11范围内的数字(好,最大)。可能我想要以某种方式想象的数字将是数字3,5和2的某种组合。但可能不会有任何6,7,4数字,因为它们通常会产生较小的"值&# 34;结果

2 个答案:

答案 0 :(得分:2)

我不认为这里涉及任何统计数据。您可以将该值绘制为a和b的函数。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

A,B = np.meshgrid(np.arange(10),np.arange(10))
df = pd.DataFrame({"a" : A.flatten(), "b" : B.flatten(), 
                   "value" : np.random.rand(100)})

ax = df.plot.scatter(x="a",y="b", c=df["value"])

plt.colorbar(ax.collections[0])
plt.show()

enter image description here

点越暗,值越高。

答案 1 :(得分:0)

通过一个内置函数来解决这个问题似乎非常复杂。

我认为应该以这种方式解决:

  1. 从数据中排除异常值
  2. 选择n个最大值
  3. 使用条形图或任何其他
  4. 汇总结果

    从异常值中清除数据

    我们可能会选择任何合适的异常值检测方法,例如: 3 * sigma,1.5 * IQR等。我在下面的示例中使用了1.5 * IQR。

    cleaned_data = data[data['value'] < 1.5 * stats.iqr(data['value'])]
    

    选择n个最大值

    Pandas 提供方法 nlargest ,因此您可以使用它来选择n个最大值:

    largest_values = cleaned_data.nlargest(5, 'value')
    

    或者您可以使用值间隔

    largest_values = cleaned_data[cleaned_data['value'] > cleaned_data['value'].max() - 3]
    

    总结结果

    这里我们应该计算每列中值的出现次数,然后绘制这些数据。

    melted = pd.melt(largest_values['here you should select columns with explanatory variables'])
    table = pd.crosstab(melted['variable'], melted['value'])
    table.plot.bar()
    

    example of resulting plot