机器学习1——Pandas


  • Pandas 是 Python 语言的一个扩展程序库,用于数据分析。
  • Pandas 名字衍生自术语 “panel data”(面板数据)和 “Python data analysis”(Python 数据分析)。
  • Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。
  • Pandas 一个强大的分析结构化数据的工具集,基础是 Numpy(提供高性能的矩阵运算)。

访问作者github: https://github.com/NefelibataBIGR/Machine_Learning_Notes ,获取笔记代码

一、简介

  • panel + data + analysis(panel data 面板数据)
  • 数据处理工具

- Why pandas?

  • 便捷的数据处理能力
  • 读取文件方便
  • 封装了Matplotlib、Numpy的画图和计算

二、核心数据结构

具体介绍代码见Python>pandas文件中的==data_structure.ipynb==文件

  • ==dataframe==
  • series
    理解:DataFrame是Series的容器

1、DataFrame

(1)基本

  • 结构:类似二维数组,有行、列索引
  • 属性:shape、index、columns、values、T(转置)
  • 方法:head()、tail()

(2)索引的设置

  • 修改行列索引值(只能整体修改)
  • 重设索引
  • 设置新索引

(3)MultiIndex

  • MultiIndex是设置了多索引之后的DataFrame,可以存储三维数据
  • MultiIndex的属性有names、levels

2、Series

  • 带索引的一维数组
    image.png

  • 属性:index、values

  • 方法:创建Series、head()、tail()

三、基本数据操作

具体代码见Python>pandas文件中的==basic_data_operations.ipynb==文件

1、索引操作

  • 直接索引(必须先列后行)
  • 按名字索引(loc,先行后列)
  • 按数字索引(iloc,先行后列)
  • 组合索引(loc、iloc,数字和名字混用)
  • isin():判断某一行是否存在某个值

2、赋值操作

  • 整列修改
  • 索引到某个值后修改

3、排序操作

  • 对内容排序(.sort_values(by=’ ‘, ascending=True/False))
  • 对索引排序(.sort_index())
    对于Series来说只有一维,不用考虑按照哪个字段排序

4、运算操作

主要是DataFrame

  • 算术运算(add())

  • 逻辑运算

    • 逻辑运算符(<、>、|、&)
    • 逻辑运算函数(**query(查找的字符串)**、isin())
  • 统计运算

    • 统计指标:count、min、max、mean、median、var、std
    • describe():直接得出统计指标
      • 效果:image.png
    • 返回索引:idxmin()、idxmax()
    • 累计统计函数:cumsum()、cummax()、cummin()、cumprod()
    • 配合画图函数plot():默认为折线图
      • cumsum()画图效果:(记得先对时间排序再累加)image.png
  • 自定义运算(apply(func, axis= ))

    • func:自定义函数
    • axis:默认为按列运算axis=0

5、画图操作

  • (Series).plot():默认折线图(见上面运算操作中的统计运算)
  • (DataFrame).plot():参数x、y、kind(图的类型)
    • API:
      image.png

    • 散点图效果:(kind=’scatter’)image.png

四、文件读取与存储

具体代码见Python>pandas文件中的==file_reading.ipynb==文件

  • numpy缺点:读不了字符串
  • 大部分数据文件pandas都可以读取
    image.png
    pandas可读取和储存的文件↑

1、csv文件

读取:

  • pd.read_csv(路径)
    • 参数(可省略):
      • usecols:只读取这些列
      • names:命名列索引

存储:

  • (DataFrame).to_csv(路径)
    • 参数(可省略):
      • columns:只保存指定的列,用列表选取
      • mode:读写方式,默认”w“重写,“a“追加
      • index:默认为True(保留索引),False不保留
      • header:默认为True(保留索引),False不保留

2、hdf5文件

  • 二进制文件,不能直接预览
  • 具有许多优点
  • 一个键对应一个DataFrame,可以理解成存储三维数据

读取:

  • pd.read_hdf(路径 , key= ):多个键时必须指定key=
    • 参数(可省略):
      • mode:打开文件的模式

存储:

  • (DataFrame).to_hdf(路径 , key= ):存储时key必须有

3、json文件

  • 前后端交互经常用到

读取

  • pd.read_json(路径 , lines= )
    • 参数:
      • orient:读取的json文件以什么形式展示,一般用”records”
      • lines:是否按行读取,填bool值,默认为False,一般需要指定为True

存储

  • (DataFrame).to_json(路径 , key= )
    • 参数:
      • orient:读取的json文件以什么形式展示,一般用”records”
      • lines:是否按行读取,填bool值,默认为False,一般需要指定为True

五、高级处理

具体代码见Python>pandas文件中的==advanced_processing.ipynb==文件

  • 缺失值处理
  • 数据离散化
  • 合并
  • 交叉表与透视表
  • 分组与聚合

1、缺失值处理

(1)How?

  • 思路:
    1. 删除含有缺失值的样本
    2. 替换/插补,一般用平均值 / 众数值替换

(2)处理NaN

  1. 判断是否存在NaN(结合np.any/np.all判断,或者直接加any()/all())
    • pd.isnull(DataFrame):缺失值的地方返回True
    • pd.notnull(DataFrame):不是缺失值的地方返回True
  2. 删除含有缺失值的样本
    • df.dropna(inplace= ):默认按行删除,默认inplace=False不修改原数据,生成新对象
  3. 替换/插补
    • 平均值插补:df.loc[:, ‘xxx’] = df[‘xxx’].fillna(df[‘xxx’].mean())
    • 众数值插补:
      1. counts = x_pred[feat].value_counts()
      2. x_pred.loc[:, feat] = x_pred[feat].fillna(counts.idxmax())

(3)处理非NaN的缺失值

  1. 替换:符号 -> np.nan
    • df.replace(to_replace=需要替换的东西 , value=np.nan)
  2. 处理NaN

2、数据离散化

  • 用数据表示特征(取代字符串),便于后续运算

  • 将连续数据分成多个离散区间,用不同的值代表落在区间
    image.png
    one-hot编码(独热编码/哑变量)

  • 数据离散化为了简化数据结构,让数据之间关系平等
    案例:股票的涨跌幅离散化,见文件

如何实现数据离散化?

  1. 分组
    • 自动分组:sr = pd.qcut(data , 组数)
      • 自动分成等间距的组
    • 自定义分组:sr = pd.cut(data , bins=[区间] )
      • 区间列表内只用传各个区间边界值,如:bins = [150, 165, 180, 195] 分成三个区间
  2. 转换成独热编码(one-hot编码/哑变量)
    • pd.get_dummies(sr , prefix= 前缀 , dtype=int)

3、合并

(1)按方向合并

  • pd.concat([data1 , data2] , axis= ):默认axis=0竖直拼接

(2)按索引合并

  • pd.merge(左表 , 右表 , how=”连接方式” , on=[索引]):默认how=”inner”内连接
    image.png
    连接方式,与SQL类似,碰到不共有的键补NaN

4、交叉表与透视表

  • 探索两个变量直接的关系

(1)交叉表

  • 寻找两数据列之间的关系
  • pd.crosstab(数据列1 , 数据列2):得到的是频数分布(先行索引,后列索引)
    pandas日期类型,如date = pd.to_datetime(stock.index),用date.year/month/week等获取日期信息

(2)透视表

  • df.pivot_table([ ] , index=[ ]):直接得出频率

5、分组与聚合

  • 什么是分组与聚合:
    image.png
    按类别分组,再经过统计函数聚合
    一般同时使用分组与聚合

  • DataFrame方法:

    • df.groupby(by=[“分组按照的列”])[“需要聚合的列”].func( ):func( )为聚合的统计函数,分组按照的列可以不止一个,放在列表给出
    • 例如:col.groupby(by=[‘color’])[‘price1’].max()
  • Series方法:

    • df[“需要聚合的列”].groupby(by=df[“分组按照的列”]).func( )
    • 例如:col[‘price1’].groupby(by=col[‘color’]).max()

星巴克零售店铺数据案例:见文件

六、综合案例:电影数据分析

具体代码见Python>pandas文件中的==comprehensive_case.ipynb==文件


文章作者: Nefelibata BIGR
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Nefelibata BIGR !
  目录