python《数据科学入门》学习笔记第二章 2018-8-17开始

昨天早晨发现新买不到一周的自行车被偷了,我的2000大洋啊,心在滴血,小偷我草你妈,去学校安保处与派出所报警也花了一上午,下午接到朋友电话,被告知那个她找了新的男朋友,生活真是日了狗了。苟延残喘。

经过三个来月的python编程,虽然能够写一些复杂的算法。但是编写速度很慢,原因是基本功不扎实,当时直接就编写算法。导致代码出错率极高。因此我又重新过一遍基础代码,看一看哪里有需要记住的地方。

参考书目:《数据科学入门》中国工信出版集团

列表

1.   比如说x=[1,2,3],我经常使用的是 x.append(_),这是加单个元素,原因是总写循环语句,符合条件的时候就加进去。其实还有两种方法,但是用的较少:

#第一种:
x.extend([4,5,6])  #这种方法就像append一样直接加入到x当中去。

#第二种:
x+[4,5,6]   #这种方法需要另一个变量对其赋值。不会直接更改x

2.   一般的赋值,比如说 x,y=[1,2],这样1赋值给x,2赋值给y。 如果你不想要前面的值  可以这么写

_,y=[1,2]
print(y)
_,_,y=[1,2,3]
print(y)

元组

昨天没写完,今天上午本来想看算法的,结果心不在焉。又找了找算法导论等等的书籍,看了一看黑客渗透技术,攻防技术的梗概,看来我还是不适合跨学科跨专业,还是好好在一亩三分地上搞数据科学吧。

元组创建的形式,有两种

tuple1=(1,2,3)   #这是最常见的元组创建方法
type(tuple1)

tuple2=1,2,3     #这个我是头一次见到,估计以后也许会不经意间出错,创建了个元组,需要注意
type(tuple2)

#又比如说这个函数,返回值就是一个元组
def sum_and_subtract(x,y):
    return (x+y),(x-y)
a=sum_and_subtract(1,2)
type(a)   #这里a就是一个元组

字典

在python中,字典有很重要的应用,比如说pandas包里面的数据框,其实有一部分用法可以从字典中借鉴。比如说用key值查询,数据框格式也可以这么查询,比如说

grade={"Jerry":90,"Tom":60}
grade["Jerry"]  #用中括号查询,这个比较常见了,不管是列表数组还是等等的都是拿中括号查询

一个新函数:dict.get("key",value)

grade={"Jerry":90,"Tom":60}
grade.get("Jerry",0)
#返回值为:90
#也就是说当某个key值存在于字典的时候,就返回那个值,
grade.get("master",0)
#返回值为:0
#当不存在某个key值得时候,返回值为0
grade.get("No One")
#什么也不返回,我觉得不可能用到这个函数

添加值和替换值都比较传统。

字典里的value与key都是必须要加“s”与括号的,其中items()是返回多组元组的

grade={"Jerry":90,"Tom":60}
#查找value值
grade.values()
#查找key值
grade.keys()
#查看匹配值
grade.items()  #返回多组元组
#对于这里面返回的元组,不能进行查询
#比如说这个方法就是错误的
grade.items()[1]  #结果报错:不支持索引值

在字典中,defaultdict函数是一个不可多得的函数,比如这样一个列表

count={"Tom","Jerry","Master","Tom","Jerry"}

我想统计每个单词出现的频次,当然可以用Counter函数来计算,但是暂时不考虑那个。我就可以用这样的代码来算

number={}
for word in count:
    if word in count:
        number[word] +=1
    else :
        number[word]=0
#当然也可以用刚学的get函数来计算
for word in count:
    number[word]=count.get(word,0)+1

这两种方法可以,但是比较麻烦,如果有一个默认值那就好了defaultdict函数就是这样能够定义一个默认值

number=defaultdict(int)   #这里由于是计数,所以选用int,如果是列表,就list等等
for word in count:
    number[word] +=1
#当然你也可以设定默认值,比如我初始的默认值设定为1
number=defaultdict(lambda :1)

这样就写好了。非常简单。至于Counter函数比较简单,就先不说了。

排序

基础的排序代码比较简单

L=[3,2,5,4,1,6,2]
sorted(L) #从小到大进行排序
sorted(L,reverse=True) #从大到小进行排序

至于按某一列为主进行排序,用的时候再说吧

列表解析

我现在才知道,我总用的这样的代码叫做列表解析

L=[x for x in range(5)]

下划线真是神器啊,我以前一直是这么写的

L=list(range(5))
#要产生与这个长度相同的0
[0 for i in range(len(L))]
#但是我可以用下划线这么写
[0 for _ in L]

迭代器

在Python中,我写代码的时候,处理大数据最头疼的就是内存占用率的问题。先开始处理大概2个g的数据的时候,跑关联规则,先开始选择了内存占用率比较高的代码,动不动空间就用完,所以这个还是比较头疼的。所以在python中,迭代器就是一种降低内存占用率的一种方法。

有两种创建迭代器的方法:

#这是第一种方法,
def create_counter(n):
    print("This is a counter")
    while True:
        yield n
        print("This is: ",n)
        n +=1
cns= create_counter(5)
print(cns)
print(next(cns))
#这是第二种方法:
(i**2 for i in range(5))

其中第一种方法利用了yield函数对每个n进行迭代。其中cns代表着一个空间,而next(cns)就是一个数。

第二种方法注意用的是小括号“()”,如果是中括号的话就相当于一个列表。

函数式工具

经过了三四天的思想斗争,心情平复了很多。做人啊,还是应该向前看。

在Python中,定义函数是最基本的,用 def 函数就可以实现。看这本书又新学了一个函数:partial。直接干代码

from functools import partial
#定义加法
def plus(a,b):
    return a+b
#定义减法
def subtraction(a,b):
    return a-b
#运用partial函数
plus1=partial(plus,5)
plus1(5)   #在这里,python默认将plus函数第一个参数赋值为5.可以从减法中看出

sub=partial(subtraction,10)
sub(5)     #结果为5

看到这我才知道map函数可以有三个变量

list(map(lambda x,y:x+y,range(5),range(5)))
#第一个参数是方程,第二和第三个参数是数字
#结果为[0,2,4,6,8]

我又看到了一个函数:filter 。这个函数感觉挺有用的。但是是第一次见。以后多用

这个函数必须设置两个参数,第一个参数是函数,用来返回是否为True的函数。第二个参数是为了给第一个参数代值的:

def is_even(x):
    return x%2==0
#这个函数返回的是True 或者False 
list(filter(is_even,[1,2,3,4]))
#结果为:[2,4]

然后我立马想到 由于is_even返回的是 正确或者错误。那么我直接定义行不行

filter([True,False,True,False],[1,2,3,4])
#返回值为<filter at 0x8f7bfd0>

然后返回值就变不回人能够理解的数字了。暂时不太懂怎么变,以后再说吧

枚举

呵,看这本书我才知道原来我一直写的不是Python风格。先开始用R,很多大牛说R风格,,,然后现在Python还有风格。。。脑阔疼

比如说这种风格,就不是Python风格

x=list(range(10))
for i in range(len(x)):
    print(i)
    print(x[i])

这样也不是Python风格

x=list(range(10))
i=0
for a in x:
    print(a)
    i+=1
    print(i)

这些都不是Python风格,只有这种的才是Python风格

x=list(range(10))
for i,a in enumerate(x):
    print(i)
    print(a)

#或者你只想要 i或者只想要a 就用下划线“_”来代替

for _,a in enumerate(x):
    print(a)

压缩和解压

经常用到zip函数,我先在才知道这个函数叫做压缩函数

一般我都是这么用的,在一个for循环当中,我想循环两个列表。这时候可以运用zip函数。

a=range(1,10,2)
b=range(0,10,2)
for i,j in zip(a,b):
    print(i+j)

书上又介绍了一个解压的方法。不过我觉得没啥用

a=range(1,10,2)
b=range(0,10,2)
c=list(zip(a,b))
#此时c的形式为[(1, 0), (3, 2), (5, 4), (7, 6), (9, 8)] 这样
#解压
d,e=zip(*c)

然后就相当于d=a,e=c了。不过我觉得没什么用,对于特定的列表,列表由元组构成的这种东西能解压。

又一种解压的方式比较不错

a=[1,2]
print(*a)  #这种方式直接将a中的元素单独列出来了

def plus(a,b):
    return a+b
plus(*a) #结果为3

但是这种方式不能直接赋值,也就是说这种方式不对:

a=[1,2]
*a   #错误
b,c=*a  #错误

也就是说 这种解压方式只能讲*a作为一个函数的参数。

最后的*args与**kwargs 比较常见

这就是《数据科学入门》第二章阅读笔记。还有很长的路要走

2018-8-20 11:10

猜你喜欢

转载自blog.csdn.net/bingfeiqiji/article/details/81784415