Python数据分析

前面

Python作为一种弱类型语言,虽身带高效开发的BUFF,但同时也有着不出众的运行性能。由于数据类型的判断是在解释器内部进行,所以对于每一个变量操作后都要重新判断数据类型,这势必增加解释器的负担。为了解决这一矛盾,同时扩充Python数据类型,numpy(以下简称np)就应运而生了。np不仅提供了诸如整数数组,线性方程、矩阵的相关数据类型,还可以进行一系列的操作运算,同时由于底层代码用C编写的,所以运行起来性能也不错。在数据分析、大数据、机器学习,神经网络方面都可以看到np的身影。在学习np之前,先来补充python的其它常用数据技巧:

数组解压

>>>list1 = [1,2,3,4,['a','b','c']]
>>>var1, var2, var3, var4, vars1 = list1
1 2 3 4 ['a', 'b', 'c', 'd']

通过上面这种方法可以使用多个变量去接收一个list(或者tuple)结构。
当然,我们知道Python可以使用星号+变量名来将多出的元素保存到一个元组中:

>>>*vars1, var1 = list
>>>vars1, var1
([1, 2, 3, 4], ['a', 'b', 'c', 'd'])

可以看出使用星号后,只会为list最后几个元素保留,其它元素都归星号的元素接收,以下写法更加明显:

>>>var1,*vars1 = list1
>>>var1,*vars1
(1, 2, 3, 4, ['a', 'b', 'c', 'd'])

继续多分配几个数组:

>>>var1,var2,var3,*vars1 = list1
>>>var1,var2,var3,vars1
(1, 2, 3, [4, ['a', 'b', 'c', 'd']])

可以看出星号所包含的变量总会在最后被分配。
这个方法有什么实用意义呢,比如有以下字符串:

'By777:20:Python:Linux:Web'

可以使用上面的方式来提取有用的信息:

>>>str = 'By777:20:Python:Linux:Web'
>>>name, age, *tools = str.split(':')

定长列表

定长列表常常用来处理消息队列,作用类似于栈,我们可以使用下面方式来很方便的使用消息队列:

>>>from collections import deque

deque可以看作list的加强版本,可以设置最大长度:

>>>d = deque(maxlen=10)
>>>for i in range(12):d.append(i)
>>>d
deque([2, 3, 4, 5, 6, 7, 8, 9, 10, 11])

可以看出第11个元素将第一个元素1压了出去。
当然我们还可以使用appendleft方法逆向压入构建逆序。

元素查找

有以下列表:

>>>list2 =list(range(5))
>>>list2
[0, 1, 2, 3, 4]

我们可以使用heapq库进行信息提取:

>>>import heapq
>>>heapq.nlargest(3,list2)
[4, 3, 2]

除此之外,我们还可以定义一个函数:

>>>def myfun(c):
>>>if c>50:
>>>    return c**0.5
>>>return c
>>>heapq.nlargest(2,list2,key=myfun)
[4, 3]

这样,将会使用list中的数以key的返回值作为判断依据。

多值映射

>>>from collections import defaultdict
>>>d = defaultdict(list)
>>>d
defaultdir(list,{})

这样我们就构建了一个默认的key对应values默认为list类型的字典
那么我们就可以继续进行赋值操作:

 >>>d['a'].append(1)
 >>>d
defaultdict(list, {'a': [1]})
……
>>>d
defaultdict(list, {'a': [1, 1, 2]})

同样,也可以定义为set类型:

>>>d_set = defaultdict(set, {})
>>>d_set['a'].add(1)
 >>>d_set
 defaultdict(set, {'a': {1}})

有序字典

>>>from collections import OrderedDict

使用有序字典的好处是的键值的顺序是按照添加的顺序进行的:

>>>od = OrderedDict()
>>>od['a'] = 1
>>>od['c'] = 3
>>>od['d'] = 2
>>>od
OrderedDict([('a', 1), ('c', 3), ('d', 2)])    

如果使用默认字典对比明显:

>>>d = {}
 >>>d['a'] = 1
 >>>d['c'] = 2
 >>>d['b'] = 3
 >>>d
{'a': 1, 'b': 3, 'c': 2}

字典运算

Python原生字典是可以进行诸如+、-、&、min、zip等运算的:
但是原生字典和OrderedDict不能直接运算:

>>>d_cm -od
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-81-3c5177967520> in <module>()
----> 1 d_cm -od
TypeError: unsupported operand type(s) for -: 'dict' and 'collections.OrderedDict'

我们要使用items方法:

>>>d_cm.items() - od.items()#只存在与d_cm不存在与od的元素
{('bar', 2), ('foo', 1), ('script', 3), ('test', 4)}
>>>d_cm.keys() & od.keys()

此外,还有一下操作:

>>>d_cm = {'bar':2,'foo':1,'script':3}
>>>min(d_cm,key=lambda k:d_cm[k])#需要通过函数
'foo'
>>>sorted (d_cm,key=lambda k
['foo', 'bar', 'script']
>>>min(zip(d_cm.values(),d_cm.keys()))
(1, 'foo')
    原文作者:by777
    原文地址: https://segmentfault.com/a/1190000010892609
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞