《Python数据分析与挖掘实战》一2.2 Python使用入门

2.2 Python使用入门

限于篇幅,本书不可能详细地讲解Python的使用,而只能是针对本书涉及的数据挖掘案例所用到的代码进行基本讲解。如果读者是初步接触Python,并且用Python的目的就是数据挖掘,那么相信本节的介绍对你来说是比较充足的。如果读者需要进一步了解Python,或者需要运行更加复杂的任务,那么本书是不够的(例如,本书没有谈及到面向对象编程),请读者自行阅读相应的Python教程。

2.2.1 运行方式

本节示例代码使用的是Python 2.7。运行Python代码有两种方式,一种方式是启动Python,然后在命令窗口下直接输入相应的命令;另外一种就是将完整的代码写成.py脚本,如hello.py,然后通过python hello.py执行,如下所示。

# hello.py
print 'Hello World!'

执行结果如图2-4所示。

在编写脚本的时候,可以添加适当的注释。在每一行中,可以用井号“#”来添加注释,例如:
a = 2 + 3 #这句命令的意思是将2+3的结果赋值给a
如果注释有多行,可以在两个“'''”之间(3个英文的单引号)添加注释内容。
a = 2 + 3
'''
这里是Python的多行注释。
这里是Python的多行注释。
'''
如果脚本中带有中文(中文注释或者中文字符串,中文字符串要在前面加u),那么需要在文件头注明编码,并且还要将脚本保存为UTF-8编码格式。

# -- coding: utf-8 -
print u'世界,你好!'

2.2.2 基本命令

(1)基本运算
认识Python的第一步,是可以把它当做一个方便的计算器来看待。读者可以打开Python,试着输入以下命令。

a = 2
a * 2
a ** 2

以上是Python几个基本的运算,第一个是赋值运算,第二是乘法,最后是一个是幂(即a2),这些基本上是编程语言通用的。不过Python支持多重赋值。

a, b, c = 2, 3, 4

这句命令相当于

a = 2
b = 3
c = 4

Python支持对字符串的灵活操作,如:

s = 'I like python'
s + ' very much' #将s与' very much'拼接,得到'I like python very much'
s.split(' ') #将s以空格分割,得到列表['I', 'like', 'python']

(2)判断与循环
显然判断和循环是所有编程语言的基本命令,Python的判断语句如下。

if 条件1:
     语句2
elif 条件3:
     语句4
else:
     语句5

需要特别指出的是,Python一般不用花括号{},也没有end语句,它是用缩进对齐作为语句的层次标记。同一层次的缩进量要一一对应,否则报错,如下面的语句是错误的。

if a==1:
   print a #缩进两个空格
else:
     print u'a不等于1' #缩进三个空格

不管是哪种语言,正确的缩进都是一个优雅的编程习惯。
Python的循环也相应地有for循环和while循环,while循环如下。

s,k = 0
while k < 101: #该循环过程就是求1+2+3+...+100
  k = k + 1
  s = s + k
print s
for循环如下。
s = 0
for k in range(101): #该循环过程也是求1+2+3+...+100
  s = s + k
print s

这里,我们看到了in和range语法,in是一个非常方便、而且非常直观的语法,用来判断一个元素是否在列表/元组中,range用来生成连续的序列,一般语法为range(a, b, c),表示以a为首项、c为公差且不超过b-1的等差数列,例如,

s = 0
if s in range(4):
    print u's在0, 1, 2, 3中'
if s not in range(1, 4, 1):
    print u's不在1, 2, 3中'

(3)函数
Python用def来自定义函数。

def add2(x):
  return x+2
print add2(1) #输出结果为3

这很普通,没什么特别的,但是与一般编程语言不同的是,Python的函数返回值可以是各种形式,比如返回列表,甚至返回多个值。

def add2(x = 0, y = 0): #定义函数,同时定义参数的默认值
  return [x+2, y+2] #返回值是一个列表
def add3(x, y):
  return x+3, y+3 #双重返回
a, b = add3(1,2) #此时a=4,b=5

有时候,像定义add2()这类简单的函数,用def来正式地写个命名、计算和返回显得有点麻烦了,Python支持用lambda对简单的功能定义“行内函数”,这有点像Matlab中的“匿名函数”,如下。

f = lambda x : x + 2 #定义函数f(x)=x+2
g = lambda x, y: x + y #定义函数g(x,y)=x+y

2.2.3 数据结构

Python有4个内建的数据结构—List(列表)、Tuple(元组)、Dictionary(字典)以及Set(集合),它们可以统称为容器(container),因为它们实际上是一些“东西”组合而成的结构,而这些“东西”,可以是数字、字符甚至是列表,或者是它们之间几种的组合。通俗地讲,容器里是什么都行,而且容器里的元素类型不要求相同。
(1)列表/元组
列表和元组都是序列结构,它们本身很相似,但又有一点不同的地方。
从外形上看,列表与元组的区别是,列表是用方括号标记的,如a=[1, 2, 3],而元组是用圆括号标记的,如b=(4, 5, 6),访问列表和元组中的元素的方式都是一样的,如a[0]等于1,b[2]等于6等。上面已经谈及,容器里是什么都行,因此,下面的定义也是成立的。

c = [1, 'abc', [1, 2]]
'''
c是一个列表,列表的第一个元素是整型1,第二个是字符串'abc',第三个是列表[1, 2]
'''

从功能上看,列表与元组的区别是,列表可以被修改,而元组不可以。比如,对于a=[1, 2, 3],那么语句a[0]=0,就会将列表a修改为[0, 2, 3],而对于元组b=(4, 5, 6),语句b[0]=1就会报错。要注意的是,如果已经有了一个列表a,同时想复制a,命名为变量b,那么b=a是无效的,这时候b仅仅是a的别名(或者说引用),修改b也会修改a的。正确的复制方法应该是b=a[:]。
与列表有关的函数是list,与元组有关的函数是tuple,它们的用法和功能几乎一样,都是将某个对象转换为列表/元组,如list('ab')的结果是['a', 'b'],tuple([1, 2])的结果是(1, 2)。表2-1是一些常见的与列表/元组相关的函数。

此外,作为对象,列表本身自带了很多实用的方法(元组不允许修改,因此方法很少),见表2-2。

最后,不能不提的是“列表解析”这一功能,它能够简化我们对列表内元素逐一进行操作的代码,如下面的代码

a = [1, 2, 3]
b = []
for i in a:
  b.append(i + 2)

可以简化到

a = [1, 2, 3]
b = [i+2 for i in a]

这样的语法不仅方便,而且直观!充分体现了Python语法的人性化。在本书中,我们将会比较多地用到这样简洁的代码。
(2)字典
Python引入了“自编”这一方便的概念。从数学上来讲,它实际上是一个映射。通俗来讲,它也相当于一个列表,然而它的“下标”不再是以0开头的数字,而是让自己定义的“键”(Key)开始。
创建一个字典的基本方法为:

d = {'today':20, 'tomorrow':30}

这里的'today'、'tomorrow'就是字典的键,它在整个字典中必须是唯一的,而20、30就是键对应的值,访问字典中元素的方法也很直观。

d['today'] #该值为20
d['tomorrow'] #该值为30

还有其他一些比较方便的方法来创建一个字典,如通过dict()函数转换,或者通过dict.fromkeys来创建,如下。

dict([['today', 20], ['tomorrow', 30]]) #也相当于{'today':20, 'tomorrow':30}
dict.fromkeys(['today', 'tomorrow'], 20) #相当于{'today':20, 'tomorrow':20}

很多字典的函数和方法与列表是一样的,因此在这里就不再赘述了。
(3)集合
Python内置了集合这一数据结构,同数学上的集合概念基本上是一致的,它与列表的区别在于:1.它的元素是不重复的,而且是无序的;2.它不支持索引。一般我们通过花括号{}或者set()函数来创建一个集合。

s = {1, 2, 2, 3} #注意2会自动去重,得到{1, 2, 3}
s = set([1, 2, 2, 3]) #同样,它将列表转换为集合,得到{1, 2, 3}

由于集合的特殊性(特别是无序性),因此集合有一些特别的运算。

a = t | s #t和s的并集
b = t & s #t和s的交集
c = t – s #求差集(项在t中,但不在s中)
d = t ^ s #对称差集(项在t或s中,但不会同时出现在二者中)

在本书中,集合并不常用,所以这里仅仅简单地介绍它,并不进行详细说明,如果读者想深入了解集合对象,请自行搜索相关教程。
(4)函数式编程
函数式编程(Functional Programming)或者函数程序设计,又称泛函编程,是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。简单来讲,函数式编程是一种“广播式”的编程,一般结合前面提到过的lambda定义函数,用于科学计算中,会显得特别简洁方便。
在Python中,函数式编程主要由几个函数的使用构成:lambda()、map()、reduce()、filter(),lambda前面已经介绍过,主要用来自定义“行内函数”,所以现在我们逐一介绍后三个。
首先介绍map()函数。假设有一个列表a=[1, 2, 3],要给列表中的每个元素都加2得到一个新列表,利用前面已经谈及过的“列表解析”,我们可以这样写:

b = [i+2 for i in a]
而利用map函数我们可以这样写:
b = map(lambda x: x+2, a)
b = list(b) #结果是[3, 4, 5]
'''

在3.x需要b = list(b)这一步,在2.x不需要这步,原因是在3.x中,map函数仅仅是创建一个待运行的命令容器,只有其他函数调用它的时候才返回结果。
'''
也就是说,我们首先定义一个函数,然后再用map()命令将函数逐一应用到(map)列表中的每个元素,最后返回一个数组。map()命令也接受多参数的函数,如map(lambda x,y: x*y, a, b)表示将a、b两个列表的元素对应相乘,把结果返回给新列表。
也许有的读者会疑问,有了列表解析,为什么还要有map()命令呢?其实列表解析虽然代码简短,但是本质上还是for命令,而Python的for命令效率并不高,而map()函数实现了相同的功能,并且效率更高,原则上来说,它的循环命令速度相当于C语言。
接着是reduce()函数。它有点像map()函数,但map()函数用于逐一遍历,而是reduce()函数用于递归计算。先给出一个例子,这个例子可以算出n的阶乘:

reduce(lambda x,y: x*y, range(1, n+1))

(注:在2.x中,上述命令可以直接运行,在3.x中,reduce函数已经被移出了全局命名空间,它被置于fuctools库中,如需使用,则要通过from fuctools import reduce引入reduce)
其中,range(1, n+1)相当于给出了一个列表,元素是1~n这n个整数。lambda x, y: x*y构造了一个二元函数,返回两个参数的乘积。reduce命令首先将列表的前两个元素作为函数的参数进行运算,然后将运算结果与第三个数字作为函数的参数,然后再将运算结果与第四个数字作为函数的参数……依此递推,直到列表结束,返回最终结果。如果用循环命令,那就要写成:

s = 1
for i in range(1, n+1):
 s = s * i

最后是filter()函数。顾名思义,它是一个过滤器,用来筛选出列表中符合条件的元素,例如,

b = filter(lambda x: x > 5 and x < 8, range(10))

b = list(b) #结果是[6, 7],在3.x需要b = list(b)这一步,在2.x不需要这步,理由同map
使用filter()函数首先需要一个返回值为bool型的函数,如上述的lambda x: x > 5 and x < 8定义了一个函数,判断x是否大于5且小于8,然后将这个函数作用到range(10)的每个元素中,如果为True,则“挑出”那个元素,最后将满足条件的所有元素组成一个列表返回。
当然,上述filter语句,可以用列表解析写为:

b = [i for i in range(10) if i > 5 and i < 8]

它并不比filter语句复杂。但是要注意,我们使用map()、reduce()或filter(),最终目的是兼顾简洁和效率,因为map()、reduce()或filter()的循环速度比Python内置的for或while循环要快得多。

2.2.4 库的导入与添加

上面我们已经讲述了Python基本平台的搭建和使用,然而在默认情况下它并不会将它所有的功能加载进来。我们需要把更多的库(或者叫作模块、包等)加载进来,甚至需要额外安装第三方的扩展库,以丰富Python的功能,实现我们的目的。
(1)库的导入
Python本身内置了很多强大的库,如数学相关的math库,可以为我们提供更加丰富复杂的数学运算:

import math

math.sin(1) #计算正弦
math.exp(1) #计算指数
math.pi #内置的圆周率常数

导入库的方法,除了使用“import 库名”之外,还可以为库起一个别名:

import math as m
m.sin(1) #计算正弦

此外,如果并不需要导入库中的所有函数,可以特别指定导入函数的名字:
from math import exp as e #只导入math库中的exp函数,并起别名e
e(1) #计算指数

sin(1) #此时sin(1)和math.sin(1)都会出错,因为没被导入
直接地导入库中的所有函数:
from math import * #直接的导入,也就是去掉math.,但如果大量地这样引入第三库,就容易引起命名冲突。

exp(1)
sin(1)

我们可以通过help('modules')命令来获得已经安装的所有模块名。
(2)导入future特征(For 2.x)
Python 2.x与3.x之间的差别不仅仅在内核上,也表现在代码的实现中。比如,在2.x中,print是作为一个语句出现的,用法为print a;但是在3.x中,它是作为函数出现的,用法为print(a)。为了保证兼容性,本书的基本代数是使用3.x的语法编写的,而使用2.x的读者,可以通过引入future特征的方式兼容代码,如,

#将print变成函数形式,即用print(a)格式输出
from future import print_function 

#3.x的3/2=1.5,3//2才等于1;2.x中3/2=1
from future import division

(3)添加第三方库
Python自带了很多库,但不一定可以满足我们的需求。就数据分析和数据挖掘而言,还需要添加一些第三方的库来拓展它的功能。这里简单介绍一下第三方库的安装,以安装数据分析工具Pandas为例。
安装第三方库一般有以下几种思路,见表2-3。

这些安装方式将在2.3节中实际展示。

时间: 2024-10-29 20:29:07

《Python数据分析与挖掘实战》一2.2 Python使用入门的相关文章

《Python数据分析与挖掘实战》一2.5 小结

2.5 小结 本章主要对Python进行简单介绍,包括软件安装.使用入门及相关注意事项和Python数据分析及挖掘相关工具箱.由于Python包含多个领域的扩展库,而且扩展库的功能也相当丰富,本章只介绍与数据分析及数据挖掘相关的一小部分,包括高维数组.数值计算.可视化.机器学习.神经网络和语言模型等.这些扩展库里面包含的函数在后续章节中会进行实例分析,通过在Python平台上完成实际案例来掌握数据分析和数据挖掘的原理,培养读者应用数据分析和挖掘技术解决实际问题的能力.

《Python数据分析与挖掘实战》一2.1 搭建Python开发平台

2.1 搭建Python开发平台 2.1.1 所要考虑的问题 Python的官网:https://www.python.org/. 搭建Python开发平台有几个问题需要考虑,第一是选择什么操作系统,是Windows还是Linux?第二是选择哪个Python版本,是2.x还是3.x? 首先,来回答后一个问题.3.x是对2.x的一个较大的更新,可以认为,Python 3.x什么都好,就是它的部分代码不兼容2.x的,这使得不少好用的库都无法支持3.x(值得庆幸的是,越来越多的主流库已经开始支持3.x

《Python数据分析与挖掘实战》一2.3 Python数据分析工具

2.3 Python数据分析工具 Python本身的数据分析功能不强,需要安装一些第三方扩展库来增强它的能力.本书用到的库有Numpy.Scipy.Matplotlib.Pandas.Scikit-Learn.Keras和Gensim等,下面将对这些库的安装和使用进行简单的介绍. 如果读者安装的是Anaconda发行版,那么它已经自带了以下库:Numpy.Scipy.Mat-plotlib.Pandas和Scikit-Learn. 本章主要是对这些库进行简单的介绍,在后面的章节中,会通过各种案例

《Python数据分析与挖掘实战》一导读

前 言 为什么要写这本书LinkedIn对全球超过3.3亿用户的工作经历和技能进行分析后得出,目前最炙手可热的25项技能中,数据挖掘排名第一.那么数据挖掘是什么?数据挖掘是从大量数据(包括文本)中挖掘出隐含的.先前未知的.对决策有潜在价值的关系.模式和趋势,并用这些知识和规则建立用于决策支持的模型,提供预测性决策支持的方法.工具和过程.数据挖掘有助于企业发现业务的趋势,揭示已知的事实,预测未知的结果,因此"数据挖掘"已成为企业保持竞争力的必要方法. 但跟国外相比,由于我国信息化程度不太

《Python数据分析与挖掘实战》一第2章 Python数据分析简介

第2章 Python数据分析简介 Python是一门简单易学且功能强大的编程语言.它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程.Python优雅的语法和动态类型,再结合它的解释性,使其在许多领域成为编写脚本或开发应用程序的理想语言. 要认识Python,首先得明确一点,Python是一门编程语言!这就意味着,原则上来说,它能够完成Matlab能够做的所有事情(因为大不了从头开始编写),而且在大多数情况下,同样功能的Python代码会比Matlab代码更加简洁.易懂:另一

《Python数据分析与挖掘实战》一3.3 Python主要数据探索函数

3.3 Python主要数据探索函数 Python中用于数据探索的库主要是Pandas(数据分析)和Matplotlib(数据可视化).其中,Pandas提供了大量的与数据探索相关的函数,这些数据探索函数可大致分为统计特征函数与统计作图函数,而作图函数依赖于Matplotlib,所以往往又会跟Matplotlib结合在一起使用.本节对Pandas中主要的统计特征函数与统计作图函数进行介绍,并举例以方便理解. 3.3.1 基本统计特征函数 统计特征函数用于计算数据的均值.方差.标准差.分位数.相关

《Python数据分析与挖掘实战》一3.1 数据质量分析

3.1 数据质量分析 数据质量分析是数据挖掘中数据准备过程的重要一环,是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础,没有可信的数据,数据挖掘构建的模型将是空中楼阁. 数据质量分析的主要任务是检查原始数据中是否存在脏数据,脏数据一般是指不符合要求,以及不能直接进行相应分析的数据.在常见的数据挖掘工作中,脏数据包括如下内容. 缺失值. 异常值. 不一致的值. 重复数据及含有特殊符号(如#.¥.*)的数据. 本小节将主要对数据中的缺失值.异常值和一致性进行分析. 3.1.1 缺失值分析

《Python数据分析与挖掘实战》一3.4 小结

3.4 小结 本章从应用的角度出发,从数据质量分析和数据特征分析两个方面对数据进行探索分析,最后介绍了Python常用的数据探索函数及用例.数据质量分析要求我们拿到数据后先检测是否存在缺失值和异常值:数据特征分析要求我们在数据挖掘建模前,通过频率分布分析.对比分析.帕累托分析.周期性分析.相关性分析等方法,对采集的样本数据的特征规律进行分析,以了解数据的规律和趋势,为数据挖掘的后续环节提供支持. 要特别说明的是,在数据可视化中,由于主要使用Pandas作为数据探索和分析的工具,因此我们介绍的作图

《Python数据分析与挖掘实战》一3.2 数据特征分析

3.2 数据特征分析 对数据进行质量分析以后,接下来可通过绘制图表.计算某些特征量等手段进行数据的特征分析. 3.2.1 分布分析 分布分析能揭示数据的分布特征和分布类型.对于定量数据,欲了解其分布形式是对称的还是非对称的,发现某些特大或特小的可疑值,可通过绘制频率分布表.绘制频率分布直方图.绘制茎叶图进行直观地分析:对于定性分类数据,可用饼图和条形图直观地显示分布情况.1.定量数据的分布分析对于定量变量而言,选择"组数"和"组宽"是做频率分布分析时最主要的问题,一