2. Python脚本学习实战笔记二 分析提取数据成图

2. Python脚本学习实战笔记二 分析提取数据成图

本篇名言:“换个方法思考,可以使问题变简单;换个立场看人,可以更宽容处世;换种心态看人生,可以得到更多美好。有时仅需换换角度,就可以改变自己的一生。”

PDF表示可移植文档格式,是Adobe定义的一种可以使用图和文本来显示各种文档的格式。第二个项目就是如何利用图形来创建一个PDF文件。

1.  需求

Python善于做数据分析。使用Python中的文件处理和字符串处理功能,可以创建一个数据文件的某种格式的报告。但是有时候纯文本不够用,所有需要使用图片。

本次项目具体需求如下:

l  下载得到数据文件

l  处理分析数据文件

l  创建PDF文件

2.  工具及准备

图形生成包,可以使用ReportLab。ReportLab很容易使用并且为PDF中的图形和文档生成提供了丰富的功能。

2.1      安装ReportLab

https://pypi.python.org/pypi/reportlab/#downloads下载ReportLab的whl包。

然后执行 pip install***.whl

完成安装。

测试如下:

>>>import reportlab

无报错即可。

 

2.2      测试数据

 

同上一个项目一样,需要准备测试数据。蛤蟆已经帮大家下下来了,可以直接使用。

Prediect.txt

2007        12             4.8            5                4.7            67.6         70.4         64.7

2008        1                4.3            4.4            4.2            66.7         69.5         63.8

2008        2                4                4.1            3.9            66.1         68.9         63.2

2008        3                4.2            4.3            4                65.7         68.6         62.8

2008        4                4.6            4.8            4.4            64.7         68.6         62.7

2008        5                5.2            5.6            4.9            65.6         68.7         62.5

2008        6                5.8            6.3            5.2            65.2         68.5         62

2008        7                6.3            7.1            5.5            64.9         64.9         61.4

2008        7                7.4            8.6            6.3            65.1         65.1         61.2

2008        7                8.6            10.2         7                65.4         65.4         61.2

 

 

3.  初次实现

先将数据以一系列元组的形式放入源代码。

生成PDF的最基本模块是pdfgen,包含一个Canvas类。

Reportlab.graphics包以及它的子模块可以用来画出各种形状的对象。并且把这些对象添加到Drawing对象中。

示例代码如下:

fromreportlab.graphics.shapes importDrawing, String

fromreportlab.graphics importrenderPDF

d = Drawing(100, 100)

s = String(50, 50, 'Hello, world!',textAnchor='middle')

d.add(s)

renderPDF.drawToFile(d, 'hello.pdf', 'Asimple PDF file')

将字符串“Helloworld!” 画在一个100X100像素大小的PDF格式的图形中间。

首先创建一个给定大小的图纸Drawing,然后创建带有某些属性的图形元素。

得到PDF打开如下图所示:

3.1      构造折线

构造折线,可以使用特定的类:PolyLine.

                  PolyLine把一个坐标列表作为第一个参数。列表形式是[ (x0,y0),(x1,y1),…]

创建折线示例如下:

fromreportlab.lib import colors

fromreportlab.graphics.shapes import *

fromreportlab.graphics importrenderPDF

data = [

#    Year Month  Predicted  High Low

   (20078,    113.2,     114.2, 112.2),

   (20079,    112.8,     115.8, 109.8),

   (2007, 10,    111.0,     116.0, 106.0),

   (2007, 11,    109.8,     116.8, 102.8),

   (2007, 12,    107.3,     115.399.3),

   (20081,    105.2,     114.296.2),

   (20082,    104.1,     114.194.1),

   (20083,     99.9,     110.988.9),

   (20084,     94.8,     106.882.8),

   (20085,     91.2,     104.278.2),

   ]

drawing = Drawing(200, 150)

pred = [row[2]-40for row in data]

high = [row[3]-40for row in data]

low = [row[4]-40for row in data]

times = [200*((row[0] + row[1]/12.0) - 2007)-110for row in data]

drawing.add(PolyLine(zip(times,pred), strokeColor=colors.blue))

drawing.add(PolyLine(zip(times,high), strokeColor=colors.red))

drawing.add(PolyLine(zip(times,low),  strokeColor=colors.green))

drawing.add(String(65, 115, 'Sunspots',fontSize=18, fillColor=colors.red))

renderPDF.drawToFile(drawing, 'report1.pdf', 'Sunspots')

运行输出一个report.pdf文件,双击打开如下:

程序中创建了200X150的图纸。然后获得每个列的值,然后根据时间和3个列输出3条线。

然后在图纸上增加一个字符串,最后将图纸输出到report.pdf文件中。

到此,完成了程序的原型。

 

4.  重构

元型中不具备读取数据的功能,此外时间和值很粗糙需要改进。

4.1      获取数据

使用标准块urllib可以从网上下载获取文件。

其中urlopen和open相似,不过是一个URL而不是文件名作为参数。

实现如下:

URL = 'http://www.swpc.noaa.gov/ftpdir/weekly/Predict.txt'

data = []

forline in urlopen(URL).readlines():

   ifnot line.isspace() andnot line[0] in COMMENT_CHARS:

        data.append([float(n) for n in line.split()])

 

4.2      使用LinePlot类

由于快速原型设计的精神就是用手动的工具来看看能做什么。

LinePlot类相比PolyLine更加漂亮和简单。

 

 

5.  最后交付

fromurllib import urlopen

fromreportlab.graphics.shapes import *

fromreportlab.graphics.charts.lineplots import LinePlot

fromreportlab.graphics.charts.textlabels import Label

fromreportlab.graphics importrenderPDF

 

URL = 'yourshuold input the txt on the web'

COMMENT_CHARS = '#:'

 

 

drawing = Drawing(400, 200)

data = []

#for line in urlopen(URL).readlines():

#    if not line.isspace() and not line[0] inCOMMENT_CHARS:

#        data.append([float(n) for n inline.split()])

 

data = [

#    Year Month  Predicted  High Low

   (20078,    113.2,     114.2, 112.2),

   (20079,    112.8,     115.8, 109.8),

   (2007, 10,    111.0,     116.0, 106.0),

   (2007, 11,    109.8,     116.8, 102.8),

   (2007, 12,    107.3,     115.399.3),

   (20081,    105.2,     114.296.2),

   (20082,    104.1,     114.194.1),

   (20083,     99.9,     110.988.9),

   (20084,     94.8,     106.882.8),

   (20085,     91.2,     104.278.2),

   ]

 

 

 

pred = [row[2] forrow in data]

high = [row[3] forrow in data]

low = [row[4] forrow in data]

times = [row[0] + row[1]/12.0for row in data]

 

lp = LinePlot()

lp.x = 50

lp.y = 50

lp.height = 125

lp.width = 300

lp.data = [zip(times, pred),zip(times, high), zip(times, low)]

lp.lines[0].strokeColor = colors.blue

lp.lines[1].strokeColor = colors.red

lp.lines[2].strokeColor = colors.green

 

drawing.add(lp)

 

drawing.add(String(250, 150, 'Sunspots',

            fontSize=14, fillColor=colors.red))

 

 

renderPDF.drawToFile(drawing, 'report2.pdf', 'Sunspots')

 

由于只能在网上打开,所以获取数据这块,已注释。

最后得到的PDF文件如下图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值