gpt4 book ai didi

python - 使用 Python Pandas 填补面板数据中的空白

转载 作者:行者123 更新时间:2023-12-04 03:14:56 25 4
gpt4 key购买 nike

考虑一个不平衡的面板,其中的间隙提供信息(例如真零)。我想重新添加零。本质上,我正在尝试在 pandas 中重新创建 stata 函数 tsfill 的功能。

示例数据(我构建了一个平衡面板,并删除了一些观察结果):

import numpy as np
import pandas as pd
import datetime

np.random.seed(123456)

all_dates = pd.DataFrame(pd.date_range(datetime.date(2015,1,1),datetime.date(2015,12,31)),columns=['date'])
balanced_data=all_dates.copy()
balanced_data['id']=0
for x in range(99):
appendme=all_dates
appendme['id']=x+1
balanced_data=balanced_data.append(appendme)

balanced_data.reset_index(inplace=True,drop=True)
balanced_data['random']=np.random.random_sample(balanced_data.shape[0])>=0.5

# remove some data
unbalanced_data=balanced_data[balanced_data['random']==1].reset_index(drop=True)

使面板再次平衡的一种方法是将不平衡的面板合并到具有平衡的 id 和 date 列的数据框中:

# construct one full set of dates for everyone
all_dates = pd.DataFrame(pd.date_range(unbalanced_data['date'].min(),unbalanced_data['date'].max()),columns=['date'])

length = unbalanced_data['id'].unique().size
all_dates_full=all_dates
for x in range(length-1):
all_dates_full=all_dates_full.append(all_dates)

all_dates_full.reset_index(inplace=True,drop=True)

# duplicate ids to match the number of dates
length = all_dates.size
ids=unbalanced_data['id'].drop_duplicates()
ids_full=ids
for x in range(length-1):
ids_full=ids_full.append(ids)

ids_full.sort_values(inplace=True)
ids_full.reset_index(inplace=True,drop=True)

balanced_panel = pd.concat([all_dates_full,ids_full],axis=1)

rebalanced_data=pd.merge(balanced_panel,unbalanced_data,how='left',on=['id','date'])
rebalanced_data.fillna(False,inplace=True)

# check
balanced_data==rebalanced_data

除了笨重之外,我发现随着 N 变大,这种方法真的很慢。我认为一定有一种更有效的方法来重新平衡面板,但我找不到它。

(PS 这是我关于 stackoverflow 的第一个问题,因此非常感谢对 future 问题的任何建设性批评!)

最佳答案

就性能而言,与附加列表相比,在 pandas 中附加数据帧是一个缓慢的操作。索引是不可变的,因此每次附加时都会创建一个新索引。这是一个在 pandas 之外构建集合然后将它们连接到数据框中的解决方案。

uid = unbalanced_data['id'].unique()
ids_full = np.array([[x]*len(all_dates) for x in range(len(uid))]).flatten()
dates = all_dates['date'].tolist() * len(uid)
balanced_panel = pd.DataFrame({'id': ids_full, 'date': dates})
rebalanced_data = pd.merge(balanced_panel, unbalanced_data, how=‌​'left',
on=['id', 'dat‌​e']).fillna(False)

关于python - 使用 Python Pandas 填补面板数据中的空白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41949736/

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