【问题标题】:Python - produce conditional average of variable 1 based on variable 2 with numpy?Python - 基于变量 2 使用 numpy 生成变量 1 的条件平均值?
【发布时间】:2020-08-10 01:48:10
【问题描述】:

我正在尝试制作一些基本图,以便更好地了解我的数据中发生的情况。目前 1 有 4 个变量,每个变量有 200*387 个数据点。我已将所有内容存储在 3D 数组中,第 3 维表示与数据相关的不同变量。

目前我已经制作了一些 var1 与 var2 的散点图。但是,我想在这个散点图的顶部添加一条条件平均曲线。这将是任何给定 var2(x 轴)值的平均 var1(y 轴)值。但是,我对 Python 还是很陌生,所以我很确定我目前考虑的方法远不是最有效的。

我目前的想法是,我可以对每个变量的数据进行矢量化(即使其成为 1D),然后创建一些合理大小的 var2 箱,然后找到每个箱的 var1 的平均值。我将这些平均值存储在一些新向量中,然后绘制它。

这是一种非常愚蠢的做法吗?从我搜索的内容来看,pandas 可能有一种简单的方法来做到这一点,但考虑到我对 Python 的了解程度,我也不确定直接使用 pandas 是否会过大。

提前感谢您的所有回复!

【问题讨论】:

  • 我不清楚你想要达到什么目的。也许一个具体的例子会有所帮助,最好是可以复制的代码。关于您的 Pandas 问题 - 使用 Pandas 真的不是矫枉过正。它比 Numpy 对初学者更友好(并建立在它之上)。它可以帮助你,例如为您的变量命名并将它们设置在 2D 多索引而不是 3D 数组中,这可以大大简化您的工作。
  • 也许这questionnumpy.where 可以提供帮助
  • 您需要的是一个 MCVE。我们可以修复错误的代码。我们无法修正模糊的描述。

标签: python python-3.x pandas numpy matplotlib


【解决方案1】:

感谢您的回复。重新阅读我的问题,我意识到它的措辞很糟糕,所以对此我深表歉意。

我找到了我的解决方案,最后很简单。无需使用 pandas 并将数据类型从数组更改为数据帧。我最终只使用了 scipy 中的 binned_statistics 函数。我的代码实际上只是:

import scipy as sp
n_bins = 80
cond_means, bin_edges, binnumber = sp.stats.binned_statistics(var2, var1, statistic='mean', bins=n_bins)

var2 是自变量(x 轴),var1 是因变量(y 轴)。

对于也有兴趣将其用于条件均值图的任何人,请注意 binned_statistics 提供 bin 边缘,而不是 bin 均值。这意味着您将始终拥有比 cond_means 元素多一个的 bin_edges 元素。一个简单的解决方法是:

bin_width = bin_edges[1] - bin_edges[0]
bin_centres = bin_edges[1:] - bin_width/2

您现在应该能够将条件均值简单地绘制为:

import matplotlib.pyplot as plt
fig1 = plt.figure()
plt.scatter(var2, var1, color = 'blue', label = 'raw data')
plt.plot(bin_centres, cond_means, color = 'black', label = 'Conditional mean')
plt.legend()
plt.xlabel('var2')
plt.ylabel('var1')
plt.show()

【讨论】:

  • 不要道歉。修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多