<数据分析>Numpy和pandas学习

0.前言

  • NumPy是什么?Numerical Python(数值型Python)
    • 一个开源的Python科学计算库
  • 使用NumPy可以干什么?
    • 可以使用数组和矩阵
    • 一些数学函数
      • 线性代数运算
      • 傅里叶变换
      • 随机数的生成  
  • NumPy的由来:1995年提出--2001年启动---2005正式整合--2006年发布1.0版本。
  • 为什么使用NumPy?可以直接操作数组和矩阵,编写起来更轻松,且数学函数众多。
  • NumPy中数组的存储效率和输入输出性能均远远优于Python中等价的基本数据结构(如嵌套的list容器),只是通用性没有原生的Python容器好。
  • NumPy的大部分代码都是用C语言写成的,这使得NumPy比纯Python代码高效得多。
  • 局限性:Jython运行在Java虚拟机上,无法调用NumPy,因为大部分NumPy模块是用C语言实现的。
  • 支持的数据类型
    •   

1.科学计算工具Numpy

  • 例子1:向量加法(数学上的一位数组)
    • 题目:向量a是0-n的整数的平方、向量b是0-n的整数的立方---->n=3  a:0、1、4   b:0、1、8
    • python的写法
      • def pythonsum(n):
            a = [i for i in range(n)]
            b = [i for i in range(n)]
            c = []
            for i in range(len(a)):
                a[i] = i ** 2
                b[i] = i ** 3
                c.append(a[i] + b[i])
            return c
        
        
        c = pythonsum(1000)
        print(c)
    • Numpy的写法

      • import numpy as np
        
        
        def numpysum(n):
            a = np.arange(n) ** 2
            b = np.arange(n) ** 3
            c = a + b
            return c
        
        
        c2 = numpysum(1000)
  • 1、ndarray 多维数组(N Dimension Array)

    • ndarray的下标从0开始,且数组里的所有元素必须是相同类型

    • ndarray拥有的属性

      • ndim属性:维度个数

      • shape属性:维度大小
      • dtype属性:数据类型    

    • 例子:ndarray随机创建用来生成随机数据
      • # 1.导入numpy,别名np
        import numpy as np
        
        # 2.生成指定维度大小的随机多维浮点型数据(3行4列)
        arr = np.random.rand(3, 4)
        # <class 'numpy.ndarray'>
        print(arr, type(arr))
        # 3.生成指定维度大小(3行4列)的随机多维整型数据(二维),randint()可以指定区间(-1, 5)
        arr1 = np.random.randint(-1, 5, size=(3, 4))  # 'size='可省略
        print(arr1, type(arr1))
        # 4.生成指定维度大小(3行4列)的随机多维浮点型数据(二维),uniform()可以指定区间(-1, 5)
        arr2 = np.random.uniform(-1, 5, size=(3, 4))
        print(arr2, type(arr2))
        # 5.三个属性:维度个数、维度大小、数据类型
        print(
            '维度个数(几维):', arr.ndim,
            '维度大小(几行几列):', arr.shape,
            '数据类型:', arr.dtype,
        )
  • ndarray的序列创建

    • import numpy as np
      
      # 1.np.array(collection)
      # collection 为 序列型对象(list)、嵌套序列对象(list of list)。
      lis = range(10)
      lis_lis = [range(10), range(10)]
      arr = np.array(lis)
      arr_arr = np.array(lis_lis)
      print(arr, arr_arr, type(arr), type(arr_arr))
      print(arr.ndim, arr.shape)
      print(arr_arr.ndim, arr_arr.shape)
      # 2.np.zeros 指定大小的全0数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。
      lis1 = np.zeros((3, 4))
      print(lis1)
      # 3.np.ones() 指定大小的全1数组。注意:第一个参数是元组,用来指定大小,如(3, 4)。
      lis2 = np.ones((3, 4))
      print(lis2)
      # 4.np.empty()  初始化数组,不是总是返回全0,有时返回的是未初始的随机值(内存里的随机值)。
      # np.empty 指定数据类型
      lis3 = np.empty((3, 4), int)
      print(lis3)
      # 5.np.arange() 和 reshape()
      # arange() 类似 python 的 range() ,创建一个一维 ndarray 数组。
      lis4 = np.arange(15)
      print(lis4)
      # reshape() 将重新调整数组的维数。
      lis5 = lis4.reshape(3, 5)
      print(lis5)
      lis6 = lis4.reshape(1, 3, 5)
      print(lis6)
      # 6.ndarray的数据类型 dtype参数和astype方法
      # 初始化3行4列数组,数据类型为float64
      lis7 = np.zeros((3, 4), dtype=np.float64)
      print(lis7)
      # astype转换数据类型,将已有的数组的数据类型转换为int32
      lis8 = lis7.astype(np.int32)
      print(lis8)
  • ndarray的矩阵运算

    • import numpy as np
      
      # 1.矢量运算:相同大小的数组间运算应用在元素上
      # 数组内元素相乘
      lis = np.array([[1, 2, 3],
                      [4, 5, 6]])
      # 表示所有元素按索引对应相乘
      lis1 = lis * lis
      print(lis1)
      
      # 矩阵相加
      lis2 = lis + lis
      print(lis2)
      
      # 2.矢量和标量运算:"广播" - 将标量"广播"到各个元素
      # 1除以lis内每个元素
      lis3 = 1. / lis
      # 2乘以lis内每个元素
      lis4 = 2. * lis
      print(lis3)
      print(lis4)
      
      # 3.ndarray的索引与切片
      #  一维数组的索引和切片,同list
      
      lis5 = np.arange(10)
      print(lis5[2:5])
      
      # 多维数组的索引和切片
      
      lis6 = np.arange(12).reshape(3, 4)
      print(lis6[1])
      print(lis6[0:2, 2:])  # 逗号前面代表维度,逗号后面代表每个维度的切片
      print(lis6[:, 1:3])
      
      # 条件索引
      # 注意,多个条件组合要使用 & | 连接,而不是Python的 and or。
      lis7 = np.random.rand(3, 3)
      year_lis7 = np.array([[2000, 2001, 2000],
                            [2005, 2002, 2009],
                            [2001, 2003, 2010]])
      is_year_after_2005 = year_lis7 >= 2005  # 如果满足条件就返回True,反之False
      print(is_year_after_2005)
      filterd_arr = year_lis7[is_year_after_2005]
      # 直接写条件也一样
      filterd_arr1 = year_lis7[year_lis7 >= 2005]
      
      print(filterd_arr)
      print(filterd_arr1)
      
      # 多个条件
      filterd_arr2 = year_lis7[(year_lis7 <= 2005) & (year_lis7 % 2 == 0)]
      print(filterd_arr2)
      
      # 4.ndarray的维数转换:数组的转置
      # 二维数组直接使用转换函数:transpose()
      lis8 = np.random.rand(2, 3)
      print(lis8)
      print(lis8.transpose())
      # 多维
      lis9 = np.random.rand(2, 3, 4) # 2x3x4 数组,2对应0,3对应1,4对应3
      print(lis9)
      print(lis9.transpose((1, 0, 2))) # 根据维度编号,转为为 3x2x4 数组
  • ndarray的元素处理

    • import numpy as np
      
      # 1.元素计算函数
      # randn()返回具有标准正态分布的序列
      lis = np.random.randn(2, 3)
      print(lis)
      
      # 向上取整
      print(np.ceil(lis))
      # 向下取整
      print(np.floor(lis))
      # 四舍五入 -0.5 变成 -1
      print(np.rint(lis))
      # 判断元素是否不是一个数字:是数字False 不是Ture  Not a Number
      print(np.isnan(lis))
      # 元素相乘:对应元素相乘
      print(np.multiply(lis, lis))
      # 元素相除
      print(np.divide(lis, lis))
      # 元素的绝对值
      print(np.abs(lis))
      # 元素操作的三元运算符  三元运算符,x if condition else y
      print(np.where(lis > 0, 1, -1))
      
      # 2.元素统计函数
      # 所有元素的平均值
      print(np.mean(lis))
      # 所有元素的和
      print(np.sum(lis))
      # 按照行统计
      print(np.sum(lis, axis=1))
      # 按照列统计
      print(np.sum(lis, axis=0))
      # 所有元素的最大值和最小值
      print(np.max(lis))
      print(np.min(lis))
      # 所有元素的标准差和方差
      print(np.std(lis))
      print(np.var(lis))
      # 最大下标索引和最小下标索引
      print(np.argmax(lis))
      print(np.argmin(lis))
      # 返回一个一维数组,每个元素都是之前所有元素的 累加和 和 累乘积,
      print(np.cumsum(lis))
      print(np.cumprod(lis))
      
      # 3.元素判断函数
      # 至少有一个元素满足返回Ture,  OR
      print(np.any(lis > 0))
      # 所有元素满足才返回Ture, AND
      print(np.all(lis > 0))
      
      # 4.元素去重排序函数
      # 找到唯一值并返回排序结果
      arr = np.array([[1, 2, 1], [2, 3, 4]])
      print(arr)
      
      print(np.unique(arr))

02.数据分析工具Pandas 

  • 什么是Pandas? Pandas的名称来自于面板数据(panel data)和Python数据分析(data analysis)。
    • Pandas是一个强大的分析结构化数据的工具集,基于NumPy构建,提供了 高级数据结构 和 数据操作工具,它是使Python成为强大而高效的数据分析环境的重要因素之一。 

  • Pandas能做什么?
    • 一个强大的分析和操作大型结构化数据集所需的工具集

    • 基础是NumPy,提供了高性能矩阵的运算

    • 提供了大量能够快速便捷地处理数据的函数和方法

    • 应用于数据挖掘,数据分析

    • 提供数据清洗功能

  • Pandas的数据结构
    • Pandas有两个数据结构:Series 和 DataFrame

    • Series 类似链表,索引在前,数据在后

      •   

                

                   

posted @ 2020-08-18 14:02  水墨黑  阅读(252)  评论(0编辑  收藏  举报