资讯专栏INFORMATION COLUMN

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

xorpay / 2677人阅读

摘要:本文通过一个简单实例,介绍中的一个叫模块,可以实现全自动获取数据分析数据最终生成分析报告的全部操作。另外更有用的在于通过嵌入网络爬虫,以及对外部的接口,可以快速实现大量手工劳动才能完成的工作,提高工作效率

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

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

</>复制代码

  1. def getDataAndSavePic():
  2. db_engine = create_engine("oracle://lianghua:lianghua@172.16.10.101:1521/orcl", echo=False)
  3. DB_Session = sessionmaker(bind=db_engine)
  4. session = DB_Session()
  5. s = ("select OB_OBJECT_NAME_1090 AS STOCKNAME,"#股票名称
  6. " F5_1090 AS TRDMARKETNAME, "#交易所名称
  7. " F6_1090 AS PLATENAME, "#版块名称
  8. " F17_1090 AS TIMETOMARKET, "#上市时间
  9. " F16_1090 AS STOCKCODE "#股票代码
  10. "from wind.tb_object_1090 t where t.f4_1090="A" ")#只取A股数据
  11. selectsql = text(s)
  12. result = session.execute(selectsql) # 执行查询语句
  13. df_result = pd.DataFrame(result.fetchall())
  14. df_result.columns = ["STOCKNAME", "TRDMARKETNAME", "PLATENAME", "TIMETOMARKET","STOCKCODE"] # 列重命名
  15. df_result = df_result.set_index("STOCKCODE")
  16. session.close()
  17. pie_file_path = r"d:
  18. emppie.png" #饼状图图片地址
  19. bar_file_path = r"d:
  20. empar.png" #柱状图图片地址
  21. #绘制饼状图,分别计算主板、中小板和创业板股票的数量占比
  22. (
  23. df_result.groupby("PLATENAME")
  24. .count()
  25. .plot.pie(y="STOCKNAME",figsize=(6, 6),autopct="%.2f")
  26. )
  27. plt.savefig(pie_file_path)
  28. #绘制柱状图,获取不同年份上市股票的数量
  29. df_result["YEARTOMARKET"]=df_result["TIMETOMARKET"].map(lambda x:None if x is None else x[0:4])
  30. (
  31. df_result.groupby("YEARTOMARKET")
  32. .count()
  33. .plot.bar(y="STOCKNAME",figsize=(8, 6))
  34. )
  35. plt.savefig(bar_file_path)
  36. return (df_result,pie_file_path,bar_file_path)
二、自动生成WORD文件,定义文档模板

</>复制代码

  1. from docx import Document
  2. from docx.shared import Inches
  3. def gen_docfile(df,pie_file_path,bar_file_path,doc_file_path):
  4. """
  5. :param df_result: 数据记录,用于表格显示
  6. :param pie_file_path: 饼图文件显示
  7. :param bar_file_path: 柱状图文件显示
  8. :param doc_file_path: 需要保存的WORK文件路径
  9. :return: 无返回值
  10. """
  11. # 新建一个文档
  12. document = Document()
  13. document.add_heading(u" 自动分析报告生成 ", 0)
  14. # 添加一个段落
  15. p = document.add_paragraph(u"python-doc模块是一个非常实用的用于自动生成报告的文档,可以自动根据读取的数据生成")
  16. p.add_run(u"图片").bold = True
  17. p.add_run(u" 和 ")
  18. p.add_run(u"表格").italic = True
  19. document.add_paragraph(u"python-doc模块可以用于:")
  20. #无序列表项
  21. document.add_paragraph(
  22. u"根据程序计算动态结果替换动态内容,如统计数字等", style="ListBullet"
  23. )
  24. document.add_paragraph(
  25. u"可以自动嵌入相应的图片和表格", style="ListBullet"
  26. )
  27. document.add_paragraph(
  28. u"支持各类样式进行调整", style="ListBullet"
  29. )
  30. document.add_paragraph(u"python-doc模块不足的地方:")
  31. document.add_paragraph(
  32. u"相对简单", style="ListNumber"
  33. )
  34. document.add_paragraph(
  35. u"暂不支持WORD文档模板", style="ListNumber"
  36. )
  37. document.add_heading(u"二、各板块统计", level=1)
  38. text=u"沪深两地的上市A股总共有%s只,其中沪市有 %s 只,深市有%s 只,各板块的数据占比如下所示"
  39. %(str(df["STOCKNAME"].count()),
  40. str(df[df["TRDMARKETNAME"]=="上海"]["STOCKNAME"].count()),
  41. str(df[df["TRDMARKETNAME"]=="深圳"]["STOCKNAME"].count())
  42. )
  43. document.add_paragraph(text)
  44. # 插入图片,文件名可以作为参数传入,由之前的程序进行传入
  45. document.add_picture(pie_file_path, width=Inches(5.0))
  46. document.add_heading(u"三、上市时间统计", level=1)
  47. text=u"
  48. 上市时间分布图如下所示,可以看出今明两年并不上上市的高峰期"
  49. document.add_paragraph(text)
  50. # 插入图片,文件名可以作为参数传入,由之前的程序进行传入
  51. document.add_picture(bar_file_path, width=Inches(5.0))
  52. document.add_heading(u"四、待上市新股统计", level=1)
  53. # 轮询上市时间为空的未上市股票,添加表格
  54. text=u"
  55. 待上市股票列表如下"
  56. df["TIMETOMARKET"]=df["TIMETOMARKET"].map(lambda x:"99991231" if x is None else x[0:4])
  57. df_newstock=df[df["TIMETOMARKET"]=="99991231"]
  58. print df_newstock
  59. #插入表格
  60. table = document.add_table(rows=len(df_newstock.index)+1, cols=3,style="Table Grid")
  61. hdr_cells = table.rows[0].cells
  62. hdr_cells[0].text = u"股票名称"
  63. hdr_cells[1].text = u"上市交易所"
  64. hdr_cells[2].text = u"上市板块"
  65. #编历DATAFRAME
  66. list_stockname=list(df_newstock["STOCKNAME"])
  67. list_TRDMARKETNAME=list(df_newstock["TRDMARKETNAME"])
  68. list_PLATENAME=list(df_newstock["PLATENAME"])
  69. for i in range(len(df_newstock.index)):
  70. row_cells = table.add_row().cells
  71. #注意这里PYTHON2的编码问题,多谢stackoverflow,程序员的圣地
  72. row_cells[0].text = unicode(list_stockname[i],"utf-8")
  73. row_cells[1].text = unicode(list_TRDMARKETNAME[i],"utf-8")
  74. row_cells[2].text = unicode(list_PLATENAME[i],"utf-8")
  75. document.add_page_break()
  76. document.save(doc_file_path)
三、前后串在一起,生成最终完整的WORD文件

</>复制代码

  1. #生成图片
  2. (df,pie_file_path,bar_file_path)=getDataAndSavePic()
  3. #整合到WORD文档当中
  4. gen_docfile(df,pie_file_path,bar_file_path,r"d:
  5. emp
  6. est.doc")
四、最终效果图

打开d:temptest.doc,效果如下:

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41431.html

相关文章

  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0
  • 基于Selenium + Python的web自动化框架

    摘要:一什么是是一个基于浏览器的自动化工具,她提供了一种跨平台跨浏览器的端到端的自动化解决方案。模块主要用来记录用例执行情况,以便于高效的调查用例失败信息以及追踪用例执行情况。测试用例仓库用例仓库主要用来组织自动化测试用例。 一、什么是Selenium? Selenium是一个基于浏览器的自动化工具,她提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分:...

    sunny5541 评论0 收藏0
  • 【数据科学系统学习】Python # 数据分析基本操作[三] matplotlib

    摘要:有一些表示常见图形的对象称为块,完整的集合位于。中的绘图函数在中,有行标签列标签分组信息。密度图通过计算可能会产生观测数据的连续概率分布的估计而产生的。在探索式数据分析工作中,同时观察一组变量的散布图是很有意义的。 我们在上一篇介绍了 pandas,本篇介绍 matplotlib。 绘图和可视化 一个用于创建出版质量图表的桌面绘图包。 Matplotlib API入门 Figure ...

    BDEEFE 评论0 收藏0
  • 一份关于人工智能、机器学习和大数据的报告

    摘要:为了你最好的未来,请不断的学习创始人兼首席执行官人工智能和机器学习的时代已经到来了,这些领域都有可能对印度的行业产生重大的影响。在印度努力重振生产力增长的同时,人工智能和机器学习有望填补这一空白。 showImg(http://upload-images.jianshu.io/upload_images/13825820-702c6873cd07cfc3.jpg?imageMogr2/...

    Carbs 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<