ch5-处理数据,抽取-整理-推导

场景:教练kelly有4个选手James\Sarah\Julie\Mikey,他们每跑600米,教练就会计时并把时间记录在计算机的一个文件中,总共4个文件:James.txt\Sarah.txt\Julie.txt\Mikey.txt,分别记录4个选手的时间数据。

期望:教练需要一种快捷的方法能够很快了解到每个选手跑的最快的3个时间

1、将文件中选手数据读入到各自的列表中,并屏幕显示这些列表;

data.strip().split(‘,‘):此为“方法串链”,从左到右读这种方法链。

2、对数据进行排序

原地排序:指按照指定的顺序排列数据,然后用排序后的数据替换原来的数据,原来的顺序会丢失。升序为sort() BIF,降序需增加参数reverse=Ture.

复制排序:指按照指定的顺序排列数据,然后返回原数据的一个有序副本,原数据的顺序依然保留,只是对一个副本排序。升序为sorted() BIF,降序需增加参数reverse=Ture.

>>> data=[6,3,1,2,4,5]
>>> data
[6, 3, 1, 2, 4, 5]
>>> data.sort()  #原地排序
>>> data
[1, 2, 3, 4, 5, 6]
>>> #原地排序结果显示原数据的顺序已经改变
>>>
>>> data=[6,3,1,2,4,5]
>>> data
[6, 3, 1, 2, 4, 5]
>>> data2=sorted(data)  #复制排序
>>> data2
[1, 2, 3, 4, 5, 6]
>>> data
[6, 3, 1, 2, 4, 5]
>>> #复制排序结果显示原数据的顺序并未改变
>>>
>>> data=[6,3,1,2,4,5]
>>> data
[6, 3, 1, 2, 4, 5]
>>> data.sorted()
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    data.sorted()
AttributeError: ‘list‘ object has no attribute ‘sorted‘
>>> >>> data=[6,3,1,2,4,5]>>> data[6, 3, 1, 2, 4, 5]>>> data.sort(reverse=True) #原地排序降序>>> data[6, 5, 4, 3, 2, 1]>>> >>> data=[6,3,1,2,4,5]>>> data[6, 3, 1, 2, 4, 5]>>> data2=sorted(data,reverse=True)#复制排序降序>>> data2[6, 5, 4, 3, 2, 1]>>> 

使用复制排序对教练的4个选手数据进行排序:

函数串链:允许对数据应用一系列函数,与方法串链不同,函数串链要从右向左读

排序结果显示:2-55居然在2.18之前,数据格式不统一,分钟和秒的分隔符导致排序混乱。

Python可以对字符串排序,升序排序时短横线-点号-冒号;

需要修正数据!!

3、数据修正

定义一个函数sanitize(),从各个选手的列表接收一个字符串作为输入,然后处理这个字符串,将从中找到的短横线或者冒号替换为一个点号,并返回清理过的字符串。
如果字符串已经包含一个点号,则无需再替换;

将现有的数据转换为经过清理的版本。

def sanitize(time_string):
    if ‘-‘ in time_string:
        splitter = ‘-‘
    elif ‘:‘ in time_string:
        splitter = ‘:‘
    else:
        return(time_string)
    (mins, secs) = time_string.split(splitter)
    return(mins + ‘.‘ + secs)

with open(‘james.txt‘) as jaf:
    data = jaf.readline()
james = data.strip().split(‘,‘)

with open(‘julie.txt‘) as juf:
    data = juf.readline()
julie = data.strip().split(‘,‘)

with open(‘mikey.txt‘) as mif:
    data = mif.readline()
mikey = data.strip().split(‘,‘)

with open(‘sarah.txt‘) as saf:
    data = saf.readline()
sarah = data.strip().split(‘,‘)

clean_james = []
clean_julie = []
clean_mikey = []
clean_sarah = []

for each_t in james:
    clean_james.append(sanitize(each_t))

for each_t in julie:
    clean_julie.append(sanitize(each_t))

for each_t in mikey:
    clean_mikey.append(sanitize(each_t))

for each_t in sarah:
    clean_sarah.append(sanitize(each_t))

print(sorted(clean_james))
print(sorted(clean_julie))
print(sorted(clean_mikey))
print(sorted(clean_sarah))

清理成功!!格式不但一致,而且数据有序!!

但是代码重复,代码创建了4个列表保存从文件中读入的数据,又创建4个列表保存清理过的数据,到处都在迭代。。。。。

还有更好的处理办法---转换列表,python提供了一个很好用的工具(推导列表)来完成转换,涉及推导列表是为了减少将一个列表转换为另一个列表时所需编写的代码。

4、推导列表

列表转换需要做4件事:

  1)创建一个新列表存放转换后的数据;

  2)迭代处理原列表中的各项数据;

  3)每次迭代时完成转换

  4)将转换后的数据追加到新列表;

clean_james = []  #1.创建

for each_t in james:   #2.迭代
    clean_james.append(sanitize(each_t))  #3.转换    4.追加
clean_james=[sanitize(each_t) for each_t in james]   #列表推导,一行代码完成创建、迭代、转换、追加

列表推导来处理教练的4个计时值列表:

正如我们期望的,输出与前面完全一致。

注意:你可能想在列表推导中使用函数链sorted(sanitize(t)),但是千万别这样做!!因为sanitize(t)是输出一个数据项,sorted() BIF希望对一个列表排序,而不是对单个的数据项。

5、迭代删除重复项

任务:生成每个选手的3次最快时间

使用标记法指定单个的列表项:james[0]、james[1]、james[2]

列表分片:james[0:3]

使用迭代删除重复项,并获得每个选手的3次最快时间。

def sanitize(time_string):
    if ‘-‘ in time_string:
        splitter = ‘-‘
    elif ‘:‘ in time_string:
        splitter = ‘:‘
    else:
        return(time_string)
    (mins, secs) = time_string.split(splitter)
    return(mins + ‘.‘ + secs)

with open(‘james.txt‘) as jaf:
    data = jaf.readline()
james = data.strip().split(‘,‘)

with open(‘julie.txt‘) as juf:
    data = juf.readline()
julie = data.strip().split(‘,‘)

with open(‘mikey.txt‘) as mif:
    data = mif.readline()
mikey = data.strip().split(‘,‘)

with open(‘sarah.txt‘) as saf:
    data = saf.readline()
sarah = data.strip().split(‘,‘)

#将排序的数据替换原来无序且不一致的数据
james = sorted([sanitize(t) for t in james])
julie = sorted([sanitize(t) for t in julie])
mikey = sorted([sanitize(t) for t in mikey])
sarah = sorted([sanitize(t) for t in sarah])

unique_james = []  #创建一个新列表,存储唯一的数据
for each_t in james:     #在现有数据基础上迭代处理
    if each_t not in unique_james:   #若这个数据不在新列表中
        unique_james.append(each_t)   #将这个唯一的数据追加到新列表中
print(unique_james[0:3])       #从列表分片中得到前3个数据项,并打印到屏幕上

unique_julie = []
for each_t in julie:
    if each_t not in unique_julie:
        unique_julie.append(each_t)
print(unique_julie[0:3])

unique_mikey = []
for each_t in mikey:
    if each_t not in unique_mikey:
        unique_mikey.append(each_t)
print(unique_mikey[0:3])

unique_sarah = []
for each_t in sarah:
    if each_t not in unique_sarah:
        unique_sarah.append(each_t)
print(unique_sarah[0:3])
>>>
===== RESTART: D:\workspace\headfirstpython\chapter5\page162\page162.py =====
[‘2.01‘, ‘2.22‘, ‘2.34‘]
[‘2.11‘, ‘2.23‘, ‘2.59‘]
[‘2.22‘, ‘2.38‘, ‘2.49‘]
[‘2.18‘, ‘2.25‘, ‘2.39‘]
>>> 

成功了!!

但是从列表中删除重复项的代码本身是重复的。可以将重复的代码抽取到一个小函数中。

6、快速用集合删除重复项

  1)用集合删除重复项

python集合最突出的特性:集合中的数据项是无序的,而且不允许重复。如果试图向集合中添加已存在的数据,Python就会忽略它。

distances=set()  #创建一个新的空集合,并赋至一个变量
distances={10.6,11,8,10.6,‘two‘,7}  #提供的数据值列表中的重复项10.6将会被忽略
distances=set(james)   #james中的所有重复项都被忽略

工厂函数:用于创建某种类型的新的数据项。例如set()就是一个工厂函数。在真实的世界中,工厂会生产产品,这个概念因此而得名。

代码优化:

太棒啦!!!

时间: 2024-08-14 08:35:39

ch5-处理数据,抽取-整理-推导的相关文章

BI项目中的ETL设计详解(数据抽取、清洗与转换 )

ETL是BI项目最重要的一个环节,通常情况下ETL会花掉整个项目的1/3的时间,ETL设计的好坏直接关接到BI项目的成败.ETL也是一个长期的过程,只有不断的发现问题并解决问题,才能使ETL运行效率更高,为项目后期开发提供准确的数据. ETL的设计分三部分:数据抽取.数据的清洗转换.数据的加载.在设计ETL的时候也是从这三部分出发.数据的抽取是从各个不同的数据源抽取到ODS中(这个过程也可以做一些数据的清洗和转换),在抽取的过程中需要挑选不同的抽取方法,尽可能的提高ETL的运行效率.ETL三个部

HR数据抽取:通过 Read Master Data 转换规则读取时间相关主属性数据

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4287014.html 员工 0HR_PA_0 业务数据源中有一个CALMONTH日历年/月的字段,只要员工还在职,每个员工每个月都会产生一条数据:   人事事件 0HR_PA_1 业务数据源中有一个CALDAY日历天的字段,只要员工发生人事

数据抽取工具——DMCTextFilter V4.2(纯文本抽出通用程序库)

DMCTextFilter V4.2是由北京红樱枫软件有限公司研制和开发的纯文本抽出通用程序库产品.本产品可以从各种各样的文档格式的数据中或从插入的OLE对象中,完全除掉特殊控制信息,快速抽出纯文本数据信息.便于用户实现对多种文档数据资源信息进行统一管理,编辑,检索和浏览.本产品采用了先进的多语言.多平台.多线程的设计理念,支持多国语言(英语,中文简体,中文繁体,日本语,韩国语),多种操作系统(Windows,Solaris,Linux,IBM AIX,Macintosh,HP-UNIX),多种

数据抽取——纯文本抽出程序库DMCTextFilter

数据抽取工具 纯文本抽出程序库DMCTextFilter DMCTextFilter V4.2是由北京红樱枫软件有限公司研制和开发的纯文本抽出通用程序库产品.本产品可以从各种各样的文档格式的数据中或从插入的OLE对象中,完全除掉特殊控制信息,快速抽出纯文本数据信息.便于用户实现对多种文档数据资源信息进行统一管理,编辑,检索和浏览. 一.应用案例 在实际的推广和应用中,红樱枫的通用文本抽出程序软件被应用到了多个领域,如:信息资源开发利用,智能搜索引擎,情报分析和服务,信息安全,企业知识门户,数字图

初始化数据抽取、初始条件与增量条件

声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4297069.html (注:非后勤模块信息包不能选择下面第三种初始化方式: ) 初始化的过程会做的三件事: 1.加载初始数据 2.打初始标记(主要记录初始化时数据过滤条件是什么,在增量抽取时使用

财务模块数据抽取

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4296810.html 财务模块没有 Setup Table设置表.Extracties Queue抽取队列.Update Table更新表 这些概念,因为财务模块采用的时间戳来实现的,Pull拉的方式抽数,抽数的过程不需要经过这些中间临时缓

ETL数据抽取

1.ETL:数据抽取 2.抽取数据在不同的数据源之间,把数据进行转化,加载,清洗操作,保证抽取的数据合法. 3.开源实现:Kettle 工具 ==================================================================== 学习: 大家可以学学这个Kettle 工具,通过借鉴这个工具,我们可以自己设计自己的ETL过程,工具很好用,官方自带一些例子:ata-integration\samples. ======================

应用Pentaho Data Integration(Kettle) 6.1 进行数据抽取以及指标计算(一、同构数据抽取)

一.概述 本案例是一个小型数据抽取分析类系统,通过抽取数据共享中心中生产管理系统.营销管理系统.计量自动化系统的配网台区(一个台区一个配变)的相关数据进行整合,完成有关台区的50多个字段按照日.月.多月等维度的集中计算展示,其中有17个指标字段需要系统进行自动计算,并于每天对不同部门关注的台区指标进行超标告警,除开这些基本要求之外,用户还要求支持历史报表的查询以及可以对部分计算参数进行配置修改,甚至可以修改计算参数后对历史报表产生影响. 经过数据量分析,配变基本数据方面,生产有300多万个功能位

《BI项目笔记》增量ETL数据抽取的策略及方法

增量抽取 增量抽取只抽取自上次抽取以来数据库中要抽取的表中新增或修改的数据.在ETL使用过程中.增量抽取较全量抽取应用更广.如何捕获变化的数据是增量抽取的关键.对捕获方法一般有两点要求:准确性,能够将业务系统中的变化数据按一定的频率准确地捕获到:性能,不能对业务系统造成太大的压力,影响现有业务.目前增量数据抽取中常用的捕获变化数据的方法有:a.触发器:在要抽取的表上建立需要的触发器,一般要建立插入.修改.删除三个触发器,每当源表中的数据发生变化,就被相应的触发器将变化的数据写入一个临时表,抽取线