数据挖掘基础学习笔记

文章目录

    • 一、数据挖掘基础
      • 1.1、数据挖掘基础环境安装
      • 1.2、Jupyter Notebook
        • 1.2.1、介绍
        • 1.2.2、快速使用
    • 二、Matplotlib画图
      • 2.1、Matplotlib简介
      • 2.2、Matplotlib三层结构
      • 2.3、折线图
        • 2.3.1、折线图绘制与保存图片
        • 2.3.2、完善原始折线图1(辅助显示层)
        • 2.3.3、完善原始折线图2(图像层)
        • 2.3.4、多个坐标系显示-plt.subplots(面向对象的画图方法)
        • 2.3.5、折线图的应用场景
      • 2.4、散点图
        • 2.4.1、常见图形虫类及意义
        • 2.4.2、散点图绘制
      • 2.5、柱状图
        • 2.5.1、柱状图绘制
      • 2.6、直方图
        • 2.6.1、直方图介绍
        • 2.6.2、直方图绘制
        • 2.6.3、直方图的应用场景
      • 2.7、饼图
        • 2.7.1、饼图绘制
      • 2.8、小结
    • 三、Numpy
      • 3.1、Numpy介绍
        • 3.1.1、Numpy是什么
        • 3.1.2、ndarray介绍
        • 3.1.3、ndarray属性
        • 3.1.4、基本操作
        • 3.1.5、ndarray运算
        • 3.1.6、其他
    • 四、Pandas
      • 4.1、基础处理
        • 4.1.1、Pandas简介
          • 4.1.1.1、什么是Pandas
          • 4.1.1.2、问什么使用Pandas
        • 4.1.2、核心数据结构
        • 4.1.3、基本操作
          • 4.1.3.1、索引操作
          • 4.1.3.2、赋值操作
          • 4.1.3.3、排序
        • 4.1.4、运算
        • 4.1.5、画图
        • 4.1.6、文件的读取与存储
          • 4.1.6.1、CSV
          • 4.1.6.2、HDF5
          • 4.1.6.3、JSON
      • 4.2、高级处理
        • 4.2.1、缺失值处理
          • 4.2.1.1、如何处理缺失值
        • 4.2.2、数据离散化
          • 4.2.2.1、什么是数据的离散化
          • 4.2.2.2、为什么要离散化
          • 4.2.2.3、如何实现数据的离散化
        • 4.2.3、合并
        • 4.2.4、交叉表与透视表
        • 4.2.5、分组与聚合
        • 4.2.6、综合案例

一、数据挖掘基础

1.1、数据挖掘基础环境安装

  • 虚拟环境创建
# 使用conda创建新的虚拟环境
  • 导入包
# requirements.txt
matplotlib==2.2.2
numpy==1.14.2
pandas==0.20.3
TA-Lib==0.4.16 # 技术指标库
tables==3.4.2 # hdf5
jupyter==1.0.0 # 数据分析与展示的平台
# 执行命令 pip install -r requirements.txt
# pip list 查看已安装列表
# TA-Lib安装报错,https://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib 下载

1.2、Jupyter Notebook

1.2.1、介绍

  • 一个支持跨所有编程语言的交互式数据科学计算工具

    • web版的ipython

    • 编程、写文档、记笔记、展示

    • .ipynb文件格式

    • 交互式运行环境

  • 为什么使用Jupyter Notebook

    • 画图方面的优势
    • 数据展示方面的优势

1.2.2、快速使用

  • 启动Jupyter Notebook

    # 在终端输入 jupyter notebook 或者ipython notebook
    
  • 创建文件

    主页页面右上角News-Python3

  • 运行代码快捷键

    Shift+Enter

  • Cell

    • cell是指一对In Out会话被视作一个代码单元
  • 两种模式

    • 编辑模式
      • enter
      • 鼠标点击输入框
    • 命令模式
      • 编辑模式下ESC
      • 鼠标点击单元格之外
  • 常用快捷键

    • Shift+Enter 执行本单元代码,并跳转到下一单元

    • Ctrl+Enter 执行本单元代码,留在本单元

    • 命令模式下

      • A:在当前cell的上面添加cell
      • B:在当前cell的下面添加cell
      • 双击D:删除当前cell
    • 编辑模式下

      • 回退、重做、不全、注释与其他编译器类似
      • 多光标操作:Ctrl + 点击鼠标
    • cell行号前*,代表当前代码正在运行

二、Matplotlib画图

2.1、Matplotlib简介

  • 什么是Matplotlib

    • Matplotlib专门用来开发2D图表(包括3D图表)

    • 使用起来及其简单

    • 以渐进、交互式方式实现数据可视化

    • matploltlib :画二维图表的python库

      • mat - matrix 矩阵
      • plot 画图
      • lib 库
    • matlab 矩阵实验室

      • mat -matrix
      • lab 实验室
  • 为什么要学习Matplotlib

    • 数据可视化
      • 可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法
        • 能将数据进行可视化,更直观的呈现
        • 是数据更客观、更具说服力
    • 更炫酷的可视化
      • D3
        • https://d3js.org/
      • 百度 echarts
  • Matplotlib快速上手

    import matplotlib.pylab as plt
    %matplotlib inline
    plt.figure() # 画布
    plt.plot([1,0,9], [4,5,6]) #([x1,x2,x3],[y1,y2,y3])
    plt.show() # 展示
    

2.2、Matplotlib三层结构

  • 容器层
    • 画板层(Canvas)
    • 画布(Figure):plt.figure()
    • 绘图区(坐标系):plt.subplots()
  • 辅助显示层
  • 图像层

2.3、折线图

2.3.1、折线图绘制与保存图片

  • matplotlib.pyplot模块

    import matplotlib.pylab as plt
    
  • 折线图的绘制与显示

    # 展示上海一周的天气
    # 创建画布
    plt.figure()
    # 绘制图像
    plt.plot([1,2,3,4,5,6,7],[17,17,18,15,11,11,12])
    # 显示图像
    plt.show()
    
  • 设置画布属性

    plt.figure(figsize(), dpi=) 
    # figsize:指定图的长宽
    # dpi:图像的清晰度
    # 返回fig对象
    # 例:plt.figure(figsize=(20,8),dpi=80)
    
  • 图片保存

    # plt.savefig("test.png")
    # 保存图片需要在show()之前
    

2.3.2、完善原始折线图1(辅助显示层)

  • 准备初始折线图

    # 需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度
    # 准备数据 x,y
    import random
    x = range(60)
    y_sh = [random.uniform(15,18) for i in x]
    plt.figure(figsize=(20,8),dpi=80)
    plt.plot(x,y_sh)
    plt.show()
    
  • 添加自定义刻度

    plt.xticks(x, **kwargs)
    plt.yticks(y, **kwargs)
    # x,y: 要显示的刻度值
    # 例如
    # 修改x轴刻度值
    x_label = ["11点{}分".format(i) for i in x]
    plt.xticks(x[::5], x_label[::5])
    # 修改y轴刻度值
    plt.yticks(range(0,40,5))
    
  • 添加网格显示

    # 添加网格显示
    plt.grid(True, linestyle="--", alpha=0.5)
    # grid(是否添加网格,linestyle风格 -- 虚线,透明度)
    
  • 添加描述信息

    # 添加描述信息
    plt.xlabel("时间变化")
    plt.ylabel("温度变化")
    plt.title("某城市温度变化情况图")
    
  • 中文不显示问题

    • 原因:matplotlib不包含中文字体

    • 解决:

      • 安装字体

      • 删除mapplotlib缓存文件

      • 配置文件

        • 查看配置文件路径

          import matplotlib
          matplotlib.matplotlib_fname()
          
        • # 配置文件增加内容
          font.family   :  Microsoft YaHei, sans-serif
          font.serif: Microsoft YaHei, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
          
        • # C:\Windows\Fonts\Microsoft YaHei UI下的字体 复制到
          # matplotlib根目录\mpl-data\fonts\ttf
          

2.3.3、完善原始折线图2(图像层)

  • 多个plot

    # 添加一个城市的温度变化
    # y轴数据
    y_bj = [random.uniform(1,3) for i in x]
    # 添加图像
    plt.plot(x, y_bj)
    
  • 修改图像

    # color 颜色
    # linestyle 风格
    plt.plot(x, y_bj, color = "b", linestyle="--")
    
    颜色字符 风格字符
    r 红色 - 实线
    g 绿色 – 虚线
    b 蓝色 -. 点划线
    w 白色 : 点虚线
    c 青色 ’ ’ 留空、空格
    m 洋红
    y 黄色
    k 黑色
  • 图例

    plt.plot(x, y_bj, color = "b", linestyle="--", label = "北京")
    # 显示图例
    plt.legend()
    

2.3.4、多个坐标系显示-plt.subplots(面向对象的画图方法)

  • subplots函数

    figure, axes = plt.subplots(nrows=1,ncols=2,**fig_kw)
    axes[0] # 第一个
    axes[1] # 第二个
    
# 需求:画出某城市11点到12点1小时内每分钟的温度变化折线图,温度范围在15度~18度
# 准备数据 x,y
import random

x = range(60)
y_sh = [random.uniform(15,18) for i in x]
y_bj = [random.uniform(1,3) for i in x]

# 画布
# plt.figure(figsize=(20,8),dpi=80)
figure, axes = plt.subplots(nrows=1,ncols=2,figsize=(20, 8), dpi=80)

axes[0].plot(x,y_sh, label="上海")
axes[1].plot(x, y_bj, color = "b", linestyle="--", label = "北京")

# 修改x轴刻度值
x_label = ["11点{}分".format(i) for i in x]
axes[0].set_xticks(x[::5], x_label[::5])
# 修改y轴刻度值
axes[0].set_yticks(range(0,40,5))

axes[1].set_xticks(x[::5], x_label[::5])
axes[1].set_yticks(range(0,40,5))

# 添加网格显示
axes[0].grid(True, linestyle="--", alpha=0.5)
axes[1].grid(True, linestyle="--", alpha=0.5)

# 添加描述信息
axes[0].set_xlabel("时间变化")
axes[0].set_ylabel("温度变化")
axes[0].set_title("上海温度变化情况图")

axes[1].set_xlabel("时间变化")
axes[1].set_ylabel("温度变化")
axes[1].set_title("北京温度变化情况图")

# 显示图例
plt.legend()

plt.show()

2.3.5、折线图的应用场景

  • 呈现公司产品(不同区域)每天活跃用户数

  • 呈现app每天下载量

  • 呈现产品新功能上线后,用户点击次数随着时间的变化

  • 拓展:画各种数学函数图像

    import matplotlib.pylab as plt
    import numpy as np
    # 准备x,y数据
    x = np.linspace(-10,10,1000) # 生成-1到1之间等距离的1000个数据
    y = np.sin(x)
    plt.figure(figsize=(20,8),dpi=80)
    plt.plot(x,y)
    plt.grid(linestyle='--')
    plt.show()
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CvxvxlQg-1661236390017)(.\image\sin函数曲线.png)]

2.4、散点图

2.4.1、常见图形虫类及意义

  • 折线图(plot)
    • 以折线的上升或下降来表示统计数量的增减变化的统计图
    • 特点:能够显示数据的变化趋势,反应事物的变化情况(变化)
  • 散点图(scatter)
    • 用两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式
    • 特点:判断变量之间是否存在数量的关联趋势,展示离群点(分布规律)
  • 柱状图(bar)
    • 排列在工作表的列或行中的数据可以绘制到柱状图中
    • 特点:绘制连离散的数据,能够一眼看出各个数据的大小,比较数据之间的差别(统计/对比)
  • 直方图(histogram):
    • 由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据范围,纵轴表示分布情况
    • 特点:绘制连续性的数据展示一组或者多组数据的分布情况(统计)
  • 饼图(pie):
    • 用于表示不同分类的占比情况
    • 特点:分类数据的占比情况

2.4.2、散点图绘制

# 探究房屋面积和房屋价格的关系
x = [1,2,3,4,5,6]
y = [7,8,9,10,11,12]

# 创建画布
plt.figure(figsize=(20,8),dpi=80)

# 绘制图像
plt.scatter(x,y)

# 显示图像
plt.show()

2.5、柱状图

2.5.1、柱状图绘制

# 对比电影票房收入
# 准备数据
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案']
tickets = [11111,22222,33333]

# 创建画布
plt.figure(figsize=(20,8),dpi=80)

# 绘制柱状图
plt.bar(movie_name, tickets,width=0.1)

# 显示图像
plt.show()
# 对比相同时间电影票房收入
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案']
first_day = [11111,22222,33333]
first_weekend = [22222,33333,44444]

# 创建画布
plt.figure(figsize=(20,8),dpi=80)

# 绘制柱状图
plt.bar(range(3), first_day,width=0.2,label='首日票房')
plt.bar([0.2,1.2,2.2], first_weekend,width=0.2,label='首周票房')

plt.legend()

plt.xticks([0.1,1.1,2.1],movie_name)
# 显示图像
plt.show()

2.6、直方图

2.6.1、直方图介绍

  • 直方图,形状类似柱状图却有着与柱状图完全不同的涵义。直方图牵涉统计学的按年,首先要对数据进行分组,然后统计每个分组内数据元的数量。在坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,称这样的统计图为频数分布直方图。
  • 相关概念
    • 组数:在统计数据时,我们把数据按照不同的范围分成几个组,分成的组的个数成为组数
    • 组距:每一组两个端点的差
  • 直方图与柱状图对比
    • 直方图展示数据的分布,柱状图比较数据的大小
    • 直方图X轴为定量数据,柱状图X轴为分类数据
    • 直方图柱子无间隔,柱状图柱子有间隔
    • 直方图柱子宽度可不一致,柱状图宽度需一致

2.6.2、直方图绘制

# 准备数据
time = [131,  98, 125, 131, 124, 139, 131, 117, 128, 108, 135, 138, 131, 102, 107, 114, 119, 128, 121, 142, 127, 130, 124, 101, 110, 116, 117, 110, 128, 128, 115,  99, 136, 126, 134,  95, 138, 117, 111,78, 132, 124, 113, 150, 110, 117,  86,  95, 144, 105, 126, 130,126, 130, 126, 116, 123, 106, 112, 138, 123,  86, 101,  99, 136,123, 117, 119, 105, 137, 123, 128, 125, 104, 109, 134, 125, 127,105, 120, 107, 129, 116, 108, 132, 103, 136, 118, 102, 120, 114,105, 115, 132, 145, 119, 121, 112, 139, 125, 138, 109, 132, 134,156, 106, 117, 127, 144, 139, 139, 119, 140,  83, 110, 102,123,107, 143, 115, 136, 118, 139, 123, 112, 118, 125, 109, 119, 133,112, 114, 122, 109, 106, 123, 116, 131, 127, 115, 118, 112, 135,115, 146, 137, 116, 103, 144,  83, 123, 111, 110, 111, 100, 154,136, 100, 118, 119, 133, 134, 106, 129, 126, 110, 111, 109, 141,120, 117, 106, 149, 122, 122, 110, 118, 127, 121, 114, 125, 126,114, 140, 103, 130, 141, 117, 106, 114, 121, 114, 133, 137,  92,121, 112, 146,  97, 137, 105,  98, 117, 112,  81,  97, 139, 113,134, 106, 144, 110, 137, 137, 111, 104, 117, 100, 111, 101, 110,105, 129, 137, 112, 120, 113, 133, 112,  83,  94, 146, 133, 101,131, 116, 111,  84, 137, 115, 122, 106, 144, 109, 123, 116, 111,111, 133, 150]

plt.figure(figsize=(20,8),dpi=80)

# 组距
distance = 2
# 组数
group_num = int((max(time) - min(time)) / distance)
# 绘制直方图
plt.hist(time, bins=group_num,density=True)
# 刻度
plt.xticks(range(min(time),max(time) + 2,2))
# 网格
plt.grid(linestyle="--", alpha=0.5)

plt.show()
  • 注意组距
  • 注意Y轴所代表的变量可以是频次也可以是频率,通过density=True参数控制

2.6.3、直方图的应用场景

  • 用于表示分布的情况
  • 通过直方图还可以观察和估计哪些数据比较继承,异常或者孤立的数据分布在何处

2.7、饼图

2.7.1、饼图绘制

# 准备数据
movie_name = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','七十七天','密战','狂兽','其它']

place_count = [60605,54546,45819,28243,13270,9945,7679,6799,6101,4621,20105]

plt.figure(figsize=(20,8),dpi=80)

plt.pie(place_count,labels=movie_name,colors=['b','r','g','y','c','m','y','k','c','g','y'], autopct="%1.2f%%")

plt.show()

2.8、小结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IX3X2HkK-1661236390019)(.\image\image-20220822135930303.png)]

三、Numpy

3.1、Numpy介绍

3.1.1、Numpy是什么

  • Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。是一个高效的运算工具

    • Numpy:数值计算库

      • num:numerical 数值化的
      • py :python
    • Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用python要简介的多

    • Numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器

      • ndarray
        • n :任意个
        • d:dimension 维度
        • array 数组

3.1.2、ndarray介绍

  • NumPy提供了一个N维数组类型ndarray,它描述了相同类型的”items“的集合
  • 为什么使用ndarray存储数据
    • 相对于python原生计算,ndarray运算效率大大提高
  • ndarray的优势
    • 存储风格
      • ndarray :相同类型
      • list: 不同类型 通用性较强
    • 并行化运算
      • ndarray支持并行化运算(向量化运算)
    • 底层语言
      • 底层使用C语言编写,内部解除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,效率远高于Python代码

3.1.3、ndarray属性

  • ndarray属性

    属性名称 属性解释 示例
    ndarray.shape 数组维度的元组 (8, 5) 表示二维数组,8行5列
    ndarray.ndim 数组维度
    ndarray.size 数组中的元素数量
    ndarray.itemsize 一个数组元素的长度
    ndarray.dtype 数组元素的类型
  • ndarray的形状

  • ndarray的类型

    • 创建ndarray时可通过dtype=np.float32参数指定类型

3.1.4、基本操作

  • ndarray.方法()

  • numpy.函数名()

    • 生成数组的方法

      1. 生成0和1

        # 生成0和1的数组
        np.zeros(shape=(3,4))
        np.ones(shape=(2,3),dtype=np.int32)
        
      2. 从现有数组中生成

        # 深拷贝
        data1 = np.array(score)
        data3 = np.copy(score)
        
        # 浅拷贝
        data2 = np.asarray(score)
        
      3. 生成固定范围的数组

        # 生成[-10,10]等距离的数组
        np.linspace(-10,10,1000)
        # 生成[a,b)范围c步长的数组
        np.arange(a,b,c)
        
      4. 生成随机数组

        • 均匀分布

          • 均匀分布(Uniform Distribution) 是概率统计中的重要分布之一。均匀表示可能性相等的含义
          # np.random.uniform(low,high,size)
          x = np.random.uniform(-1,1,size=100000)
          
        • 正态分布

          • 正态分布是一种概率分布。正态分布是具有两个参数μ和σ的连续型随机变量的分布,第一参数μ是服从正态分布的随机变量的均值。第二个参数σ是此随机变量的标准差,所以正态分布记作N(μ,σ)
          • 正态分布的特点
            • μ决定了其位置,标准差σ决定了分布的幅度。当μ=0,σ=1时的正态分布是标准正态分布
            • σ 幅度、稳定性、波动程度、集中程度、离散程度
          # np.random.normal(loc=μ,scale=σ,size)
          x2 = np.random.normal(loc=1.75,scale=0.1,size=10000)
          
    • 数组的索引、切片

      • 案例:随机生成8只股票2周的加以日涨幅数据

        # 案例:随机生成8只股票2周的加以日涨幅数据
        stock_change = np.random.normal(loc=0,scale=1,size=(8,10))
        # 前三日数据
        # 切片
        stock_change[0,:3]
        a1[1,0,2]
        
      • 形状修改

        # ndarray.reshape(shape) 修改形状,数据排列未改变,不修改原始数据,返回新的ndarray
        stock_change.reshape(10,8)
        # ndarray.resize(shape)  修改形状,数据排列未改变,原始数据改变
        stock_change.resize((10,8))
        # ndarray.T 转置  行变列、列边行
        
    • 类型修改

      • ndarray.astype(type)

        stock_change.astype(np.int32)
        
      • ndarray.tobytes()

        # 序列化
        ndarray.tobytes()
        
    • 数组的去重

      temp = np.array([[1, 2, 3, 4],[3, 4, 5, 6]]
      np.unique(temp)
      # 或者 flatten() 转一维数组
      set(temp.flatten())
      

3.1.5、ndarray运算

  • 逻辑运算

    stock_change = np.random.normal(loc=0,scale=1,size=(8,10))
    # 逻辑判断,如果涨跌幅>0.5就标记为True,否则为False
    stock_change > 0.5
    
    • 布尔索引
    # 布尔值条件索引,操作统一条件的数据
    stock_change[stock_change > 0.5]
    # 条件修改
    stock_change[stock_change > 0.5] = 1.1
    
    • 通用判断函数

      • np.all(布尔值)

        • 只要有一个False就返回False,只有全是True才返回True

          np.all(stock_change[0:2,0:5] > 0)
          
      • np.any()

        • 只要有一个True就返回True,全是False才返回False

          np.any(stock_change[:5,:] > 0)
          
    • 三元运算符

      • np.where(布尔值,True的位置的值,False的位置的值)
      # 前四个股票前四天的涨跌幅,大于0的置为1,否则为0
      temp = stock_change[:4,:4]
      np.where(temp > 0,1,0)
      
    • 复合逻辑运算符

      np.logical_and()

      np.logical_or()

      np.logical_and(temp > 0.5, temp < 1)
      np.logical_or(temp > 1, temp < 0.5)
      
  • 统计运算

    • 统计指标函数(np.函数名())

      • axis=0 按列最大值,axis=1 按行最大值

      • 最小值 min

        np.max(temp,axis=0)
        
      • 最大值 max

      • 平均值 mean

      • 标准差 std

      • 方差 var

      • 中间值 median

    • 返回最大值、最小值所在位置

      • np.argmax(temp,axis=)
      • np.argmin(temp,axis=)
  • 数组间运算

    • 数组与数的运算

      arr = np.array([[1, 2, 3, 2, 1, 4], [5, 6, 1, 2, 3, 1]])
      # 直接运算即可
      arr + 1
      arr / 10
      
    • 数组与数组的运算

    • 广播机制

      • 执行broadcast的前提在于,两个ndarray执行的是element-wise的运算,Broadcast机制的功能是为了方便不同形状的ndarray进行数学运算
      • 当操作两个数组时,numpy会逐个比较他们的shape,只有符合下面条件之一,才能进行运算
        • 维度相等(相同维度的元素个数相等)
        • shape(其中相对应的一个地方为1)
    • 矩阵运算

      • 什么是矩阵

        • 矩阵是二维数组
        • 二维数组不一定是矩阵
      • 两种方法存储矩阵

        • ndarray二维数组
        • matrix数据结构
      • 矩阵乘法运算

        • 形状

          • (m行,n列) * (n行,l列) = (m行,l列)
        • 运算规则

          • 矩阵1 行 * 矩阵2 列 相加
        • 运算方法

          • ndarray
            • np.matmul(mat1,mat2)
            • np.dot(mat1,mat2)
          • mat
            • mat1 * mat2
          # ndarray存储矩阵
          data = np.array([[80, 86],
          [82, 80],
          [85, 78],
          [90, 90],
          [86, 82],
          [82, 90],
          [78, 80],
          [92, 94]])
          # matrix存储矩阵
          data_mat = np.mat([[80, 86],
          [82, 80],
          [85, 78],
          [90, 90],
          [86, 82],
          [82, 90],
          [78, 80],
          [92, 94]])
          weights = np.array([[0.3],[0.7]])
          weights_mat = np.mat([[0.3],[0.7]])
          
          np.matmul(data,weights)
          np.dot(data,weights)
          data @ weights
          
          data_mat * weights_mat
          

3.1.6、其他

  • 合并

    • numpy.hstack(tup) 水平拼接

    • numpy.vstack(tup) 垂直拼接

      a = np.array([1,2,3])
      b = np.array([2,3,4])
      np.hstack((a,b))
      np.vstack((a,b))
      
    • np.concatenate((a,b), axis=0) axis = 0 垂直拼接,axis = 1 水平拼接

  • 分割

    • np.split(x, [1,3])
  • IO操作

    • np.genfromtxt(“test.csv”,delimiter=“,”)
  • 数据处理

    • 如何处理缺失值
      • 两种思路
        • 直接删除含有缺失值的样本
        • 替换/插补
          • 求行或列的平均值或者中间值,替换缺失值
      • 使用pandas处理数据更简单

四、Pandas

4.1、基础处理

4.1.1、Pandas简介

4.1.1.1、什么是Pandas
  • pandas = panel + data + analysis
    • panel 面板数据 -计量经济学 三维数据
    • data数据
    • analysis 分析
  • 以Numpy为基础,接力Numpy模块在计算方面的优势
4.1.1.2、问什么使用Pandas
  • 便捷的数据处理能力
  • 读取文件方便
  • 封装了matplotlib、Numpy进行画图和计算

4.1.2、核心数据结构

  • DataFrame

    • 既有行索引又有列索引的二维数组
    import pandas as pd
    # 基本
    pd.DataFrame(stock_change)
    # 添加行、列索引
    stock = ['股票{}'.format(i) for i in range(10)]
    date = pd.date_range(start='20220101',periods=5,freq='B')
    pd.DataFrame(stock_change,index=stock,columns=date)
    
    • 属性

      • shape :形状
      • index:行索引
      • columus:列索引
      • values :ndarray
      • T 转置
    • 方法

      • head() : 前几行
      • tail():后几行
    • DataFrame索引的设置

      • 修改行列索引值

        • 只能整体修改

          stock_ = ["股票_{}".format(i) for i in range(10)]
          data.index = stock_
          
      • 重设索引

        # 不删除原索引
        data.reset_index()
        # 删除原索引
        data.reset_index(drop=True)
        
      • 设置新索引

        df.set_index("month")
        df.set_index("month",drop=False)
        # 列表设置多个索引
        new_df = df.set_index(["year","month"])
        # new_df.index 类型是MultiIndex
        
    • MultiIndex

      • 属性
        • names
        • levels
  • Panel

    • 存储三维结构的容器
    • 已经废弃
  • Series

    • 带索引的一维数组

    • 创建

      pd.Series(np.arange(10))
      pd.Series(np.arange(3),index=['a','b','c'])
      
    • 属性

      • index
      • values
  • 小结

    • DataFrom 是series的容器

4.1.3、基本操作

4.1.3.1、索引操作
  • 直接索引

    # 直接索引
    data = pd.read_csv("./stock_day.csv")
    data["open"]["2018-02-27"] # 先列后行
    
  • 按名字索引

    data.loc["2018-02-27"]["open"]
    data.loc["2018-02-27","open"]
    
  • 按数字索引

    data.iloc[1,0]
    
  • 组合索引

    data.ix[] 已经废弃

    # 通过数字获取名字索引,再通过名字索引方法获取
    data.loc[data.index[i],['open','name']]
    # 通过名字获取索引数字,再用数字索引方法
    data.iloc[0,data.columns.get_indexer(['open''name'])]
    
4.1.3.2、赋值操作
data['open'] = 100
4.1.3.3、排序
  • 内容排序(dataframe)

    # 按某字段排序
    data.sort_values(by='high',ascending=False)
    # 按多个字段排序
    data.sort_values(by=['high','p_change'],ascending=False
    
  • 索引排序(dataframe)

    data.sort_index()
    
  • Series排序

    data.sort_values()
    data.sort_index()
    

4.1.4、运算

  • 算数运算

    • 算数运算符

      • +、-、*、/ ...
    • 算数运算函数

      • add()
      • sub()
  • 逻辑运算

    • 逻辑运算符

      # > < | &
      data[data['open'] > 2] # 布尔索引值
      
      data[(data['open'] > 2) & (data['low'] > 15)]
      
    • 逻辑运算函数

      • query() 条件查询函数

        data.query("open > 2 & low > 15")
        
      • isin() 是否包含

        data[data['turnover'].isin([4.19,2.39])]
        
        
  • 统计运算

    • min

    • max

    • mean 平均值

    • median

    • var

    • std

    • describe()

    • axis=1 按行,默认axis=0 按列

    • idmax() 最大值索引

    • idmin() 最小值索引

    • 累计统计函数

      • cumsum 计算前1/2/3/4…/n个数的和

        • data['p_change'].cumsum()
          # 画图
          data['p_change'].sort_index().cumsum().plot()
          
      • cummax 计算前1/2/3/4…/n个数的最大值

        • data['p_change'].cummax()
      • cummin 计算前1/2/3/4…/n个数的最小值

      • cumprod 计算前1/2/3/4…/n个数的积

  • 自定义运算

    • apply(func, axis=0)

      • func:自定义函数

      • axis:0 默认按列,axis=1 按行

      • data.apply(lambda x: x.max() - x.min())
        

4.1.5、画图

  • pandas.Data.Frame.plot
    • DataFram.plot(x=None,y=None,kind=‘line’)
      • x:
      • y:
      • kind: str
        • line 折线图
        • bar 柱状图
        • barh
        • hist 直方图
        • pie 饼图
        • scatter 散点图

4.1.6、文件的读取与存储

4.1.6.1、CSV
  • 读取csv文件-pd.read_csv()

    • usecols=[] 选择读取的列

    • name=[] 指定数据列名称

      pd.read_csv('stock_day2.csv',names=["open", "high", "close", "low", "volume", "price_change", "p_change", "ma5", "ma10", "ma20", "v_ma5", "v_ma10", "v_ma20", "turnover"])
      
  • 存储csv文件-DataFrame.to_csv()

    • 参数

      • columns=[], 保存列

        data[:10].to_csv('test.csv',columns=['open'])
        
      • index=False 不保存行索引

        data[:10].to_csv('test.csv',columns=['open'],index=False)
        
      • mode=“a” 写入模式, a 追加

        data[:10].to_csv('test.csv',columns=['open'],index=False,mode='a')
        
      • header=False 不保存列索引

        data[:10].to_csv('test.csv',columns=['open'],index=False,mode='a',header=False)
        
4.1.6.2、HDF5
  • 二进制文件
  • 存储三维数据
    • key1 :df1
    • key2:df2
  • 读取hdf5文件
    • pandas.read_hdf(path_or_buf, key = None, **kwargs)
      • path_or_buf 文件路径
      • key:读取的键
      • mode:打开模式
      • return
  • 保存hdf5文件
    • df.to_hdf(path, key=)
  • HDF5的优势
    • 支持压缩,使用的方式是blosc,这个是速度最快也是pandas默认支持的
    • 使用压缩可以提高磁盘利用率,节省空间
    • 跨平台,可以轻松迁移到hadoop上
4.1.6.3、JSON
  • 读取

    • pd.read_json(path,orient=‘records’,lines=True)

      • orient=‘records’
      • lines 按行读取
    • sa = pd.read_json('./Sarcasm_Headlines_Dataset.json',orient='records',lines=True)
      
  • 存储

    • df.to_json(path,orient=‘records’,lines=True)

4.2、高级处理

4.2.1、缺失值处理

4.2.1.1、如何处理缺失值
  • 思路

    • 删除含有缺失值的样本
    • 替换、插补
  • 如何处理nan

    • 判断数据中是否存在NaN

      • pd.isnull(df)

        # 判断是否存在缺失值
        np.any(pd.isnull(movie)) # 返回True,说明数据存在缺失值
        pd.isnull(movie).any()
        
      • pd.notnull(df)

        np.all(pd.notnull(movie)) # 返回False,说明数据存在缺失值
        pd.isnull(movie).any()
        
    • 删除缺失值样本

      • df.dropna(inplace=False)

        • 默认按行删除
        • inplace
          • True 会修改原始数据
          • False 不修改原始数据 生成新的对象
        # 缺失值处理
        # 删除
        data1 = movie.dropna()
        
    • 替换/插补

      • df.fillna(value, inplace=False)
      # 替换
      # Revenue (Millions)     True
      # Metascore              True
      movie['Revenue (Millions)'].fillna(movie['Revenue (Millions)'].mean(),inplace=True)
      movie['Metascore'].fillna(movie['Metascore'].mean(),inplace=True)
      
  • 缺失值不是nan,有默认标记的情况

    • 替换 ? -> np.nan
      • df.replace(to_replace=‘?’,value=np.nan)

4.2.2、数据离散化

4.2.2.1、什么是数据的离散化
  • 连续属性的离散化就是将连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或者整数值代表落在每个子区间中的属性值
4.2.2.2、为什么要离散化
  • 连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数。离散化方法经常作为数据挖掘的工具
4.2.2.3、如何实现数据的离散化
  1. 分组

    • 自动分组 sr = pd.qcut(data, bins)

      • data 数据

      • bins 组数

      • # 准备数据
        data = pd.Series([165,174,160,180,159,163,192,184], index=['No1:165', 'No2:174','No3:160', 'No4:180', 'No5:159', 'No6:163', 'No7:192', 'No8:184']) 
        sr = pd.qcut(data,3)
        pd.get_dummies(sr, prefix='height')
        
    • 自定义分组 sr = pd.cut(data, [])

      • [] 分组区间列表

        bins = [150,165,180,195]
        sr2 = pd.cut(data,bins)
        pd.get_dummies(sr2,"身高")
        
    • sr.value_counts()

      • 统计各组数据个数
  2. 将分组好的结果转换成one-hot编码

    • pd.get_dummies(sr, prefix=)
      • prefix 前缀

4.2.3、合并

  1. 按方向拼接

    • pd.concat([data1,data2],axis=0) 0:数值拼接,1 水平拼接
  2. 按索引拼接

    • pd.merge(left, right, how=‘inner’, on[索引])

      # 内连接
      pd.merge(left, right, on=['key1','key2']) # 默认how = 'inner'
      # 左连接
      pd.merge(left, right, on=['key1','key2'],how='left')
      # 右连接
      pd.merge(left, right, on=['key1','key2'],how='right')
      # 外连接
      pd.merge(left, right, on=['key1','key2'],how='outer')
      

4.2.4、交叉表与透视表

  • 作用

    • 探究两个变量之间的关系
  • 使用crosstab(交叉表)实现

    • pd.crosstab(value1,value2)

      data = pd.crosstab(stock['weekday'],stock['pona'])
      data.div(data.sum(axis=1),axis=0).plot(kind='bar',stacked=True)
      
  • 使用pivot_table(透视表)实现

    pivot_table(data, index=)

    # 透视表
    stock.pivot_table(['pona'],index=['weekday'])
    

4.2.5、分组与聚合

  • 什么是分组与聚合

  • 分组API

    • DataFrame

      • DataFrame.groupby(by=key, as_index=False)

        col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})
        
        col.groupby(by='color')['price1'].max()
        
    • Series

      • Series.groupby()
      col['price1'].groupby(col['color']).max()
      
  • #星巴克数据读取
    sbs = pd.read_csv('directory.csv')
    # 按国家分组
    sbs.groupby(by='Country').count()['Brand'].sort_values(ascending=False)[:10].plot(kind='bar',figsize=(20,8))
    # 按国家、城市分组
    sbs.groupby(by=['Country','City']).count()
    

4.2.6、综合案例

# 需求:
# 准备数据

你可能感兴趣的:(python,数据挖掘,学习,python)