美文网首页python学习笔记
python结果批量导出excel(三)

python结果批量导出excel(三)

作者: Hobbit的理查德 | 来源:发表于2020-03-28 21:23 被阅读0次

    之前用stata 16的putexcel将结果批量导出到excel,考虑到python在自动化办公上有明显优势,因此,试着用python将结果批量导出excel。

    stata结果导入excel-方差分析

    python结果批量导出excel(一):介绍了频率分析、交叉分析和多重响应结果批量导出excel;

    python结果批量导出excel(二):介绍了卡方检验,描述统计结果批量导出excel;

    本篇介绍组间差异比较(F检验、T检验和事后比较)结果批量导出excel。

    一、分析内容

    1. F检验;
    2. T检验;
    3. 事后比较;

    目标:只需要修改字段名,实现组间差异比较(F检验、T检验和事后比较)结果批量导出excel。

    二、具体代码

    1. 导入第三方库及修改

    import pandas as pd
    import numpy as np
    import scipy.stats as stats
    from statsmodels.formula.api import ols
    from statsmodels.stats.anova import anova_lm
    from statsmodels.stats.multicomp import pairwise_tukeyhsd
    from  scipy.stats import ttest_ind, levene
    
    # 修改值,文本转数值
    def replace(df,colls):
        dfreplace=df[colls]
        dfreplace.replace('非常不符合',1 , inplace = True)
        dfreplace.replace('比较不符合',2 , inplace = True)
        dfreplace.replace('一般',3 , inplace = True)
        dfreplace.replace('比较符合',4 , inplace = True)
        dfreplace.replace('非常符合',5 , inplace = True)
        return dfreplace
    

    2. 构造分组多个因变量均值结果函数

    # 分组多个因变量的均值
    def groupby_mean(df,row,colls):
        des=df.groupby(row).mean()[colls].reset_index()
        des[colls]=des[colls].applymap(lambda x:format(x,'.2f'))#结果保留2位小数
        # des=pd.DataFrame(des.values.T,index=des.columns,columns=des.index)
        return des
    

    3. 构造方差检验函数

    通过构造方差检验函数,返回结果F = ,p =,当然,结果呈现形式,可以根据需求自行构造。

    #方差分析结果(F值,显著性),若想知道返回值,可以print(dir(model))
    def anova_para(df,row,col):
        model=ols('df[col]~C(df[row])',data=df).fit()
        F=model.fvalue
        p=model.f_pvalue
        Fresult='F = '+format(F,'.2f')+' p = '+format(p,'.3f')
        return F,p,Fresult
    

    4. 构造独立样本T检验函数

    通过构造方差检验函数,返回结果t = ,p =,若方差不齐性,返回调整后的t值。结果呈现形式,可以根据需求自行构造。

    # T检验结果(T值,显著性)
    def T_indtest(df,row,col):
        groups=list(set(df[row]))
        x=df[df[row]==groups[0]][col].dropna()
        y=df[df[row]==groups[1]][col].dropna()
        lev_s,lev_p=levene(x,y)
        if lev_p>=0.05: #方差齐性
            T_s,T_p=ttest_ind(x, y,nan_policy='omit')
            Tresult='t = '+format(T_s,'.2f')+' p = '+format(T_p,'.3f')
        elif lev_p<0.05:#方差不齐性
            T_s,T_p=ttest_ind(x, y,nan_policy='omit',equal_var = False)
            Tresult='t = '+format(T_s,'.2f')+' p = '+format(T_p,'.3f')
        else:
            T_s,T_p,Tresult='NULL','Null','levene检验有误'
        return T_s,T_p,Tresult
    

    5. 构造组间差异结果导出函数

    将分组均值及相应检验结果导出,若组别大于2,导出F检验结果,若组别为2,导出T检验结果。

    # 组间差异(F检验或T检验)在一个sheet
    def anova_one_sheet(df,rowls,colls,sheetname,writer):
        start_row=0
        for r in rowls:
            gmean=groupby_mean(df,r,colls)
            gmean_colname=list(gmean.columns.values)
            if len(set(df[r]))>2:
                result_ls=['F检验']
                for c in colls:
                    s,p,result=anova_para(df,r,c)
                    result_ls.append(result)
            elif len(set(df[r]))==2:
                result_ls=['T检验']
                for c in colls:
                    s,p,result=T_indtest(df,r,c)
                    result_ls.append(result)
            Fresult=pd.DataFrame(result_ls)#结果转df
            Fresult=pd.DataFrame(Fresult.values.T)#转置
            Fresult.columns=gmean_colname #相同列名
            F_with_mean=pd.concat([gmean,Fresult],axis=0)
            F_with_mean=pd.DataFrame(F_with_mean.values.T,index=F_with_mean.columns,columns=F_with_mean.index) #转置
            F_with_mean.to_excel(writer,index=True, header = False,sheet_name=sheetname,startrow=start_row)
            start_row=start_row+F_with_mean.shape[0]+2
        writer.save()
        writer.close()
    

    6. 构造事后检验函数

    # 事后检验
    def post_check(df,row,col):
        df=df.dropna()
        m_comp=pairwise_tukeyhsd(endog=df[col], groups=df[row], alpha=0.05)
        return m_comp
    

    7. 构造事后检验导出函数

    当F检验结果显著(p<0.05)时,将每个因变量的两两比较结果导出相应的sheet,sheetname为“两两比较_因变量字段前5个字符”

    # 方差检验结果显著,将每个因变量的两两比较结果导出excel(因变量名字太长,截取5个字符作为sheetname)
    def post_check_in_sheets(df,rowls,colls,writer):
        for r in rowls:
            if len(set(df[r]))>2:
                for c in colls:
                    s,p,result=anova_para(df,r,c)
                    if p<0.05:# 当F检验显著,导出两两比较至相应sheet
                        post_comp=post_check(df,r,c)
                        post_comp=pd.DataFrame(data=post_comp._results_table.data[1:], columns=post_comp._results_table.data[0])
                        post_comp.to_excel(writer,index=0,sheet_name='两两比较_'+c[:5])
                        writer.save()
                        writer.close()
            else:
                continue
    

    8. 主函数并调用

    其中,自变量为11个:因变量为:13个

    def main():
        df=pd.read_excel('data.xlsx') # 数据源
        colnamels=list(df.columns.values) #打印出字段的索引和列名,方便检索
        # for i,c in enumerate(colnamels): 
        #     print(i,c)
            
        file_dir='result.xlsx' #输入excel文件
        writer=pd.ExcelWriter(file_dir) #用于追写excel
        
        dfreplace=replace(df,colls)#修改值,文本转数字
        newdf=pd.concat([df[colnamels[140:151]],dfreplace],axis=1) #多列拼接,形成新的df
        newdf_col_name=list(newdf.columns.values)
        newdf_rowls=newdf_col_name[0:11]
        newdf_colls=newdf_col_name[12:]
        anova_one_sheet(newdf,newdf_rowls,newdf_colls,sheetname='组间差异',writer=writer)
        post_check_in_sheets(newdf,newdf_rowls,newdf_colls,writer=writer)
    
    main()
        
    

    三、效果

    将上述代码结合后,大约花费13s的时间将上述分析结果导出excel。

    1. 组间差异

    将分组均值、F检验、T检验结果导出

    组间差异.gif

    2. 事后两两比较

    将每个因变量在不同组的F检验显著的两两比较结果导出相应sheet

    事后两两比较.gif

    python结果批量导出excel(一):频率分析、交叉分析和多重响应

    python结果批量导出excel(二):卡方检验,描述统计

    python结果批量导出excel(三):组间差异比较(F检验、T检验和事后比较)

    相关文章

      网友评论

        本文标题:python结果批量导出excel(三)

        本文链接:https://www.haomeiwen.com/subject/onfeuhtx.html