gpt4 book ai didi

python - Pandas 中的 block 自举采样

转载 作者:行者123 更新时间:2023-12-04 21:29:17 53 4
gpt4 key购买 nike

我正在尝试在 Pandas 中实现 Block Bootstrapping。

例如,假设我的 DataFrame 看起来像:

df = pd.DataFrame({
'personid': [1, 1, 1, 2, 2, 3, 3, 3, 3],
'month': ['Jan', 'Feb', 'Mar', 'Aug', 'Sep', 'Mar', 'Apr', 'May', 'Jun'],
'values': [100, 200, 300, 400, 500, 600, 700, 800, 900],
})

df
month personid value
0 Jan 1 100
1 Feb 1 200
2 Mar 1 300
3 Aug 2 400
4 Sep 2 500
5 Mar 3 600
6 Apr 3 700
7 May 3 800
8 Jun 3 900

特别是,DataFame 在 month 上是独一无二的。 , personid实际上包含许多行,其中每行 personid与不同的月份数相关联。

我想在 personid 上实现一个“块 bootstrap ”等级。也就是说,我想从 personid 中所有唯一值的集合中进行替换采样。然后从该样本中返回一个 DataFrame,其中包含所有关联的 monthvalue列与它。

例如,我有这样的事情:
personids = df.personid.unique()

在这种情况下会导致
 array([1, 2, 3])

然后,我会更换 sample :
np.random.choice(personids, size=personids.size, replace=True)

在这种情况下,这可能会导致:
array([3, 3, 2])

所以现在,如果这是采样结果,我想要一个自举数据帧,称之为 bootstrapped_df使得 bootstrapped_df将等于:
     month  personid value
0 Mar 3 600
1 Apr 3 700
2 May 3 800
3 Jun 3 900
4 Mar 3 600
5 Apr 3 700
6 May 3 800
7 Jun 3 900
8 Aug 2 400
9 Sep 2 500

到目前为止,我的做法是这样的:
def create_bootstrapped_df(df, sampled_personids):
"""
Create "Block" Bootstrapped DataFrame given a vector of sampled_personids

Keyword Args:
df: DataFrame containing cost data at the personid, month level
sampled_personids: A vector of personids that is already sampled with replacement.
"""
bootstrapped = []
for person in sampled_personids:
person_df = df.loc[df.personid == person]
bootstrapped.append(person_df)
bootstrapped_sample = pd.concat(bootstrapped)
bootstrapped_sample.reset_index(drop=True, inplace=True)
return bootstrapped_sample

基本上,该函数的作用是遍历采样的 personid 向量,并对原始数据帧进行子集化,以提取出每个 personid。然后它将所有内容连接在一起。恐怕这是非常低效的。有一个更好的方法吗?

最佳答案

其实,我只是想出了一个非常简单的方法来做到这一点。如果我设置 personid作为索引,然后我可以通过索引对 DataFrame 进行子集化,它会做我想做的事情。

例如,如果我这样做:

sampled_personids = np.random.choice(personids, size=personids.size, replace=True)

这让我产生了
array([1, 2, 2])

然后如果我这样做:
df.loc[sampled_personids]

我得到:
          month personid value
personid
1 Jan 1 100
1 Feb 1 200
1 Mar 1 300
2 Aug 2 400
2 Sep 2 500
2 Aug 2 400
2 Sep 2 500

关于python - Pandas 中的 block 自举采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51641223/

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