Pandas学习笔记

1 Pandas介绍

1.1 认识Pandas
  • 以Numpy为基础,借力Numpy在计算方面性能高的优势基于Matplotlib,能够简便的画图,独特的数据结构,读取文件方便
1.2 案例

区别于Numpy,Pandas在数据操作方面会更形象化。

# 导入pandas
import pandas as pd

# 创建一个符合正太分布的10个股票5天的涨跌幅数据
stock_change = np.random.normal(0, 1, (10, 5))

# 使用Pandas中的数据结构
stock_day_rise = pd.DataFrame(stock_change)

# 构造行索引序列
stock_code = ['股票' + str(i) for i in range(stock_day_rise.shape[0])]

# 添加行索引
data = pd.DataFrame(stock_change, index=stock_code)

# 生成一个时间的序列,略过周末非交易日
# date_range(start=None,end=None, periods=None, freq='B')参数说明:
# start:起始时间,end:结束时间,periods:时间天数,freq:递进单位,默认为1天,‘B’默认略过周末
date = pd.date_range('2020-09-01', periods=stock_day_rise.shape[1], freq='B')

# index代表行索引,columns代表列索引
data = pd.DataFrame(stock_change, index=stock_code, columns=date)

# 结果
     	2020-09-01  2020-09-02  2020-09-03  2020-09-04  2020-09-07
股票0    0.666512   -1.686975   -1.921115   -0.476754    0.567056
股票1   -1.028429    0.690079    0.515872   -0.245661    0.295913
股票2    0.887564    0.535831   -0.953737    0.702742    0.340305
股票3    0.488817    0.106693    1.115562    0.162008   -1.278754
股票4   -0.948476   -0.838498    0.501498   -1.766902   -0.545747
股票5   -0.194258    1.231776    0.784383   -0.836579   -0.569891
股票6    0.584226    0.186989    0.796285   -0.892660    0.053643
股票7    1.799851    0.641454   -0.442945    0.061169   -2.076740
股票8   -1.062695   -0.414012   -0.335279   -1.577242    0.578246
股票9   -0.107383    0.503183    0.610964   -1.932938    0.310824

2 Pandas–数据结构

Pandas有两个最主要也是最重要的数据结构: SeriesDataFrame

2.1 Series

Series是一种类似于一维数组的对象,由一组数据(各种Numpy数据类型)以及一组与之对应的索引(数据标签)组成。

  • 特点

    • 类似一维数组的对象
    • 由数据和索引组成
      • 索引(index)在左,数据(values)在右
      • 索引是自动创建的
  • 创建

    import pandas as pd
    
    pd.Series(data=None, index=None, dtype=None)
    """
    参数:
    	data:传入的数据,可以是ndarray、list等
    	index:索引,必须是唯一的,且与数据的长度相等。如果没有传入索引参数,则默认会自动创建一个从	0-N的整数索引。
    	dtype:数据的类型
    """
    
    • 通过list构建Series,默认索引
    pd.Series(np.arange(10))
    
    • 指定索引
    pd.Series([6.7,5.6,3,10,2], index=[1,2,3,4,5])
    
    • 通过字典数据创建
    color_count = pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})
    
  • 属性

    • index
    color_count.index
    
    # 结果
    Index(['blue', 'green', 'red', 'yellow'], dtype='object')
    
    • values
    color_count.values
    
    # 结果
    array([ 200,  500,  100, 1000])
    
2.2 DataFram

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同类型的值。DataFrame既有行索引也有列索引,它可以被看做是由Series组成的字典(共用同一个索引),数据是以二维结构存放的。

  • 结构

    DataFrame对象既有行索引,又有列索引

    行索引:表明不同行,横向索引,index,0轴,axis=0

    列索引:表明不同列,纵向索引,column,1轴,axis=1

    df
  • 创建

    • 通过ndarray构建DataFrame
    import numpy as np
    
    # 通过ndarray构建DataFrame
    array = np.random.randn(5,4)
    
    df_obj = pd.DataFrame(array)
    
    • 通过dict构建DataFrame
    # 通过dict构建DataFrame
    dict_data = {'A': 1, 
                 'B': pd.Timestamp('20170426'),
                 'C': pd.Series(1, index=list(range(4)),dtype='float32'),
                 'D': np.array([3] * 4,dtype='int32'),
                 'E': ["Python","Java","C++","C"],
                 'F': 'ITCast' }
    #print dict_data
    df_obj2 = pd.DataFrame(dict_data)
    
  • 属性

    • shape

      # 获取形状
      data.shape
      (10, 5)
      
    • index

      # 获取行索引
      data.index
      Index(['股票0', '股票1', '股票2', '股票3', '股票4', '股票5', '股票6', '股票7', '股票8', '股票9'], dtype='object')
      
    • columns

      # 获取列索引
      data.columns
      DatetimeIndex(['2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06'], dtype='datetime64[ns]', freq='B')
      
    • values

      # 查看值
      data.values
      array([[-0.06544031, -1.30931491, -1.45451514,  0.57973008,  1.48602405],
             [-1.73216741, -0.83413717,  0.45861517, -0.80391793, -0.46878575],
             [ 0.21805567,  0.19901371,  0.7134683 ,  0.5484263 ,  0.38623412],
             [-0.42207879, -0.33702398,  0.42328531, -1.23079202,  1.32843773],
             [-1.72530711,  0.07591832, -1.91708358, -0.16535818,  1.07645091],
             [-0.81576845, -0.28675278,  1.20441981,  0.73365951, -0.06214496],
             [-0.98820861, -1.01815231, -0.95417342, -0.81538991,  0.50268175],
             [-0.10034128,  0.61196204, -0.06850331,  0.74738433,  0.143011  ],
             [ 1.00026175,  0.34241958, -2.2529711 ,  0.93921064,  1.14080312],
             [ 2.52064693,  1.55384756,  1.72252984,  0.61270132,  0.60888092]])
      
    • T

      # 转置
      data.T
      
      DF转置结果
    • head(5)

      显示前5行内容,如果不补充参数,默认5行,填入参数N则显示前N行

    • tail(5)

      显示后5行内容,如果不补充内容,默认5行。填入参数N则显示后N行

3 Pandas的基本数据操作

3.1 索引操作

Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持类似的操作,也可以直接使用列名、行名称,甚至组合使用。

  • **直接使用行列索引(先列后行)
# 直接使用行列索引名字的方式(先列后行)
data['open']['2018-02-27']
23.53
  • 结合loc或者iloc使用索引

    # 使用loc:只能指定行列索引的名字
    data.loc['2018-02-27':'2018-02-22', 'open']
    
    2018-02-27    23.53
    2018-02-26    22.80
    2018-02-23    22.88
    Name: open, dtype: float64
            
    # 使用iloc可以通过索引的下标去获取
    # 获取前100天数据的'open'列的结果
    data.iloc[0:100, 0:2].head()
    
       				open   high     close    low
    2018-02-27    23.53    25.88    24.16    23.53
    2018-02-26    22.80    23.78    23.53    22.80
    2018-02-23    22.88    23.37    22.82    22.71
    
  • 使用ix组合索引

    获取行第1天到第4天,[‘open’, ‘close’, ‘high’, ‘low’]这个四个指标的结果

    # 使用ix进行下表和名称组合做引
    data.ix[0:4, ['open', 'close', 'high', 'low']]
    
    # 推荐使用loc和iloc来获取的方式
    data.loc[data.index[0:4], ['open', 'close', 'high', 'low']]
    data.iloc[0:4, data.columns.get_indexer(['open', 'close', 'high', 'low'])]
    
                	open    close    high    low
    2018-02-27    23.53    24.16    25.88    23.53
    2018-02-26    22.80    23.53    23.78    22.80
    2018-02-23    22.88    22.82    23.37    22.71
    2018-02-22    22.25    22.28    22.76    22.02
    
3.2 赋值

对DataFrame当中的close列进行重新赋值为1

# 直接修改原来的值
data['close'] = 1
# 或者
data.close = 1
3.3 排序

排序有两种形式,一种对于索引进行排序,一种对于内容进行排序

  • dataframe

    • 使用df.sort_values(by=, ascending=)

      单个键或者多个键进行排序,默认升序

      ascending=False:降序

      ascending=True:升序

      # 按照涨跌幅大小进行排序 , 使用ascending指定按照大小排序
      data = data.sort_values(by='p_change', ascending=False).head()
      
      # 按照过个键进行排序
      data = data.sort_values(by=['open', 'high'])
      
    • 使用df.sort_index给索引进行排序

  • series

    • 使用series.sort_values(ascending=True)进行排序

      series排序时,只有一列,不需要参数

      data['p_change'].sort_values(ascending=True).head()
      
      2015-09-01   -10.03
      2015-09-14   -10.02
      2016-01-11   -10.02
      2015-07-15   -10.02
      2015-08-26   -10.01
      Name: p_change, dtype: float64
      
    • 使用series.sort_index()进行排序

4 DataFrame运算

4.1 算术运算
  • add(other)

  • sub(other)

    # 1、筛选两列数据
    close = data['close']
    open1 = data['open']
    # 2、收盘价减去开盘价
    data['m_price_change'] = close.sub(open1)
    data.head()
    
4.2 逻辑运算
  • 逻辑运算符号

    > < | &

  • 逻辑运算函数

    query(expr):查询字符串

    data.query("p_change > 2 & turnover > 15")
    

    isin(values)

    # 可以指定值进行一个判断,从而进行筛选操作
    data[data['turnover'].isin([4.19, 2.39])]
    
4.3 统计运算
  • describe()

    综合分析: 能够直接得出很多统计结果,count, mean, std, min, max

    # 计算平均值、标准差、最大值、最小值
    data.describe()
    
  • 统计函数

    对于单个函数去进行统计的时候,坐标轴还是按照这些默认为“columns” (axis=0, default),如果要对行“index” 需要指定(axis=1)

    • 最大值max()、最小值min()
    • 标准差std()、方差var()
    • 中位数median()
    • 最大值位置idmax()、最小值位置idmin()
  • 累计统计函数

    函数作用
    cumsum计算前1/2/3/…/n个数的和
    cummax计算前1/2/3/…/n个数的最大值
    cummin计算前1/2/3/…/n个数的最小值
    cumprod计算前1/2/3/…/n个数的积
4.4 自定义运算

apply(func, axis=0)。func:自定义函数,axis=0:默认是列,axie=1:行运算

data[['open', 'close']].apply(lambda x: x.max() - x.min(), axis=0)

open     22.74
close    22.85
dtype: float64

5 Pandas画图

5.1 pandas.DataFrame.plot

参考:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html

5.2 pandas.Series.plot

参考:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.plot.html

6 文件读取与存储

6.1 CSV
  • read_csv

    pandas.read_csv(filepath_or_buffer, sep =’,’ )

    filepath_or_buffer:文件路径

    usecols:指定读取的列名,列表形式

    # 读取文件,并且指定只获取'open', 'close'指标
    data = pd.read_csv("./data/stock_day.csv", usecols=['open', 'close'])
    
  • to_csv

    DataFrame.to_csv(path_or_buf=None, sep=’, ’, columns=None, header=True, index=True, mode=‘w’, encoding=None)

    • path_or_buf :string or file handle, default None

    • sep :character, default ‘,’

    • columns :sequence, optional

    • mode:‘w’:重写, ‘a’ 追加

    • index:是否写进行索引

    • header :boolean or list of string, default True,是否写进列索引值

    # 选取10行数据保存,便于观察数据
    data[:10].to_csv("./data/test.csv", columns=['open'])
    
    # 读取结果
    pd.read_csv("./data/test.csv")
    
6.2 HDF5
  • read_hdf(h5文件)

    pandas.read_hdf(path_or_buf,key =None,** kwargs)

    • path_or_buffer:文件路径
    • key:读取的键
    • return:Theselected object
  • to_hdf

    DataFrame.to_hdf(path_or_buf, key, **kwargs)

  • 备注

    优先选择使用HDF5文件存储

    HDF5在存储的时候支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的

    使用压缩可以提磁盘利用率,节省空间

    HDF5还是跨平台的,可以轻松迁移到hadoop 上面

6.3 JSON
  • read_json

    pandas.read_json(path_or_buf=None, orient=None, typ=‘frame’, lines=False)

    • 将JSON格式准换成默认的Pandas DataFrame格式

    • orient : string,Indication of expected JSON string format.

      • ‘split’ : dict like {index -> [index], columns -> [columns], data -> [values]}

        • split 将索引总结到索引,列名到列名,数据到数据。将三部分都分开了
      • ‘records’ : list like [{column -> value}, … , {column -> value}]

        • records 以columns:values的形式输出
      • ‘index’ : dict like {index -> {column -> value}}

        • index 以index:{columns:values}...的形式输出
      • ‘columns’ : dict like {column -> {index -> value}}

        ,默认该格式

        • colums 以columns:{index:values}的形式输出
      • ‘values’ : just the values array

        • values 直接输出值
    • lines : boolean, default False

      • 按照每行读取json对象
    • typ : default ‘frame’, 指定转换成的对象类型series或者dataframe

    # orient指定存储的json格式,lines指定按照行去变成一个样本
    json_read = pd.read_json("./data/Sarcasm_Headlines_Dataset.json", orient="records", lines=True)
    
  • to_json

    DataFrame.to_json(path_or_buf=None, orient=None, lines=False)

    • 将Pandas 对象存储为json格式
    • path_or_buf=None:文件地址
    • orient:存储的json形式,{‘split’,’records’,’index’,’columns’,’values’}
    • lines:一个对象存储为一行
    json_read.to_json("./data/test.json", orient='records')
    

7 高级处理

7.1 缺失值处理
  • 处理NaN

    • 判断

      pd.isnull(df)

      pd.notnull(df)

    • 处理

      • 存在缺失值,并且是np.nan

        1.删除存在缺失值的:dropna(axis=‘rows’)。注:不会修改原数据,需要接受返回值

        # 不修改原数据
        movie.dropna()
        
        # 可以定义新的变量接受或者用原来的变量名
        data = movie.dropna()
        

        2.替换缺失值:fillna(value, inplace=True)。value:替换成的值,inplace:True:会修改原数据,False:不替换修改原数据,生成新的对象

        # 替换存在缺失值的样本的两列
        # 替换填充平均值,中位数
        movie['Revenue (Millions)'].fillna(movie['Revenue (Millions)'].mean(), inplace=True)
        
      • 不是缺失值nan,有默认标记?x *等

        # 全局取消证书验证
        import ssl
        ssl._create_default_https_context = ssl._create_unverified_context
        

        1.先替换‘?’为np.nan

        # 把一些其它值标记的缺失值,替换成np.nan。to_replace替换前的值,value替换后的值
        wis = wis.replace(to_replace='?', value=np.nan)
        

        2.进行缺失值处理

        # 删除
        wis = wis.dropna()
        
7.2 数据离散化

连续属性离散化的目的是为了简化数据结构,数据离散化技术可以用来减少给定连续属性值的个数

连续属性的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数 值代表落在每个子区间中的属性值。

  • 股票的涨跌幅离散化

    pd.qcut(data, bins)。对数据进行分组,将数据分组一般会与value_counts搭配使用,统计每组的个数

    series.value_counts():统计分组次数

    # 读取数据
    data = pd.read_csv("./data/stock_day.csv")
    p_change= data['p_change']
    # 自行分组
    qcut = pd.qcut(p_change, 10)
    # 计算分到每个组数据个数
    qcut.value_counts()
    
    # 自己指定分组区间
    bins = [-100, -7, -5, -3, 0, 3, 5, 7, 100]
    p_counts = pd.cut(p_change, bins)
    
  • one-hot编码

    把每个类别生成一个布尔列,这些列中只有一列可以为这个样本取值为1.其又被称为热编码。

    pandas.get_dummies(data, prefix=None)。prefix:分组名字

    如下图所示:

    image-20190316224151504
    # 得出one-hot编码矩阵
    dummies = pd.get_dummies(p_counts, prefix="rise")
    
    哑变量矩阵
7.3 合并
  • pd.concat

    pd.concat([data1, data2], axis=1)。按照行或列进行合并,axis=0为列索引,axis=1为行索引。

    # 将上面处理过的one-hot编码,与原数据按照行索引进行合并
    pd.concat([data, dummies], axis=1)
    
    股票哑变量合并
  • pd.merge

    pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None)。可以指定按照两组数据的共同键值对进行合并或者左右各自

    • left: A DataFrame object
    • right: Another DataFrame object
    • on: Columns (names) to join on. Must be found in both the left and right DataFrame objects.
    • left_on=None, right_on=None:指定左右键
    Merge methodSQL Join NameDescription
    leftLEFT OUTER JOINUse keys from left frame only
    rightRIGHT OUTER JOINUse keys from right frame only
    outerFULL OUTER JOINUse union of keys from both frames
    innerINNER JOINUse intersection of keys from both frames
    left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                            'key2': ['K0', 'K1', 'K0', 'K1'],
                            'A': ['A0', 'A1', 'A2', 'A3'],
                            'B': ['B0', 'B1', 'B2', 'B3']})
    
    right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                            'key2': ['K0', 'K0', 'K0', 'K0'],
                            'C': ['C0', 'C1', 'C2', 'C3'],
                            'D': ['D0', 'D1', 'D2', 'D3']})
    
    # 默认内连接
    result = pd.merge(left, right, on=['key1', 'key2'])
    
    内连接
    # 左链接
    result = pd.merge(left, right, how='left', on=['key1', 'key2'])
    
    左连接
    # 右链接
    result = pd.merge(left, right, how='right', on=['key1', 'key2'])
    
    右连接
    # 外链接
    result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
    
    外链接
7.4 交叉表与透视表
  • 交叉表

    交叉表用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)

    • pd.crosstab(value1, value2)
    • DataFrame.pivot_table([], index=[])
  • 透视表

    # 通过透视表,将整个过程变成更简单一些
    data.pivot_table(['posi_neg'], index='week')
    
7.5 分组与聚合

分组与聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况

  • 分组

    DataFrame.groupby(key, as_index=False)。

    • key:分组的列数据,可以多个
    # 导入星巴克店的数据
    starbucks = pd.read_csv("./data/starbucks/directory.csv")
    # 按照国家分组,求出每个国家的星巴克零售店数量
    count = starbucks.groupby(['Country']).count()
    count['Brand'].plot(kind='bar', figsize=(20, 8))
    plt.show()
    

小结:

关于Pandas的总结暂时告一段落,重点是在于日常工作中的使用,写多了就都会了,就是这么简单。好了,接下来我们开始大数据相关组件的总结学习。

一起进步,加油!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值