gpt4 book ai didi

python - 如何平滑和绘制 x 与 y 的加权平均值,由 x 加权?

转载 作者:太空狗 更新时间:2023-10-30 00:12:27 25 4
gpt4 key购买 nike

我有一个包含一列权重和一个值的数据框。我需要:

  • 离散化权重,并针对每个权重区间绘制值的加权平均值,然后
  • 将相同的逻辑扩展到另一个变量:离散化 z,并为每个间隔绘制加权平均值,按权重加权

有什么简单的方法可以实现吗?我找到了一种方法,但似乎有点麻烦:

  • 我用 pandas.cut() 离散化数据框
  • 进行分组并计算加权平均值
  • 绘制每个 bin 的平均值与加权平均值的对比图
  • 我也试过用样条曲线来平滑曲线,但作用不大

基本上,我正在寻找一种更好的方法来生成更平滑的曲线。

我的输出是这样的: enter image description here

我的代码和一些随机数据是:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.interpolate import make_interp_spline, BSpline

n=int(1e3)
df=pd.DataFrame()
np.random.seed(10)
df['w']=np.arange(0,n)
df['v']=np.random.randn(n)
df['ranges']=pd.cut(df.w, bins=50)
df['one']=1.
def func(x, df):
# func() gets called within a lambda function; x is the row, df is the entire table
b1= x['one'].sum()
b2 = x['w'].mean()
b3 = x['v'].mean()
b4=( x['w'] * x['v']).sum() / x['w'].sum() if x['w'].sum() >0 else np.nan

cols=['# items','avg w','avg v','weighted avg v']
return pd.Series( [b1, b2, b3, b4], index=cols )

summary = df.groupby('ranges').apply(lambda x: func(x,df))

sns.set(style='darkgrid')

fig,ax=plt.subplots(2)
sns.lineplot(summary['avg w'], summary['weighted avg v'], ax=ax[0])
ax[0].set_title('line plot')

xnew = np.linspace(summary['avg w'].min(), summary['avg w'].max(),100)
spl = make_interp_spline(summary['avg w'], summary['weighted avg v'], k=5) #BSpline object
power_smooth = spl(xnew)
sns.lineplot(xnew, power_smooth, ax=ax[1])
ax[1].set_title('not-so-interpolated plot')

最佳答案

你的问题的第一部分很容易做到。

我不确定你说的第二部分是什么意思。您想要(简化的)代码复制还是更适合您需求的新方法?

无论如何,我必须查看您的代码才能理解您所说的加权值的含义。我认为人们通常会期待与该术语不同的东西(只是作为警告)。

这是您的方法的简化版本:

df['prod_v_w'] = df['v']*df['w']
weighted_avg_v = df.groupby(pd.cut(df.w, bins=50))[['prod_v_w','w']].sum()\
.eval('prod_v_w/w')
print(np.allclose(weighted_avg_v, summary['weighted avg v']))
Out[18]: True

关于python - 如何平滑和绘制 x 与 y 的加权平均值,由 x 加权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55464277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com