创建连续分布并从中抽样
Create continuous distribution and sample from it
我目前有一个包含很多缺失值的大型数据集。
我试图通过使用我拥有的数据创建随机分布并对其进行采样来填充这些缺失值。例如创建一个随机分布然后从0到1中随机选择一个数字并用相应的值填充缺失的数据
我已经阅读了 scipy 和 numpy 的文档。我想我正在寻找 random.choice.
的连续版本
Company
Weight
a
30
a
45
a
27
a
na
a
57
a
57
a
na
我试图通过使用已有数据创建连续分布来填充 NA 列。
到目前为止,我已经尝试过使用 np.random.choice,
即:random.choice(30,45,27,57, [0.2,0.2,0.2,0.4])
然而,这仅 return 支持我输入的具体论点,但是,我正在尝试创建一个连续模型,以便我可以 return 基于概率的 27 到 57 之间的任何数字关于某个值在我之前的数据中出现了多少次。
所以在这种情况下,接近 57 的数字将更有可能被选中,因为它在我之前的数据中出现得更频繁。
核密度估计(KDE)是从样本数据生成连续分布的常用方法,但它通常需要调整一些参数。其他方法包括 mean/mode 插补(基本)和基于模型的预测(更复杂)。
我们在下面拟合了一个核密度估计器,然后用 kde.sample
的密度生成随机样本来填充下面的 nan
值:
import pandas as pd
import numpy as np
from numpy import nan
from sklearn.neighbors import KernelDensity
BANDWIDTH = 1
KERNEL = "gaussian"
data = {'company': {0: 'A', 1: 'A', 2: 'A', 3: 'A', 4: 'A', 5: 'A', 6: 'A'},
'weight': {0: 30.0, 1: 45.0, 2: 27.0, 3: nan, 4: 57.0, 5: 57.0, 6: nan}}
df = pd.DataFrame.from_dict(data)
kde = KernelDensity(kernel=KERNEL, bandwidth=BANDWIDTH).fit(df[["weight"]].dropna().values)
# replace nan with sampled values from kde
n_missing = df.weight.isna().sum()
df.loc[df.weight.isna(), "weight"] = kde.sample(n_missing)
输出:
company weight
0 A 30.000000
1 A 45.000000
2 A 27.000000
3 A 56.542771
4 A 57.000000
5 A 57.000000
6 A 38.970918
样本数据和密度图:
import plotly.express as px
# histogram
px.histogram(df.weight, nbins=40).show()
# density line plot
x_vals = np.linspace(df.weight.min(), df.weight.max(), 1000)
density = np.exp(kde.score_samples(x_vals.reshape(-1,1)))
px.line(x=x, y=density).show()
我目前有一个包含很多缺失值的大型数据集。
我试图通过使用我拥有的数据创建随机分布并对其进行采样来填充这些缺失值。例如创建一个随机分布然后从0到1中随机选择一个数字并用相应的值填充缺失的数据
我已经阅读了 scipy 和 numpy 的文档。我想我正在寻找 random.choice.
的连续版本Company | Weight |
---|---|
a | 30 |
a | 45 |
a | 27 |
a | na |
a | 57 |
a | 57 |
a | na |
我试图通过使用已有数据创建连续分布来填充 NA 列。
到目前为止,我已经尝试过使用 np.random.choice, 即:random.choice(30,45,27,57, [0.2,0.2,0.2,0.4])
然而,这仅 return 支持我输入的具体论点,但是,我正在尝试创建一个连续模型,以便我可以 return 基于概率的 27 到 57 之间的任何数字关于某个值在我之前的数据中出现了多少次。
所以在这种情况下,接近 57 的数字将更有可能被选中,因为它在我之前的数据中出现得更频繁。
核密度估计(KDE)是从样本数据生成连续分布的常用方法,但它通常需要调整一些参数。其他方法包括 mean/mode 插补(基本)和基于模型的预测(更复杂)。
我们在下面拟合了一个核密度估计器,然后用 kde.sample
的密度生成随机样本来填充下面的 nan
值:
import pandas as pd
import numpy as np
from numpy import nan
from sklearn.neighbors import KernelDensity
BANDWIDTH = 1
KERNEL = "gaussian"
data = {'company': {0: 'A', 1: 'A', 2: 'A', 3: 'A', 4: 'A', 5: 'A', 6: 'A'},
'weight': {0: 30.0, 1: 45.0, 2: 27.0, 3: nan, 4: 57.0, 5: 57.0, 6: nan}}
df = pd.DataFrame.from_dict(data)
kde = KernelDensity(kernel=KERNEL, bandwidth=BANDWIDTH).fit(df[["weight"]].dropna().values)
# replace nan with sampled values from kde
n_missing = df.weight.isna().sum()
df.loc[df.weight.isna(), "weight"] = kde.sample(n_missing)
输出:
company weight
0 A 30.000000
1 A 45.000000
2 A 27.000000
3 A 56.542771
4 A 57.000000
5 A 57.000000
6 A 38.970918
样本数据和密度图:
import plotly.express as px
# histogram
px.histogram(df.weight, nbins=40).show()
# density line plot
x_vals = np.linspace(df.weight.min(), df.weight.max(), 1000)
density = np.exp(kde.score_samples(x_vals.reshape(-1,1)))
px.line(x=x, y=density).show()