利用PYTHON全自动生成分析报告

日常工作当中,特别是金融行业当中,有不少人的工作是提取数据,分析数据,得到可视化图表,并加入自已的研究分析结论,最终生成分析报告,并且有不少报告是定期生成,存在不少重复手工劳动。本文通过一个简单实例,介绍python中的一个叫python-doc模块,可以实现全自动获取数据-分析数据-最终生成分析报告的全部操作。

一、从万得数据库读取数据,保存可视化结果图片

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)

二、自动生成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'二、各板块统计', 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'三、上市时间统计', level=1)
    text=u'\n上市时间分布图如下所示,可以看出今明两年并不上上市的高峰期'
    document.add_paragraph(text)
    # 插入图片,文件名可以作为参数传入,由之前的程序进行传入
    document.add_picture(bar_file_path, width=Inches(5.0))


    document.add_heading(u'四、待上市新股统计', 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)

三、前后串在一起,生成最终完整的WORD文件

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

四、最终效果图

打开d:\temp\test.doc,效果如下:

截图1
截图2
截图3
截图4

怎么样,是不是很方便?对于图表样式和文档样式,python的matplotlib和python-doc模块都可以修改,使用起来也非常方便。另外更有用的在于通过嵌入网络爬虫,以及对外部的接口,可以快速实现大量手工劳动才能完成的工作,提高工作效率

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容