基于pandas透视表的双重差分(DID)计算及新增结果行方法咨询
解答
透视表添加合计与DID行的实现方法
直接在你原有代码基础上补充如下逻辑即可:
# 原有代码段 import pandas as pd import numpy as np df = pd.DataFrame() df['year'] = [2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,2011,2011] df['month'] = [1,2,3,4,5,6,1,2,3,4,5,6] df['after'] = [0,0,0,1,1,1,0,0,0,1,1,1] df['campaign'] = [0,0,0,0,0,0,1,1,1,1,1,1] df['sales'] = [10000,11000,12000,10500,10000,9500,7000,8000,5000,6000,6000,7000] df_pv = df.pivot_table(index='campaign',columns = 'after', values = 'sales', aggfunc = np.sum) df_pv['diff'] = df_pv[1]-df_pv[0] df_pv['diff_pct'] = ((df_pv[1] - df_pv[0])/df_pv[0]).round(3)*100 # 新增合计行 total_row = pd.Series( {0: df_pv[0].sum(), 1: df_pv[1].sum(), 'diff': np.nan, 'diff_pct': np.nan}, name='Total' ) df_pv = pd.concat([df_pv, total_row.to_frame().T]) # 新增DID结果行 did_value = df_pv.loc[1, 'diff_pct'] - df_pv.loc[0, 'diff_pct'] did_row = pd.Series( {0: np.nan, 1: np.nan, 'diff': np.nan, 'diff_pct': did_value}, name='DID' ) df_pv = pd.concat([df_pv, did_row.to_frame().T]) print(df_pv)
运行后输出结果完全匹配你的预期格式。
Python常用DID计算工具包及本场景应用
常用的DID分析工具包有以下几种:
statsmodels:通用性强,可通过构造交互项手动实现DID回归,适合简单场景的快速验证linearmodels:面板数据分析专用工具,原生支持固定效应、聚类标准误等专业计量需求,是学术场景DID分析的首选pydid:轻量DID专用工具包,支持多期DID、合成DID等多种变体,上手门槛低
本场景下用statsmodels做DID回归的示例代码如下:
import statsmodels.formula.api as smf # 核心回归公式:sales ~ 分组变量 + 时间变量 + 分组*时间交互项 # 交互项的系数就是DID估计值 did_model = smf.ols('sales ~ campaign + after + campaign:after', data=df).fit() print(did_model.summary())
输出结果中campaign:after对应的系数就是DID的统计估计值,同时可以直接查看该效果的显著性水平,比手动计算的结果更严谨。
内容的提问来源于stack exchange,提问作者Alexis
相关产品推荐
相关产品推荐

