【问题标题】:how to plot histogram of maximum values of a dataframe如何绘制数据框最大值的直方图
【发布时间】:2018-04-14 09:11:11
【问题描述】:

我有一个包含 3 列 df=["a", "b", "value"] 的数据框。 (其实这是一个sn-p,解应该可以处理n个变量,比如“a”、“b”、“c”、“d”...)在这种情况下,“value”列已经根据“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 之间产生“值”的数字似乎更安全。虽然 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 数字,因为它们通常会产生较小的“价值”结果

【问题讨论】:

    标签: python pandas dataframe matplotlib statistics


    【解决方案1】:

    我认为这里不涉及任何统计数据。您可以将值绘制为 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()
    

    点越深,值越高。

    【讨论】:

    • 也许df.plot.scatter(x='a', y='b', c='value', s=df['value']*200)
    • 这个解决方案的问题是它绝对受限于两个参数。我的意思是,我的错,我知道我只询问了“a”和“b”,但实际上能够使用 n 个变量(a、b、c、d、e.. .)。我正在更新这个问题,因为它可能比创建一个新问题更好。
    • 那么你想从情节中获得什么信息? (如果你试图明确一点,那肯定会有所帮助,比如 a、b、c 可能是什么,以及在看过情节后我对它们有什么了解?)
    • @ImportanceOfBeingErnest 我想要获得的信息是:a、b、c、d.. 的哪些值在统计上更有可能产生(由于一些计算)更高的结果在“值"列。
    • 举个例子:假设我在 a、b、c、d 中有一些特定的值,我知道它们会在“值”中生成最高值。但可能是这些值出现的次数很少,因此在统计上很难获得更高的结果。相反,最好获取 a、b、c、d 的值,这通常会在“值”中产生高结果,尽管结果可能不是最高的。我在试图解释这一点的问题中添加了一个新的数据框
    【解决方案2】:

    这个问题似乎很复杂,用一个内置函数来解决。

    我觉得应该这样解决:

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

    从异常值中清除数据

    我们可以选择任何合适的方法来检测异常值,例如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

    【讨论】:

      猜你喜欢
      • 2018-11-10
      • 1970-01-01
      • 2023-03-08
      • 2021-09-05
      • 2019-09-12
      • 2020-06-20
      • 2017-06-20
      • 2021-05-20
      • 1970-01-01
      相关资源
      最近更新 更多