python 生成 pptx 分析報告的工具包:reportgen
python機器學習-sklearn挖掘乳腺癌細胞( 博主親自錄制)
網易雲觀看地址
https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share
原文網址
https://www.jianshu.com/p/ee285911d9c3
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,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
python風控評分卡建模和風控常識
https://study.163.com/course/introduction.htm?courseId=1005214003&utm_campaign=commission&utm_source=cp-400000000398149&utm_medium=share
掃二維碼,關註博主主頁,學習更多Python知識
https://m.study.163.com/user/1135726305.htm?utm_campaign=share&utm_medium=iphoneShare&utm_source=weixin&utm_u=1015941113
python 生成 pptx 分析報告的工具包:reportgen