1. 程式人生 > >python 生成 pptx 分析報告的工具包:reportgen

python 生成 pptx 分析報告的工具包:reportgen

整體 app 形式 web 技術分享 .repo 處理 聚類 fop

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等都可以)。具體的示例如下:

Q1Q2Q3_A1Q3_A2Q3_A3Q3_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_merge
  • data_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