Python numpy:在多个维度中进行采样以生成微观数据

Python numpy:在多个维度中进行采样以生成微观数据,python,numpy,pandas,distribution,sampling,Python,Numpy,Pandas,Distribution,Sampling,我有按年龄组、城市、收入和他们工作的行业,或者在本例中为四个维度的人口统计的汇总数据 我想从这些汇总计数中生成微观数据。比如说,如果汇总表显示10000人按性别、种族、年龄和行业分布,我希望有10000条记录,汇总后与原始的四维分布相匹配。简而言之,我想同时从四个分布中取样,以其他分布的值为条件 以下是我所拥有的: ## generate mock person data N=500000 age = np.random.choice(['20-44','45-64','65+'], N) i

我有按年龄组、城市、收入和他们工作的行业,或者在本例中为四个维度的人口统计的汇总数据

我想从这些汇总计数中生成微观数据。比如说,如果汇总表显示10000人按性别、种族、年龄和行业分布,我希望有10000条记录,汇总后与原始的四维分布相匹配。简而言之,我想同时从四个分布中取样,以其他分布的值为条件

以下是我所拥有的:

## generate mock person data
N=500000

age = np.random.choice(['20-44','45-64','65+'], N)
ind = np.random.choice(['retail','construction','information','medical'], size=N,p=[.05,.15,.3,.5])
cty = np.random.choice(['cooltown','mountain pines'], N)
income = pd.cut(np.random.lognormal(mean=10,sigma=2,size=N),range(0,250000,50000)+[np.Inf])

## prep data frame
persons = pd.DataFrame({'industry':ind,'city':cty,'income':income,'age':age})

## group by the categoricals
persons_grouped = persons.groupby(['city','industry','age','income']).size()


df_persons_grouped=persons_grouped.reset_index(name='personcount')
df_persons_grouped['personcount']=df_persons_grouped.personcount.div(df_persons_grouped.personcount.sum(),axis=0)
df_persons_grouped.head()
因此,这是现在所讨论的维度的总结

要重新生成原始数量的记录,我希望这样做:

newdf = df_persons_grouped.loc[np.random.choice(a=df_persons_grouped.index, size=N, p=df_persons_grouped.personcount.tolist())].groupby(['city','industry','age','income']).size()

## I expect the follwoing to produce near-1 values, but they sometimes vary
newdf.div( persons_grouped,axis=0)

但更大的问题是,这种方法是否适合复制“原始”记录级数据。我只是使用计数(作为份额)作为概率,这可能不同于多元分布的抽样。欢迎您的建议。

我觉得这一点都不现实。你们真的认为收入和年龄和行业无关吗?@pjs,不,这是重点。我确实认为存在依赖。这就是为什么我有兴趣从每个bin的联合成员分布中提取信息。数据当然是虚构的。@pjs,它有点像PopGen,但价格便宜。从总结到个人记录,尊重边际分布。主要是离散变量。这里没有直接的n维协方差,只有(基于观察样本的)箱子。