数据挖掘基础学习笔记

2023-11-02

文章目录

一、数据挖掘基础

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() # 展示
    
    image-20220821215221078

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、综合案例

# 需求:
# 准备数据

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据挖掘基础学习笔记 的相关文章

随机推荐

  • 一键批量下载某篇文献的所有引用文献以及被引文献

    你还在为一篇一篇的下载参考文献而费时费力苦恼无比吗 曾经我像你一样 用一下午下载某一篇文献的80多篇参考文献 一篇一篇的下载简直要疯了 然而 现在有了一个简单高效实用的方法 只需两分钟即可批量下载所有的参考文献以及施引文献到mendely
  • 这年头还不来尝试线稿图视频??

    博客首页 knighthood2001 欢迎点赞 评论 热爱python 期待与大家一同进步成长 先看后赞 已成习惯 只截取了一部分 怕截取太多 你们打开卡 目录 前言 1原始视频逐帧提取 py 2原始视频音频提取 py 3 1PIL批量转
  • ubuntu16.04下 Phpstorm发布项目到apache

    在网上找的不靠谱 倒腾了大半天的 终于找到正确姿势QAQ 仅以此备份 顺带一提JetBrains是一个神奇的公司他们的全系列ide都是最好的IDE 强烈推荐学习使用 像Google官方的AndroidStudio也是基于他们的IDE的 我觉
  • .net截取两个字符串中间的内容

    做模拟登录时 需要截取html代码中的名字 返回的字符串内容如下 span class welcome 您好 span style font size 20px span 王霞 span span 欢迎您 span 我后台要怎样截取得到王霞
  • 论文笔记: Flow Prediction in Spatio-Temporal Networks Based on Multitask Deep Learning

    2020 TKDE 基于FCN 同时预测时空中的节点和边缘的流量 1 节点流量 边缘流量 2 问题定义 3 模型 4 实验 4 1 数据 TaxiBJ 2013年 2016年四个时间段北京市出租车GPS数据和气象数据 TaxiNYC 201
  • Consul功能简介

    Consul 是 HashiCorp 公司的一个用于实现分布式系统的服务发现与配置工具 Consul内置了服务注册与发现框 架 分布一致性协议实现 健康检查 Key Value存储 多数据中心方案 由于出现得晚些 Consul具有功能完善
  • UPC山头狙击战--二分

    题目描述 Lucky为了掩护大部队 单枪匹马同敌人周旋 后来被敌人包围在某山头 等等 为什么怎么听怎么像狼牙山五壮士 不过不用着急 这次Lucky携带了足够的弹药 完全可以将涌上来的敌人一个一个干掉 Lucky是个神枪手 只要他的枪膛中有子
  • 一些比较好的国外IT网站

    1 在线编程练习 LintCode 在线刷题网站 阶梯式训练 可帮助你更快速深入地了解各类面试题型 提供专业导师写的最优代码作为参考 Lintcode 标准答案查询 lintcode 的参考答案网站 提供最优解 Codecademy 包含在
  • Python find()函数使用详解

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 小白零基础 Python入门到精通 find 1 指定检索位置 2 参数为负数 3 超出范围 3 find 和ind
  • 微信发朋友圈测试用例

    微信发朋友圈测试用例 一 界面 1 字体的大小 字体的大小是否可以改变 编辑朋友圈时的字体和发出的字体大小是否一致 2 图片 图片的排版格式 图片不同数量时的排版格式 最多展示的图片的数量 3 视频 视频展示的格式 4 转发 5 编辑朋友圈
  • 虚拟机配置(VMware)

    基础配置 下载镜像 阿里云开源镜像centos安装包下载 开源镜像站 阿里云 操作系统 处理器 内存 硬盘 IP地址 static 环境 CentOS 7 9 2009 2C4G 100G 192 168 58 2 阿里源 虚拟机基础配置
  • C++ 格式化输出日期&时间

    1 声明结构体 struct tm 2 time 0 获取当前的时间戳 3 用时间戳来填充结构体 localtime r 时间戳 tm结构体 4 用格式字符串来将tm结构体转换为指定格式的日期时间字符串 strftime char数组 数组
  • Spring Boot logback-sping彩色日志

    Spring Boot logback sping彩色日志 application配置 开启mybatis日志 logging level com ysh oasys mapper debug logging file path logs
  • mgr未同步 mysql_MySQL MGR实现分析 - 成员管理与故障恢复实现

    此文已由作者温正湖授权网易云社区发布 欢迎访问网易云社区 了解更多网易技术产品运营经验 MySQL Group Replication MGR 框架让MySQL具备了自动主从切换和故障恢复能力 举single primary 单主 模式为例
  • 【简易心电测量电路(AD620)】

    学生版低成本心电测量 1 背景 1 1 心电图产生原理 1 2 心电信号特征 1 3 项目总体设计 2 电路设计 2 1前级放大与右腿驱动电路 2 2 低通滤波电路 2 3 50Hz陷波电路 2 4 后置放大电路 3 部分测试 3 1 前级
  • 以太坊原理分析(二)以太坊区块结构和账户体系

    1 引言 区块链的本质是一个分布式的数据库 因此不同时刻的用户数据的写入对应着不同的状态 比特币使用UTXO来表示状态的转移 而以太坊使用账来表示状态的转移 2 账户 以太坊中存在两种账户 分别是外部账户和合约账户 外部账户EOA 一般自然
  • js json数组获取最大、最小值

    var array index id 119 area id 18335623 name 满意度 value 100 index id 119 area id 18335624 name 满意度 value 20 inde
  • linux命令查看tcp流量,linux中查看系统活动情况报告sar命令详解

    有很多工具可以看网络流量 但我最喜欢sar sar System Activity Reporter系统活动情况报告 是目前 Linux 上最为全面的系统性能分析工具之一 可以从多方面对系统的活动进行报告 包括 文件的读写情况 系统调用的使
  • hbase 压缩配置

    对hbase 的hfile 进行snappy压缩的配置 1 gt hadoop集群必须先配置好snappy压缩 参考http hymanliu iteye com blog 2224330 2 gt 在hbase的lib native目录下
  • 数据挖掘基础学习笔记

    文章目录 一 数据挖掘基础 1 1 数据挖掘基础环境安装 1 2 Jupyter Notebook 1 2 1 介绍 1 2 2 快速使用 二 Matplotlib画图 2 1 Matplotlib简介 2 2 Matplotlib三层结构