利用PYTHON全自動生成分析報告

平常工做當中,特別是金融行業當中,有很多人的工做是提取數據,分析數據,獲得可視化圖表,並加入自已的研究分析結論,最終生成分析報告,而且有很多報告是按期生成,存在很多重複手工勞動。本文經過一個簡單實例,介紹python中的一個叫python-doc模塊,能夠實現全自動獲取數據-分析數據-最終生成分析報告的所有操做。python

1、從萬得數據庫讀取數據,保存可視化結果圖片

def getDataAndSavePic():
    db_engine = create_engine('oracle://lianghua:lianghua@172.16.10.101:1521/orcl', echo=False)
    DB_Session = sessionmaker(bind=db_engine)
    session = DB_Session()
    s = ("select OB_OBJECT_NAME_1090 AS STOCKNAME,"#股票名稱
        "       F5_1090    AS TRDMARKETNAME,               "#交易所名稱
        "       F6_1090  AS PLATENAME,                  "#版塊名稱
        "       F17_1090 AS TIMETOMARKET,               "#上市時間
        "       F16_1090 AS STOCKCODE                   "#股票代碼
        "from wind.tb_object_1090 t where t.f4_1090='A' ")#只取A股數據
    selectsql = text(s)
    result = session.execute(selectsql)  # 執行查詢語句
    df_result = pd.DataFrame(result.fetchall())
    df_result.columns = ['STOCKNAME', 'TRDMARKETNAME', 'PLATENAME', 'TIMETOMARKET','STOCKCODE']  # 列重命名
    df_result = df_result.set_index('STOCKCODE')
    session.close()    
    pie_file_path = r'd:\temp\pie.png'  #餅狀圖圖片地址
    bar_file_path = r'd:\temp\bar.png' #柱狀圖圖片地址
    #繪製餅狀圖,分別計算主板、中小板和創業板股票的數量佔比
    (
    df_result.groupby('PLATENAME')
    .count()
    .plot.pie(y='STOCKNAME',figsize=(6, 6),autopct='%.2f')
    )
    plt.savefig(pie_file_path)
    #繪製柱狀圖,獲取不一樣年份上市股票的數量
    df_result['YEARTOMARKET']=df_result['TIMETOMARKET'].map(lambda x:None if x is None else x[0:4])
    (
    df_result.groupby('YEARTOMARKET')
    .count()
    .plot.bar(y='STOCKNAME',figsize=(8, 6))
    )
    plt.savefig(bar_file_path)
    return (df_result,pie_file_path,bar_file_path)

2、自動生成WORD文件,定義文檔模板

from docx import Document
from docx.shared import Inches

def gen_docfile(df,pie_file_path,bar_file_path,doc_file_path):
    '''
    :param df_result: 數據記錄,用於表格顯示
    :param pie_file_path: 餅圖文件顯示
    :param bar_file_path: 柱狀圖文件顯示
    :param doc_file_path: 須要保存的WORK文件路徑
    :return: 無返回值
    '''
    # 新建一個文檔
    document = Document()
    document.add_heading(u' 自動分析報告生成 ', 0)
    # 添加一個段落
    p = document.add_paragraph(u'python-doc模塊是一個很是實用的用於自動生成報告的文檔,能夠自動根據讀取的數據生成')
    p.add_run(u'圖片').bold = True
    p.add_run(u' 和 ')
    p.add_run(u'表格').italic = True
    document.add_paragraph(u'python-doc模塊能夠用於:')
    #無序列表項
    document.add_paragraph(
        u'根據程序計算動態結果替換動態內容,如統計數字等', style='ListBullet'
    )
    document.add_paragraph(
        u'能夠自動嵌入相應的圖片和表格', style='ListBullet'
    )
    document.add_paragraph(
        u'支持各種樣式進行調整', style='ListBullet'
    )

    document.add_paragraph(u'python-doc模塊不足的地方:')
    document.add_paragraph(
        u'相對簡單', style='ListNumber'
    )
    document.add_paragraph(
        u'暫不支持WORD文檔模板', style='ListNumber'
    )

    document.add_heading(u'2、各板塊統計', level=1)
    text=u'滬深兩地的上市A股總共有%s只,其中滬市有 %s 只,深市有%s 只,各板塊的數據佔好比下所示'\
         %(str(df['STOCKNAME'].count()),\
           str(df[df['TRDMARKETNAME']=='上海']['STOCKNAME'].count()),\
           str(df[df['TRDMARKETNAME']=='深圳']['STOCKNAME'].count())
           )
    document.add_paragraph(text)
    # 插入圖片,文件名能夠做爲參數傳入,由以前的程序進行傳入
    document.add_picture(pie_file_path, width=Inches(5.0))

    document.add_heading(u'3、上市時間統計', level=1)
    text=u'\n上市時間分佈圖以下所示,能夠看出今明兩年並不上上市的高峯期'
    document.add_paragraph(text)
    # 插入圖片,文件名能夠做爲參數傳入,由以前的程序進行傳入
    document.add_picture(bar_file_path, width=Inches(5.0))


    document.add_heading(u'4、待上市新股統計', level=1)
    # 輪詢上市時間爲空的未上市股票,添加表格
    text=u'\n待上市股票列表以下'
    df['TIMETOMARKET']=df['TIMETOMARKET'].map(lambda x:'99991231' if x is None else x[0:4])
    df_newstock=df[df['TIMETOMARKET']=='99991231']
    print df_newstock
    #插入表格
    table = document.add_table(rows=len(df_newstock.index)+1, cols=3,style='Table Grid')
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = u'股票名稱'
    hdr_cells[1].text = u'上市交易所'
    hdr_cells[2].text = u'上市板塊'
    #編歷DATAFRAME
    list_stockname=list(df_newstock['STOCKNAME'])
    list_TRDMARKETNAME=list(df_newstock['TRDMARKETNAME'])
    list_PLATENAME=list(df_newstock['PLATENAME'])
    for i in range(len(df_newstock.index)):
        row_cells = table.add_row().cells
        #注意這裏PYTHON2的編碼問題,多謝stackoverflow,程序員的聖地
        row_cells[0].text = unicode(list_stockname[i],'utf-8')
        row_cells[1].text = unicode(list_TRDMARKETNAME[i],'utf-8')
        row_cells[2].text = unicode(list_PLATENAME[i],'utf-8')

    document.add_page_break()
    document.save(doc_file_path)

3、先後串在一塊兒,生成最終完整的WORD文件

#生成圖片
(df,pie_file_path,bar_file_path)=getDataAndSavePic()
#整合到WORD文檔當中
gen_docfile(df,pie_file_path,bar_file_path,r'd:\temp\test.doc')

4、最終效果圖

打開d:temptest.doc,效果以下:程序員

截圖1

截圖2

截圖3

截圖4

怎麼樣,是否是很方便?對於圖表樣式和文檔樣式,python的matplotlib和python-doc模塊均可以修改,使用起來也很是方便。另外更有用的在於經過嵌入網絡爬蟲,以及對外部的接口,能夠快速實現大量手工勞動才能完成的工做,提升工做效率sql

相關文章
相關標籤/搜索