Python 有透视表的大熊猫的差异

Python 有透视表的大熊猫的差异,python,pandas,Python,Pandas,差异差异(DID)是一种统计技术,通过比较治疗组结果变量随时间的平均变化来计算治疗对结果的影响[1]。我有一个数据集,其中之后的表示引入治疗的月份,活动解释了在一组商店中是否应用了治疗,我想观察活动对销售的影响: 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['afte

差异差异(DID)是一种统计技术,通过比较治疗组结果变量随时间的平均变化来计算治疗对结果的影响[1]。我有一个数据集,其中
之后的
表示引入治疗的月份,
活动
解释了在一组商店中是否应用了治疗,我想观察活动对销售的影响:

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]


    year    month   after   campaign    sales
0   2011    1       0       0           10000
1   2011    2       0       0           11000
2   2011    3       0       0           12000
3   2011    4       1       0           10500
4   2011    5       1       0           10000
5   2011    6       1       0           9500
6   2011    1       0       1           7000
7   2011    2       0       1           8000
8   2011    3       0       1           5000
9   2011    4       1       1           6000
10  2011    5       1       1           6000
11  2011    6       1       1           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
df_pv

   after    0       1       diff    diff_pct
campaign                
0          33000    30000   -3000   -9.1
1          20000    19000   -1000   -5.0
即使两家店的销售额都出现了季度环比下降,我们也可以说该活动取得了一些成功,因为DID计算(-5%-(-9.1%)=4.1%表明该活动产生了一些效果

我希望这两个组件的差异得到4.1,并将其放在另一行中。我可以获得DID,但如何将结果放在新的行中

DID = df_pv.iloc[1,3] - df_pv.iloc[0,3]

Expected table:
   after    0       1       diff    diff_pct
campaign                
0          33000    30000   -3000   -9.1
1          20000    19000   -1000   -5.0
Total      53000    49000          
                            DID      4.1
正如你所看到的,我猜这个表得到了一个转换,是否可以在表中添加额外的一行,然后把文本和值放进去

拜托,你知道我能做什么吗?如果您知道DID,您知道Python中进行这种计算的包,以及如何应用于这种情况吗?提前谢谢你的帮助


[1] 参考资料:维基百科()

这确实是对熊猫的虐待,但如果你坚持,以下将产生你想要的结果:

df_pv.loc['Total'] =  [df_pv[0].sum(), df_pv[1].sum(), '', '']
df_pv.loc[''] =  ['', '','DID', df_pv.iloc[1,3] - df_pv.iloc[0,3]]
正如建议的那样,我还建议将所有内容(您的代码)都放在函数中:

def diff_in_diff(data: pd.DataFrame, treatment: str, control: str, response: str):
    df_pv = df.pivot_table(index=treatment, columns=control, values=response, 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
    df_pv.loc['Total'] =  [df_pv[0].sum(), df_pv[1].sum(), '', '']
    df_pv.loc[''] =  ['', '','DID', df_pv.iloc[1,3] - df_pv.iloc[0,3]]
    return df_pv
然后将其应用于数据帧:

result = diff_in_diff(df, treatment="campaign", control="after", response="sales")
result

   after    0       1       diff    diff_pct
campaign                
0          33000    30000   -3000   -9.1
1          20000    19000   -1000   -5.0
Total      53000    49000          
                            DID      4.1

这将返回一个新表,其中包含可以打印的结果,还可以将的值用于任何您喜欢的内容。至于python中DID的包,我找不到。然而,从一个包中你不会得到更多。您基本上已经编写了自己的。

你好,伊格里尼斯,这是一个有趣的评论,我想是的,diff列是数字的,并且添加了一个字符串。只是一个问题,为了让社区有一个很好的答案,你有什么建议?也许我展示桌子的方法不太好,所以欢迎您的推荐。谢谢。我建议您创建一个方法来接收原始数据(
df
),并以您喜欢的格式(文本、HTML或PDF)创建报告。混合数据和他们的观点不是一个好的做法。如果你决定创建这样一个不可管理的数据框,这是可以的,一旦你考虑了缺点。谢谢你的回答,Peter Chernev,你是对的,一个函数方法是我所需要的。