python DataScience数据分析笔记day01

day01------数据分析简介-numpy入门与基础-数据可视化------
    python人工智能学习的两个阶段 
        第一阶段:数据分析简介
            matlab+C/C++
            Numpy/Scipy/Matplotlib/Pandas/sklearn/tensorflow/...
                Numpy:基础数值算法
                Scipy:科学计算,如桥梁测试,卫星轨道,电子行业等
                Matplotlib:数据可视化工具,可视化处理Numpy/Scipy的数据
                Pandas:序列高级处理函数,封装了Numpy/Scipy/Matplotlib,金融行业应用较多
        第二阶段:机器学习
                数据预处理
                选择模型
                训练模型
                验证模型/预测模型
    一、numpy入门
        1.numpy是什么?
            1)numpy是Numerical Python的缩写,意为“数值的Python”,补充了python所欠缺的数值计算能力。
            2)numpy是一整套开源科学计算库。(GPL,要求都开源  LGPL,用开源开发,之后可以收费)
            3)numpy弥补了作为通用编程语言的Python在数值计算方面,能力弱、速度慢的不足。
            4)numpy拥有丰富的数学函数、强大的多维数组和优异的运算能力。
            5)numpy与scipy、scikits、matplotlib等其它科学计算库可以很好地协调工作。
            6)numpy可取代matlab和mathematica的功能,并允许用户进行快速交互式原型开发。
            7)是其他数据分析及机器学习库的底层库
            8)是完全标准的C语言实现,运行效率充分优化,不逊于其他编译语言,如Java等
        2.Numpy的历史背景
            1)1995年,numeric,早期的python语言数值计算库,如今已废弃;
            2)2001年,scipy项目启动,所需要的新特性高维数组被实现于numarray(多维数值运算)中;
            3)2005年,重构numeric,意图将numarray中的新特性整合到numeric中;
            4)2006年,Numpy独立于scipy正式发布,同时拥有numeric和numarray的全部特性。(Ver. 1.13)
        3.Numpy的核心:多维数值
            1)代码简洁:同样的计算任务,使用Numpy比纯python代码少得多;
            2)存储效率和I/O性能远胜于python;
            3)Numpy底层实现:厚内核(C)+薄接口(python),使用C语言甚至汇编语言,保证性能,运行速度达到极限;
                演示代码:vector.py
                    import datetime as dt
                    import numpy as np
                    n = 100000
                    start = dt.datetime.now()
                    A , B = [],[]
                    for i in range(n):
                            A.append(i ** 2)
                            B.append(i ** 3)
                    C = []
                    for a,b in zip(A,B):
                            C.append(a + b )
                    end = dt.datetime.now()
                    print((end - start).microseconds)
                    #302827 , 338806

                    start = dt.datetime.now()
                    A , B = np.arange(n) ** 2 , np.arange(n) ** 3
                    C = A + B
                    end = dt.datetime.now()
                    print((end - start).microseconds)
                    #10993, 8993
            4)Numpy是完全开源的,成本低且没有法律风险。
        4.Numpy的局限性
            1)内置数据结构的通用性不及python,在科学计算以外的领域,Numpy的优势并不明显;
            2)Numpy的模块是用C语言编写的,不支持jython。
        5.Numpy的安装
            1)在线安装
                python -m pip install numpy -- 安装纯numpy
                numpy+mkl (Intel (R) Math Kernel Library)
            2)离线安装
                numpy-1.13.3+mkl-cp36-cp36m-win_amd64.whl
                scipy-0.19.1-cp36-cp36m-win_amd64.whl
                matplotlib-2.0.2-cp36-cp36m-win_amd64.whl
        6.numpy核心——多维数组
            代码:vector_sum.py
    二、numpy基础
        1.数组对象
            1)numpy的数组是numpy.ndarray类型的对象,其中包括实际数据(即数组中的元素),
                以及描述这些数据的元数据(描述数组中元素),
                大部分针对数组的操作实际上仅仅是针对其元数据的操作,以此提升性能。
                将实际数据和元数据分开存放,一方面提高了内存空间的使用效率
                另一方面减少对实际数据的访问频率,提高性能
            2)numpy数组的元素必须是同质的,即类型完全一致。
            3)numpy数组的下标从0开始,最后一个元素的下标是数组长度减1。
            4)numpy数组对象的dtype属性表示元素的数据类型。
            5)numpy数组对象的shape属性表示数组的维度,通过一个tuple表现,
                其中的每一个元素即相应维度的大小。
            6)numpy数组对象的size属性表示数组的大小.
            7)创建数据的方法:
                numpy.arange(起始(默认为0), 终止, 步长(默认为1)): 
                    获得一个数组形式等差序列
                numpy.array([元素1, 元素2, ...]): 
                    获得一个包含给定元素的数组对象-->任意维度,任意类型
        2.下标访问,索引号访问
            一维数组[索引号]
            二维数组[行号,列号]
            三维数组[页号,行号,列号]
            多维数组[...,页号,行号,列号]
            数组对象.shape()-->得到(...,页数,行数,列数)
            下标值范围 =(0, 维度数值-1)
            代码:shape.py
        3.数据类型
            1)python的内置类型
                布尔型bool
                整型int
                浮点型float
                复数型complex
                字符型str
                元组tuple
                列表list
                字典dict
                聚合set
            2)numpy的内置类型
                布尔型bool_,1个字节
                整型int:
                    有符号整型:int8/int16/int32/int64
                    无符号整型:uint8/uint16/uint32/uint64
                浮点型float:float16/float32/float64
                复数型complex:
                    complex64 / complex128
                    (实部,虚部)
                    如一个人的身高体重,实部可为身高,虚部为体重
                字符型str_:每个字符都是用32位Unicode编码表示
            3)自定义类型
                示例一:
                    #以下是一个自定义类型,()中为一个元素整体,
                    # dtype指明元素内的构成情况:u3,表示3个unicode字符,3i4,表示3个4字节整型
                    #访问自定义类型元素内的值,用带引号的f+ 元素内部下标方式进行,如:['f0' ]
                    a = np.array([('abc',[1,2,3])],dtype='U3,3i4')
                    print(a[0]['f0'],a[0]['f1']) #得到abc, [1 2 3]
                示例二:
                    #可在dtype中指定名称,数据类型,长度,如dtype=[('fa',np.str_,3),('fb',np.int32,3)])
                    #其中('abc名称',np.str_,3),表示abc对应的字段名为'fa',数据类型为str,有3个字符数
                    #('fb',np.int32,3),表示[1,2,3]对应的字段名为'fb',数据类型为int32,有三个元素
                    #与上例比,多了名称标识。其中i4就是int32
                    #访问时,直接通过字段名访问
                    b = np.array([('abc',[1,2,3])],
                                             dtype=[('fa',np.str_,3),('fb',np.int32,3)])
                    print(b[0]['fa'],b[0]['fb']) #得到abc, [1 2 3]
                示例三:
                    #dtype也可用字典方式指定
                    #dtype={'names':['fa','fb'],'formats':['U3','3i4']} 注意:U为大写
                    #'names':['fa','fb'],表示对应的字段名,注意:names不可修改
                    #'formats':['u3','3i4'],表示对应的数据类型和元素数量,注意:formats不可修改
                    c = np.array([('abc',[1,2,3])],
                                             dtype={'names':['fa','fb'],'formats':['U3','3i4']})
                    print(c[0]['fa'],c[0]['fb'],c.itemsize) #得到abc, [1 2 3],24
                示例四:
                    #dtype可通过内存长度偏移量表示
                    #'fa':('U3',0),直接命名'fa',从d的第0个字节开始设置为U3类型
                    #'fb':('3i4',16),直接命名'fa',从d的第16个字节开始设置为3i4类型
                    #如果fb的偏移量大于fa的字节数,则中间会空余内存
                    #空余内存可用于空间对齐,优化访问效率,但会浪费空间
                    d = np.array([('abc',[1,2,3])],
                                             dtype={'fa':('U3',0),'fb':('3i4',16)})
                    print(d[0]['fa'],d[0]['fb'],d.itemsize) #得到abc, [1 2 3],28
                示例五:
                    #dtype可对一个内存块进行描述
                    #dtype=('u2',{'lowId':('u1',0),'highId':('u1',1)}))
                    #'u2',表示将'0x1234'看成为一个2字节整体。因为'0x1234'本身就表示一个2字节的地址。
                    #{'lowId':('u1',0),'highId':('u1',1)},表示按照另一种类型表示。
                    #'lowId'为命名,'u1'表示uint8,0表示字节偏移量
                    e = np.array([0x1234],
                                             dtype=('u2',{'lowId':('u1',0),'highId':('u1',1)}))
                    print('{:x}'.format(e[0]))#{:x},16进制输出为1234
                    print(e[0],e['lowId'][0],e['highId'][0])#输出4660 52 18
                    print('{:x},{:x},{:x}'.format(e[0],e['lowId'][0],e['highId'][0]))#输出为1234,34,12
                注意:需要统一字节序,如不统一,会导致不同机器出现不同结构
                            >,表示大端字节序 
                            <,表示小端字节序
                            =,与默认值一样,同硬件有关,与操作系统无关
                                一般intel,为小端字节序
                                arm,ibm等,为大端字节序
                            如,本例中
                                dtype=('<u2',{'lowId':('<u1',0),'highId':('<u1',1)})
                                则输出:1234,34,12
                                dtype=('>u2',{'lowId':('>u1',0),'highId':('>u1',1)})
                                则输出:1234,12,34
            4)numpy的类型字符码
                布尔:?
                有符号字节:b
                无符号字节:B
                整型:
                    int8/16/32/64: i1/i2/i4/i8
                无符号整型:
                    uint8/16/32/64: u1/u2/u4/u8
                浮点:
                    float16/32/64: f2/f4/f8
                复数:
                    complex64/128: c8/c16
                时间增量:m
                日期时间datetime:M8
                日期类型:M8[D],D以日为单位
                Python对象:O
                字节序列形式的字符串:S或a
                Unicode字符串str_:Ux,x为字符数
                空类型:V
                字节序前缀:仅用于多字节整数和字符串
                                        大端(高位低址):>,小端(高位高址):<
                                            自动(自动匹配硬件字节序):=
                一个完整的字符类型码表示:
                    <字节序前缀><维度><类型><字节数或字符数>
                    如:>3i4,表示大端字节序,3个元素的一维数组,
                                        每个元素都是整型,每个元素都占4个字节
                            <(2,3)u8,表示小端字节序,6个元素的二维数组,2行,3列
                                        每个元素都是无符号整型,每个元素占8个字节
                            >U7,表示7个字符的大端Unicode字符串,每个字符4个字节
        4.切片
            数据对象[起始位置:终止位置:位置步长,...]
                缺省起始位置:如果步长为正,缺省为0,首;如果步长为负,缺省为-1,尾
                缺省终止位置:如果步长为正,尾后;如果步长为负,首前
                缺省位置步长:1
            代码:slice.py
        5.改变维度
            1)视图变维,返回新的数组对象,与原数组数据共享
                a = numpy.arange(1,  7) # [1 2 3 4 5 6]
                b = a.reshape(2, 3) # [[1 2 3]    把a变为2行,3列的二维数组
                                                        #   [4 5 6]]
                c = b.reshare (6) # [1 2 3 4 5 6] 把b变为一维
                d = b.ravel () # [1 2 3 4 5 6] ,把任意维变为一维
            2)复制变维,返回新的数组对象,与原数组的数据独立
                e = b.flatten () # [1 2 3 4 5 6]
            3)就地变维,直接改变原数组维度,不返回新数组
                a.shape = (2, 3) # [[1 2 3] 
                                                #   [4 5 6]]
                a.resize ((3, 2))
            4)视图转置
                代码:reshape.py
        6.组合
            1)垂直组合
                v = numpy.vstack((u, d))
                    [u]上部的数组
                    [d]下部的数组
                v = numpy.concatenate((上, 下),axis = 0)
                    axis = x axis表示轴向,即按什么方向组合,与维度索引一致
                        二维数组:0-行,垂直,1-列,水平
                        三维数组:0-页,深度,1-行,垂直,2-列,水平
            2)水平组合
                numpy.hstack ((左,右))
                h = numpy.hstack ((1, r))
                numpy.concatenate((左,右),axis = 1)
                [l][r]
            3)深度组合
                numpy.dstack ((前,后))
            4)行组合
                r = numpy.row_stack ((u, d))
                u: [1 2 3]
                d: [4 5 6]
                r :[[1 2 3]
                         [4 5 6]]
            5)列组合
                c = numpy.column_stack ((l, r))
                l: [1 2 3]
                r: [4 5 6]
                c: [[1 4]
                         [2 5]
                         [3 6]]
        7.拆分/分割
            1)垂直分割
                u, m, d = numpy.vsplit (v, 3) #v要拆分的数组,3表示要拆分的份数
                等价于:
                numpy.split(v,3,axis = 0)
            2)水平分割
                l, m, r = numpy.hsplit(h, 3)
                numpy.split(数组,份数,axis = 1)
            3)深度分隔
                x, y = numpy.dsplit (数组, 份数)
            代码:stack.py
        8.numpy.ndarray类的主要属性汇总
                import numpy as np
                arange:arr = np.arange(1,4) #创建一个一维数组
                array:arr = np.array([np.arange(1,4),
                                        np.arange(4,7),
                                        np.arange(7,10)]) #创建一个二维数组(3行,3列)
                    arr = np.array([[1,5,3],[4,5,6]]) #创建一个二维数组(2行,3列)
                shape:arr.shape  #获得数组的维度情况(行数,列数)
                dtype:arr.dtype  #显示数组的数据类型
                size:arr.size   #数组的大小,即元素的个数
                reshape:arr.reshape() #将数组转换为指定维度格式
                    arr = np.arange(1,25).reshape((2,3,4)) #将一个一维数组转换为3维数组
                arr.itemsize:arr.itemsize,每个元素的字节数
                arr.ndim - 维数
                arr.nbytes - 数组的总字节数,= size * itemsize
                arr.T - 转置视图
                arr.real - 复数数组的实部数组
                arr.imag - 复数数组的虚部数组
                arr.flat - 扁平迭代器
                arr.tolist() - 转化为python列表
            代码:attr.py
    三、数据可视化Matplotlib
            Matlab 商业工具,可以对算法测试
            python + Numpy + Matplotlib 可完全替换Matlab
        1、基本绘图
            mp.plot(水平坐标,垂直坐标)
            示例一:
                import numpy as np
                import matplotlib.pyplot as mp
                x = np.linspace(-np.pi,np.pi,1000)
                cos_y = np.cos(x) / 2
                sin_y = np.sin(x)
                mp.plot(x,cos_y)
                mp.plot(x,sin_y)
                mp.show()
        2、线型、线宽和颜色
            mp.plot(水平坐标,垂直坐标,linestyle=线型,linewidth=线宽,color=颜色,...)
            linestyle='--' 虚线 / ':' 点线
            linewidth= 2 默认为2,线的粗细
            示例:
                import numpy as np
                import matplotlib.pyplot as mp
                x = np.linspace(-np.pi,np.pi,1000)
                cos_y = np.cos(x) / 2
                sin_y = np.sin(x)
                mp.plot(x,cos_y,linestyle='--',linewidth= 1 ,color = 'green') # -- 为虚线
                mp.plot(x,sin_y,linestyle=':', linewidth = 4,color='blue') # : 为点线
                mp.show()

猜你喜欢

转载自blog.csdn.net/pinecn/article/details/89531477