推薦一個利用 python 生成 pptx 分析報告的工具包:reportgen
reportgen v0.1.8 更新介紹
這段時間,我對 reportgen 進行了大工程量的修改和更新。將之前在各個文章中出現的函式進行了封裝,同時也對現有工具包的一些邏輯進行了調整。
1、reportgen 簡介
reportgen 的底層是 pptx 檔案生成介面,它能非常方便的將DataFrame等資料匯出為pptx上的圖表。你可以自定義圖表的型別(條形圖、餅圖、折線圖等),也可以全部交給工具包來自動化。另外不排除後期會增加其他檔案形式(如可互動的 html 等)介面的可能性,但短期內估計比較難。
在這些介面上是一些輔助函式,包括特徵型別的判斷、sklearn中缺少的預處理函式、一些特殊的度量函式、模型評估報告函式、關聯分析函式等。工具包的願景是對資料的自動分析,自動出報告,這期間缺乏的函式我都可能加進去。這次更新,主要就是完善了這一層。
工具包的最外層就是各類資料的分析報告生成。目前已經完成的是問卷型資料和通用性資料。其中問卷型資料已經很完善,基本只需要修bug了,單獨作為一個子包放在 reportgen中,大家可以 import reportgen.questionnaire as ques
來使用。至於通用性資料,目前已經完成了第一步,即描述統計型的分析報告,大家可以用rpt.AnalysisReport
來實現。第二步準備實現給定目標變數後的分析,包含交叉分析、各特徵的重要性、監督學習模型等。
另外,這次我放了一些案例在github上,用於大家下載後的測試和學習用,網址是 https://github.com/gasongjian/reportgen/tree/master/example
2、通用資料的分析
在這個分析報告中,我會對DataFrame資料的每一個欄位進行分析,判斷它們的型別,然後畫出合適的圖表。對於因子變數,自動繪製柱狀圖或條形圖;對於數值型變數,自動繪製出擬合的分佈圖;對於一般的文字,自動繪製詞雲。同時也會給出一個統計表格,內含各個變數的場景統計資料,如最大值、最小值、均值、標準差、唯一數個數、缺失率等。下面是一個例子,程式碼和資料可在我的github中尋找。
import pandas as pd import reportgen as rpt # 資料匯入 # 資料的網址:https://github.com/gasongjian/reportgen/tree/master/example/datasets/LendingClub_Sample.xlsx data=pd.read_excel('.\\datasets\\LendingClub_Sample.xlsx') # 資料預覽 rpt.AnalysisReport(data.copy(),filename='LendingClub 資料預覽');
它會生成如下 pptx 檔案
另外這裡有一些過程函式也推薦給大家
特徵統計分析
# 返回各個特徵的資料型別
var_type=rpt.type_of_var(data)
#返回一個統計表格,內含資料各個特徵的一些統計值
summary=rpt.describe(data)
資料預處理
# 只作工具包測試,所以不區分訓練集和測試集
y=data['target']
X=data.drop(['target'],axis=1)
categorical_var=list(set(X.columns[X.apply(pd.Series.nunique)<30])|set(X.select_dtypes(include=['O']).columns))
continuous_var=list(set(X.columns)-set(categorical_var))
# ===========【WOE 編碼】=============
woe=rpt.preprocessing.WeightOfEvidence(categorical_features=categorical_var,encoder_na=False)
X=woe.fit_transform(X,y)
# ===========【離散:卡方分箱】=============
dis=rpt.preprocessing.Discretization(continous_features=continuous_var)
X2=dis.fit_transform(X,y)
資訊理論相關度量函式
# 離散因子變數的熵
rpt.metrics.entropy.entropy(p)
# 連續數值變數的熵(基於k近鄰演算法的近似估計)
rpt.metrics.entropyc.kl_div(p,q)
機器學習模型輔助建模函式
clfs={'LogisticRegression':LogisticRegressionCV(),\
'RandomForest':RandomForestClassifier(),'GradientBoosting':GradientBoostingClassifier()}
y_preds,y_probas={},{}
for clf in clfs:
clfs[clf].fit(X, y)
y_preds[clf] =clfs[clf].predict(X)
y_probas[clf] = clfs[clf].predict_proba(X)[:,1]
# 函式會輸出一個或多個二分類模型的效能評估結果,包含ROC曲線、PR曲線、密度函式、auc等統計指標、混淆矩陣等
models_report,conf_matrix=rpt.ClassifierReport(y,y_preds,y_probas)
print(models_report)
3、問卷型資料分析
問卷資料涉及到各種題型,包括單選題、多選題、填空題、矩陣多選題、排序題等等。不管是
頻數統計還是交叉分析,單選題都很好處理, 但其他題目就相對複雜的多,比如單選題和多選題
之間的交叉統計,多選題和多選題之間的交叉統計等。
為了能使用統一的函式進行常規分析,本工具包使用專門針對問卷設計的資料型別(或者說編碼方式)。在這種型別中,每一份問卷都有兩個檔案,data 和 code ,它們的含義如下:
1). data
:按選項序號編碼的資料(csv、xlsx等都可以)。具體的示例如下:
Q1 | Q2 | Q3_A1 | Q3_A2 | Q3_A3 | Q3_A4 |
---|---|---|---|---|---|
1 | 1 | 1 | 0 | 1 | 0 |
1 | 2 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 0 | 0 | 1 |
2 | 3 | 0 | 1 | 1 | 0 |
1 | 2 | 1 | 0 | 1 | 0 |
1 | 4 | 0 | 1 | 0 | 1 |
2 | 2 | 1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 | 0 | 1 |
2 | 2 | 1 | 0 | 1 | 0 |
其中 Q1、Q2是單選題,在Q1中,1代表男,2代表女。Q3是多選題,一共有四個選項,分別代表 Q3_A1:'旅遊',Q3_A2:'健身',Q3_A3:'藝術',Q3_A4:'養生'. 多選題常用這種01矩陣儲存。
2). code
:編碼檔案( json格式,就是 python中的字典型別), 給定每道題的題號、選項編碼等資訊。
每一個題目都有如下欄位:
content
: 題目內容code
: 題目對應的編碼code_r
: 題目對應的編碼(矩陣單選題專有)qtype
: 題目型別,單選題、多選題、矩陣單選題、排序題、填空題等qlist
: 該題的索引,如多選題的 ['Q1_A1','Q1_A2',..]code_order
: 非必須,題目類別的順序,用於PPT報告的生成[一般後期新增]name
: 非必須,特殊題型的標註weight
: 非必須,dict,每個選項的權重,用於如月收入等的平均數統計
具體示例如下:
code={'Q1':{
'content':'性別',
'code':{
1:'男',
2:'女'
}
'qtype':'單選題',
'qlist':['Q1']
},
'Q2':{
'content':'年齡',
'code':{
1:'17歲以下',
2:'18-25歲',
3:'26-35歲',
4:'36-46歲'
},
'qtype':'單選題',
'qlist':['Q2']
},
'Q3':{
'content':'愛好',
'code':{
'Q3_A1':'旅遊',
'Q3_A2':'健身',
'Q3_A3':'藝術',
'Q3_A4':'養生'
},
'qtype':'多選題',
'qlist':['Q3_A1','Q3_A2','Q3_A3','Q3_A4']
}
}
該工具包包含如下函式:
檔案 IO
read_code
, 從本地讀取code資料,支援excel檔案和json檔案save_code
, 將code 儲存為 xlsx 或json資料load_data
, 支援開啟檔案視窗來選擇問卷資料read_data
, 讀取本地的資料,自適應xlsx、csv等save_data
, 將問卷資料(data和code)儲存到本地wenjuanwang
, 編碼問卷網平臺的問卷資料,輸入為問卷網上下載的三個檔案wenjuanxing
, 編碼問卷星平臺的問卷資料,輸入為問卷星網站上下載的兩個xls檔案(按選項序號和按選項文字)
資料處理
spec_rcode
: 對問卷中的一些特殊題型進行處理,如將城市題分類成省份、城市、城市級別等dataText_to_code
:dataCode_to_text
:var_combine
: 見data_mergedata_merge
: 合併兩份問卷資料,常見於多個推動渠道的問卷合併clean_ftime
: 根據使用者填寫時間來篩選問卷,會根據填問卷累計時間曲線的拐點來給出剔除的時間點data_auto_code
:qdata_flatten
: 將問卷資料展平,便於將多份問卷資料儲存在同一個資料庫中
統計檢驗等
sample_size_cal
: 樣本量計算公式confidence_interval
: 置信區間計算公式gof_test
: 擬合優度檢驗chi2_test
: 卡方檢驗fisher_exact
: 卡方檢驗,適用於觀察頻數過少的情形anova
: 方差分析
資料分析
mca
: 對應分析,目前只支援兩個變數cluster
: 態度題的聚類分析,會根據輪廓係數自動選擇最佳類別數association_rules
: 關聯分析,用於多選題的進一步分析
統計
contingency
: 列聯表分析,統一給出列聯表的各種資料,包含fo、fop、TGI等qtable
: 單個題目的統計分析和兩個題目的交叉分析,給出頻數表和頻率表
視覺化
summary_chart
: 整體統計報告,針對每一道題,選擇合適的圖表進行展示,並輸出為pptx檔案cross_chart
: 交叉分析報告,如能將年齡與每一道題目進行交叉分析,並輸出為pptx檔案onekey_gen
: 綜合上兩個,一鍵生成scorpion
: 生成一個表格,內含每個題目的相關統計資訊scatter
: 散點圖繪製,不同於matplotlib的是,其能給每個點加文字標籤sankey
: 桑基圖繪製,不畫圖,只提供 R 需要的資料
python實踐
import reportgen.questionnaire as ques
# 匯入問卷星資料
datapath=['.\\datasets\\[問卷星資料]800_800_0.xls','.\\datasets\\[問卷星資料]800_800_2.xls']
data,code=ques.wenjuanxing(datapath)
# 匯出
ques.save_data(data,filename='data.xlsx')
ques.save_data(data,filename='data.xlsx',code=code)# 會將選項編碼替換成文字
ques.save_code(code,filename='code.xlsx')
# 對單變數進行統計分析
result=ques.qtable(data,code,'Q1')
print(result['fo'])
# 兩個變數的交叉分析
result=ques.qtable(data,code,'Q1','Q2')
print(result['fop'])
# 聚類分析,會在原資料上新增一列,類別題
#ques.cluster(data,code,'態度題')
# 在.\\out\\下 生成 pptx檔案
ques.summary_chart(data,code,filename='整體統計報告');
ques.cross_chart(data,code,cross_class='Q4',filename='交叉分析報告_年齡');
ques.scorpion(data,code,filename='詳細分析資料')
ques.onekey_gen(data,code,filename='reportgen 自動生成報告');
4、pptx 檔案生成介面 Report
在 reportgen 中,一個分析報告被拆解成四個部分:title、summary、footnote和body data,
title
: slide 的標題summary
: slide的副標題或一些簡要結論data
: slide的視覺化資料footnote
: slide的腳註,如資料來源、樣本量等說明
它們的位置見下圖。其中body data 可以是一個或多個chart/表格/文字框/圖片的組合。拋棄latex和pptx自帶那種精細的排版,Report
只需你提供這四個部分的資料,剩下的排版你就不用管啦,函式會幫你來完成。
Report 是一個類,可以開啟 pptx檔案從中獲取資訊並新建 slide.
首先是初始化,
import reportgen as rpt
# 匯入分析報告
prs=rpt.Report()
#prs = rpt.Report(filename='分析報告.pptx')
函式預設會開啟reportgen
自帶的模板檔案(路徑是 ~\reportgen\template\template.pptx
), 大家也可以自己指定其他檔案。
對於存在內容的 pptx,Report能輕鬆實現獲取所有的文字和圖片
#獲取分析報告中所有的文字
prs.get_texts()
#獲取分析報告中所有的圖片
prs.get_images()
同時你也能很簡單的建立一頁新的 slide
data=pd.DataFrame(np.random.randint(100,1000,size=(3,4)),index=['品牌A','品牌B','品牌C'],columns=['Q1','Q2','Q3','Q4'])
slide_data={'data':data,'slide_type':'chart','type':'COLUMN_CLUSTERED'}
prs.add_slide(data=slide_data,title='品牌銷量',summary='品牌銷量',footnote='')
在上面的指令碼中,我們添加了一張各品牌的銷量分佈圖,圖表型別是柱狀圖。
slide_type
目前支援的型別有四種:
- chart: office 軟體自帶的圖表,詳細的型別由 type 指定
- table: 表格,表格資料由 data 給定
- picture: 圖片,圖片的路徑由 data 給定
- textbox: 文字框,文字內容由 data 給定
當slide_type
是非 table
型別時,函式引數也可以直接給定 data ,如
prs.add_slide(data=data,title='品牌銷量',summary='品牌銷量')
另外,如前文所介紹,一張slide可以新增多個圖表:
slide_data1={'data':data,'slide_type':'chart','type':'COLUMN_CLUSTERED'}
slide_data2={'data':data,'slide_type':'table'}
slide_data3={'data':'測試\n測試','slide_type':'textbox'}
prs.add_slide(data=[slide_data1,slide_data2,slide_data3],title='品牌銷量',summary='品牌銷量')
當所有slide都建好了後,用 prs.save(filename='text.pptx')
儲存就可以
另外Report
還提供了兩個有用的函式:
prs.add_cover()
: 利用三角剖分演算法提供了一種很極客的封面版式,詳細可參見上面第二節的圖片prs.add_slides()
: 根據一組資料,給分析報告快速新增一系列的slides.
最後說下reportgen
的安裝方法,很簡單,工具包已經上傳到pypi上了,直接 pip install reportgen
即可,當然也可以到作者的github官網上下載使用 https://github.com/gasongjian/reportgen