Pandas基础笔记

参考图书《利用python进行数据分析

参考 Python中文文档

参考 英文文档

前言

  • Pandas是基础的Python数据分析中,最重要的包

数据结构

Series

  • 类似一维数组+index索引
  • 创建
    • Series()
    • 传入一个序列化的对象,序列化索引
    • 也可以通过字典建立
  • 属性
    • .name
    • .index
    • .index.name

DataFrame

  • 高维数组 (最常见二维数组+index+columns)
  • pd.DataFrame( 等长列表、NumPy数组字典)
  • .head()
  • 可按照字典标记、属性标记检索为Series
    • df[‘col’]
    • df.col
  • del df[‘col’] 直接删除指定col列
  • df.values 将df的数据以ndarry形式返回 在机器学习中常用

索引对象

  • 特征
    • 不可修改
    • 可以重复
    • 可以重构
  • 索引的方法属性
    • x.append(index) 追加索引
    • x.defference(y) 两索引差集
    • x.intersection(y) 两索引交集
    • x.union(y) 两索引并集 需要非重复索引
    • x.isin(y) 索引x中的各个元素 在y索引中的成员资格组成的 array
    • x.delete(loc) 索引x 删除指定位置行 返回一个新索引
    • x.drop(索引) 索引x 删除指定索引 返回一个新索引
    • x.insert(loc, item)
    • is_monotonic 递增检查 属性
    • is_unique 唯一性检查 属性

Pandas基本功能

索引功能

  • 重建索引
    • df.reindex()
      • method ffill, bfill 向前向后填充
      • fill_value 缺失值填充
      • limit tolerance 填充限制
      • level 索引等级
      • copy 默认进行复制
    • .set_index(key) 把某一列设置为索引
    • .reset_index() 重置为整数索引
  • 索引重命名
    • index=
    • .columns=
    • .rename(index={}, columns={})
    • index.maps(func)
    • columns.maps(func) 修改某列名称 相当于更改表头
  • 索引选取
    • 直接索引
      • df[val]
      • df.loc[val]
      • df.loc[:,val]
      • df.loc[val,:]
      • df.at[val1, val2]
    • 整数索引
      • df.iloc[where]
      • df.iloc[where1, where2]
      • df.iat[i, j]
    • get_value
    • set_value

算术和数据对齐

  • 不同索引对象之间的算术方法会自动对齐 ,就是相同索引进行计算
  • fill_value() 空值填充

函数应用和映射

  • NumPy的通用元素级别函数
  • apply(func(Series)) Series级别的函数
    • 返回标量
    • 返回一个Series
  • applymap(func)
    • 元素级别的Python函数
    • 例如 df.applymap(lambda x:'%.2f'%x) 浮点数格式化字符串

排序和排名

  • 排序
    • sorted_index 按照索引排序
    • sorted_values
      • by= 按照哪一\多列排序
      • ascending=False 降序
  • 排名
    • rank()
      • axis=
      • method
        • average
        • min
        • max
        • first
        • dense 组件排名增加1的min方法

描述性统计

  • 各项指标信息
    • describe()
  • 约简型统计
    • sum min max mean
    • quantile 分位数
    • var 方差
    • mad 平均绝对偏差
    • std 标准差
    • diff (时间序列的算术差值)
    • pct_change 计算百分比
  • 累计型
    • cumsum 累计和
    • cumprod 累计积
    • cummin, cummax 累计值的最小最大值
  • 间接统计
    • idxmax 最大值索引
    • idxmin
  • 相关性、协方差
    • df.corr()
    • df.cov()
    • df1.corrwith(Series/df2) 计算和某一个Series,df中对应col的相关性

计数与成员资格

  • unique()
  • value_counts()
  • isin() 成员资格的布尔数组
  • pd.match(s1, s2)
    • 计算Series1,中的各个元素在Series中的整数索引
    • 找不到对应位置返回 -1
    • 找到 则返回整数索引值

数据加载

  • 读取文本格式

    • read_csv()

      • header 表头 即columns
      • sep 分割符
      • encoding
      • parse_dates
        • True 解析时间格式,在所有列执行
        • [‘date’] 将date列作为时间列进行解析
      • 某些含有汉字名称的csv文件解决方案

        1. f=open(file_path),
        2. df = pd.read_csv(f)
      • 也可以尝试不同的读取engine,或者使用charset检查文件的编码格式,按照指定编码读取解析

    • read_json()
    • read_excel()
  • json格式的序列化反序列化
    • json.loads() 把json字符串转化为python对象
    • json.dumps() 把python对象转化为json格式字符串,传输需要
  • 网络数据解析
    • read_html() 读取html文件中的所有表格数据
    • 更常见的其他解析方式如xpath beautifulsoup解析完后再处理

数据清洗准备

缺失数据处理

  • 丢弃缺失值 dropna()
    • subset=[] 检测哪几列
    • how
      • any
      • all
    • threah=m 空值数量容忍 这一行有>=m个空值时才删除
  • 补全缺失值
    • df.fillna()
      • {} 按照字典填充
      • 数值例如0 空值填充为0
      • method
        • ffill 向前填充
        • bfill 向后填充
      • limit 最大填充范围
      • inplace
        • True 不生成副本 直接修改原数组
    • df1.combine_first(df2)
      • 如果df1中的数据为空,则用df2进行填充
    • df.interpolate()
      • method
        • liner 线性插值
        • ploynominal 多项式插值等等

数据转换

  • 移除重复数据
    • drop_duplicated()
      • subset=[] 传入列表 对指定列进行查重删除
      • keep 保留
        • last
        • first
        • false
  • 替换数据
    • Series.repalce()
      • (a,b) 把Series中的a,可以是列表,替换为b
      • {a:b}字典替换
    • Series.str.replace() 是针对字符串形式的操作,函数不同
  • 函数映射转换
    • map()
      • {} 字典映射
      • func 函数映射

重命名轴索引

  • df.index= 直接重新赋值
  • df.index.map()
  • df.rename
    • (index=str.title, columns=str.upper) 传入函数名
    • {} 字典形式的修改

离散化面元积分

  • 将诸如年龄段、时间段之类的数据进行划分段
    例 ages=[20,22,25,27,21,23,37,31,36],bins=[17,25,35,60]
  • cat=pd.cut(x=ages, bins=bins)
    • x 原数组
    • bin 指明划分依据
      • 整数 分成数量相当的几个箱子
      • 标量序列 按照给定的序列分箱
    • right 默认左开右闭
    • lables=[] 对箱体进行标注命名
    • pd.value_counts(cat) 返回面元划分之后各组的计数
  • qcut() 按照样本的分位数进行划分 而非样本个数

其他

  • 随机抽样
    • sample()
      • n 抽取几行
      • frac 抽取比例
        • frac = 1 也就是随机重排
    • 使用iloc整数索引、take
      • sam = np.random.permutation(n)
      • df.iloc[sam]
      • df.take(sam)
  • 生成虚拟变量
    • get_dummies(df[‘key’])
    • join()
  • 字符串函数
    • map(正则func)
    • .str.
      • contains endswith startswith match replace等

数据规整

重塑

  • 轴向旋转
    • stack() 折叠
    • unstack() 展开
  • 重排
    • swaplevel() 多层级级索引交换层级
  • 重建索引 把某列设置为索引
    • set_index()
      • key= 列名或者列表(层级索引)
      • append 是否追加 默认 False
      • drop 删除用来索引的列 默认 True
    • reset_index()
      • 重建整数索引,原来的索引被分配到各个列
  • 在指定级别的操作
    • sum(level=)
    • sort_index(level=)
  • 透视表
    • pivot_table() 建立透视表
      • index 列
      • columns 列
      • aggfun 运算方法
      • margins 是否显示汇总信息
      • 实际使用中个人更习惯groupby().apply({})的方法
    • pivot()
      • index 行索引
      • columns 列
      • values 值
    • melt() pivot的逆操作
      • id_vars 分组指标
      • value_vars 值列

合并数据集

  • pd.merge(df1,df2) 数据逻辑上的连接
    • on 连接键设置
      • left_on
      • right_on
      • on
    • how
      • inner outer left right
    • suffixes 指定附加到新的列名上的字符串
    • sort
      • False 不排序
    • left_index 将左侧行索引作为连接键
    • right_index 将右侧索引作为连接键
  • pd.concat([df1, df2]) 堆叠数据 相当于表格下面\右边再加上一张表
    • axis=
      • 0/1 在行方向、列方向进行堆叠

可视化

  • 本书介绍了 matplotlib、seaborn 的一些可视化包。起初我也用seaborn 绘图,后来改用pyecharts、plot、dash。不再使用 seaborn 也不太推荐大家使用这本数里介绍的两个包。
  • | 可视化包名称 | 代码量 | 交互性 | 是否支持dataFrame接口 | | —- | —- | —- | —- | | Matplotlib | 大 | 无 | 否 | | Seaborn | 小 | 无 | 是 | | pyechart | 中 | 好 | 否 | | Plotly | 小 | 好 | 是 |

  • 其他特点

聚合与分组运算

数据分组

  • grouoby
    • 列名 按照某列进行分组
    • {} 字典 将不同列归入同一个分组
    • 函数
      • len 按照字符串长度进行分组
      • 自定义函数
      • 匿名函数
    • level= 在哪个层级进行分组
  • 分组迭代
    • groupby 生成含组名和数据块的二维元组序列
    • for name, group in df.groupby('key1'):
    • for (k1, k2), group in df.groupby(['key1', 'key2']):
  • 数据聚合
    • 系统聚合函数 直接调用 .mean()
      • mean sum count median 之类
    • 自定义聚合函数
      • agg(fun)
    • 字典式多列不同聚合
      • agg({“”:np.mean,””:np.sum})
      • 可以使用列表 对一列同时使用不同的聚合
    • as_index= Fales
      • 关闭分组后的自动建立索引
      • 默认 True 推荐False
  • apply
    • groupby最常用的拆分-应用-联合功能
    • 会将待处理的对象拆分成多个片段,然后对各个片段调用传入的函数,最后尝试将片段组合到一起
    • 举例
      • 使用各自分组的均值进行填充
      • 分组随机采样
      • 分组加权平均
      • 分组线性回归

时间序列

时间序列的功能 我使用比较少 不熟悉

时间数据类型工具

  • datetime 模块
    • strptime() 解析指定格式的时间字符串 返回时间
    • strftime() 返回字符串
  • dateutil.parser.parse()
    • 把可以分辨的时间字符串转换为时间格式

索引、选择、子集

  • 假设存在dataFrame ts 以时间序列作为index
    • ts[‘2010-1-5’] 传递一个可以解释的时间字符串
    • ts[datetime()] 传递 datetime 对象
    • ts[‘2020-6’:’2020-9’] 传递范围字符串
    • dataFrame的一般索引方式
      • ts.truncate(before=None, after=None, axis=None, copy=True)
      • ts.loc[‘2020-5’] 表示时间的字符串即可 时间粒度可以更高

日期的范围、频率、移位

  • 生成日期范围
    • pd.date_range()
      • start=None 开始
      • end=None 截止
      • periods=None 几个阶段
      • freq=None 频率
  • 频率
    • 频率有基础频率和倍数组成
    • 时间序列的频率非常多 自然天、工作日、小时、季度等等
  • 偏移
    • rollback() 向后调整到指定频率的时间
    • rollforard() 向前调整到制定频率的时间
    • resample() 重采样

时区处理

  • 时区的本地化转换
    • tz.tz_localsize(‘utc’)
    • tz_eastern.tz_convert(“Asia/Shanghai”)
  • 时间戳
    • 不同时区的时间戳记录是一样的

区间频率转化

  • asfreq()
    • freq,
    • how=
      • start
      • end

重采样与频率转换

  • 重采样
    • 向下采样 高频居合到低频 天-月
  • resample()
    • freq
    • closed 向下采样封闭
      • right 右闭区间
      • left 左闭区间
    • conversition 向上采样
      • strat 低频转换高频的约定 起始时间
      • end 种植时间
  • 向下采样
    • 聚合函数应用
    • OHLC重采样
      • open high low close 股票指标常用
  • 向上采样
    • 插值函数应用

移动窗口函数

  • rolling()
    • window 窗口长度
    • min_periods=None 最小窗口长
    • center=False 默认选右边缘
    • win_type=None none表示按照等权重,
      • 三角权重
    • on=None 列名
    • axis=0 轴方向
    • closed=None
  • 指数加权函数
    • 指定一个常数衰减因子,以便于给近期参考值更多的权重
    • .ews(span=n).mean() 指用指数衰减的形式 以跨度为n 进行指数加权
  • 二元移动窗格
    • rolling().corr()
  • 自定义函数
    • rolling().apply()