Python3实践项目一:生成0-5岁宝宝生长发育报告

face.jpg

​本文介绍基于Python3.5.2,根据世界卫生组织发布的0-5岁宝宝生长发育标准百分位数曲线数据,以及宝宝的身长\高,体重,头围监测数据,绘制宝宝的身长\高,体重,头围,体重指数,身长\身高别体重的曲线图,然后生成.docx格式的文档,最后将文档转变为PDF格式的报告。

image
  • 一、获取数据

https://www.who.int/childgrowth/standards/zh/找到需要的数据列表,然后利用爬虫获取相应的数据,并将数据以.xls格式存储,最后再读取形成字典形式。

1,用到的库

bs4:版本4.6.0
pandas:版本0.23.4
numpy:版本1.16.4
urllib:Python3.5.2内置版

2,主要知识点

  • 打开网页
from urllib import request
from bs4 import BeautifulSoup as bs
html = request.urlopen(all_url) # all_url网页地址,打开网页
bs_data = bs(html.read(), "html5lib")  # 解析网页
  • 数据存储与读取
import pandas as pd
# 将numpy的array格式的数据变为pandas的DataFrame格式
pd_data = pd.DataFrame(np.array(data_list), columns=df_column)
# 直接写入excel中
pd_data.to_excel(excel_path, sheet_name=name, encoding='gb2312', index=False)
# 读取数据
read_data = pd.read_excel(excel_path, sheet_name=name, header=1)
image
  • 二、绘图

首先利用matplotlib绘制标准曲线图,然后将监测数据经过三次样条插值,再绘制宝宝的生长曲线图。

1,用到的库

matplotlib:版本3.0.2
scipy:版本1.2.0

2,主要知识点

  • 显示中文与负号
from pylab import mpl # 作图显示中文
mpl.rcParams['font.sans-serif'] = ['STZhongsong']  # 设置中文字体为新宋体
mpl.rcParams['axes.unicode_minus'] = False # 显示负号
  • 设置边框颜色与宽度
ax = plt.gca()  # 获取边框
ax.spines['top'].set_color(self.color)
ax.spines['right'].set_color(self.color)
ax.spines['left'].set_color(self.color)
ax.spines['bottom'].set_color(self.color)
ax.spines['bottom'].set_linewidth(1.2)
ax.spines['left'].set_linewidth(1.2)
ax.spines['top'].set_linewidth(1.2)
ax.spines['right'].set_linewidth(1.2)
  • 设置主、次网格线的刻度、粗度、颜色
from matplotlib.ticker import MultipleLocator
ax.yaxis.set_minor_locator(MultipleLocator(0.5)) # 设置y轴次刻度
ax.xaxis.set_minor_locator(MultipleLocator(1))  # 设置x轴次刻度
ax.xaxis.grid(True, which='major', linewidth=1.2, color=color)  # 使用主刻度绘制x坐标轴的网格
ax.yaxis.grid(True, which='minor', linewidth=0.7, color=color)  # 使用次刻度绘制y坐标轴的网格
ax.xaxis.grid(True, which='minor', linewidth=0.7, color=color)  # 使用次刻度绘制x坐标轴的网格
ax.yaxis.grid(True, which='major', linewidth=1.2, color=color)  # 使用主刻度绘制y坐标轴的网格
  • 设置网格线在绘制线的下方
ax.set_axisbelow(True)
  • 设置x轴标签在图片上方的轴
ax.xaxis.tick_top()
  • 设置标签线的长度、颜色、粗度
from pylab import tick_params, minorticks_on 
minorticks_on()
tick_params(axis='y', which='major', width=1, length=4, colors=color)
tick_params(axis='x', which='major', width=1, length=2, colors=color)
tick_params(which='minor', length=0)
  • 设置图中图
ax2 = fig.add_axes([left, bottom, width, height])  # 图中图
  • 绘制表格

table = ax2.table(cellText=cellText, colLabels=colLabels, loc='lower center', cellLoc='left',
                  colWidths=list(table_w))
table.auto_set_font_size(False)  # 取消自动设置字体大小
table.set_fontsize(8) # 表格字体大小设置
table_props = table.properties()
table_cells = table_props['child_artists']
for cell in table_cells:
    cell._text.set_color(self.color)  # 设置字体颜色
    cell.set_edgecolor(self.color)   # 设置表格线的颜色
  • 保存图片去掉多余空白
fig = plt.gcf()
fig.savefig(fig_path, dpi=100, bbox_inches='tight') 
  • 三次样条插值
from scipy import interpolate
# 三次样条插值插值
t = interpolate.splrep(x_data, y_data, k=3)
day_data = np.linspace(min(x_data), max(x_data), num=1000)
interp_data = interpolate.splev(day_data, t)
image
  • 三、生成.docx文件

将生成的图片以及宝宝的信息整合到.docx文档中。

1,用到的库

docx:版本0.8.10

2,主要知识点

  • 字体、颜色、大小、位置设置
from docx import Document
from docx.shared import Inches, RGBColor
from docx.oxml.ns import qn
from docx.shared import Pt
import docx.enum.text as s
# 新建Word文档
document = Document()

p = document.add_paragraph('')
text1 = p.add_run(str_para) # 添加内容
text1.font.size = Pt(24)                                # 字体大小
text1.bold = True                                       # 字体是否加粗
text1.font.name = 'Times New Roman'                     # 控制是西文时的字体
text1.element.rPr.rFonts.set(qn('w:eastAsia'), '华文中宋')  # 字体设置
p.paragraph_format.alignment = s.WD_ALIGN_PARAGRAPH.CENTER  # 位置设置
text1.font.color.rgb = RGBColor(*color)  # 颜设置
  • 图片居中
document.add_paragraph('')
tab = document.add_table(rows=1, cols=3)  # 添加一个1行3列的空表
cell = tab.cell(0, 1)  # 获取某单元格对象(从0开始索引)
ph = cell.paragraphs[0]
run = ph.add_run()
run.add_picture(ig_path, width=Inches(5))
  • 页边距设置

se = add_docu.add_section()
se.left_margin = Inches(0.4)  # 左边距离
se.right_margin = Inches(0.4)  # 右边距离
  • 表格设置

table = document.add_table(rows=5, cols=2, style=style)  # 添加表格5行、2列
# 添加第二行的内容
hdr_cells = table.rows[1].cells
hdr_cells[0].text = '宝宝昵称'
hdr_cells[1].text = b.b_n

# 设置表格内文字的大小、颜色,表格线的颜色
for row in table.rows:
    for cell in row.cells:
        paragraphs = cell.paragraphs
        for paragraph in paragraphs:
            for run in paragraph.runs:
                font = run.font
                font.size = Pt(15)
                font.color.rgb = RGBColor(*color)

四、转化为PDF格式

将.docx文档转化为PDF格式时,如果程序的错误信息显示下面的内容:

C:\\Program Files (x86)\\Microsoft Office\\Office12\\2052\\WDMAIN11.CHM'

这说明是word输出pdf出现错误,需要下载插件SaveAsPDFandXPS.exe,安装即可。

1,用到的库

win32com

2,主要知识点

  • .docx转为PDF
from win32com import client
word = client.DispatchEx("Word.Application")
worddoc = word.Documents.Open(doc_path, ReadOnly=1)
worddoc.SaveAs(pdf_path, FileFormat=17)
worddoc.Close()
image

五、报告示例:男宝

image
image
image
image
image
image
image
image
image
image
image
image
image

点击获得项目源码。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。

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

推荐阅读更多精彩内容