python 数据分析----pandas

pandas是一个强大的Python数据分析的工具包。

pandas是基于NumPy构建的。

pandas的主要功能

  • 具备对其功能的数据结构DataFrame、Series
  • 集成时间序列功能
  • 提供丰富的数学运算和操作
  • 灵活处理缺失数据

安装方法:pip install pandas

引用方法:import pandas as pd

Series:

是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,Python对象等)。轴标签统称为索引创建Series的基本方法是调用:

s = pd.Series(data, index=index)

data 可以是:

  • Python dict(字典)
  • ndarray
  • 数字

如果data是ndarray,则索引必须与数据长度相同。如果没有传递索引,将创建值为[0, ..., len(data) 1]的索引。

In [125]: import pandas as pd

In [126]: a = pd.Series([4,7,-5,3],index=['a','b','c','d'])

In [127]: a
Out[127]: 
a    4
b    7
c   -5
d    3
dtype: int64


In [130]: b = pd.Series({'a':1,'b':2})

In [131]: b
Out[131]: 
a    1
b    2
dtype: int64

获取值数组和索引数组:values属性和index属性

In [133]: a.values
Out[133]: array([ 4,  7, -5,  3])

In [134]: a.index
Out[134]: Index(['a', 'b', 'c', 'd'], dtype='object')

Series特性:

  • 从ndarray创建Series:Series(arr)
    In [140]: arr = np.array([1,2,3,4,5]) #必须是一维数组
    
    In [141]: a = pd.Series(arr)
    
    In [142]: a
    Out[142]: 
    0    1
    1    2
    2    3
    3    4
    4    5
    dtype: int64
  • 与标量运算:sr*2
    In [142]: a
    Out[142]: 
    0    1
    1    2
    2    3
    3    4
    4    5
    dtype: int64
    
    In [143]: a*2
    Out[143]: 
    0     2
    1     4
    2     6
    3     8
    4    10
    dtype: int64
  • 两个Series运算:sr1+sr2. 注意索引得一样,否则报NaN错误(not a number)
    In [145]: b
    Out[145]: 
    a    4
    b    7
    c   -5
    d    3
    e    0
    dtype: int64
    
    In [146]: a
    Out[146]: 
    0    1
    1    2
    2    3
    3    4
    4    5
    dtype: int64
    
    In [147]: b+a
    Out[147]: 
    a   NaN
    b   NaN
    c   NaN
    d   NaN
    e   NaN
    0   NaN
    1   NaN
    2   NaN
    3   NaN
    4   NaN
    dtype: float64
    
    
    In [150]: b = pd.Series(np.arange(5))
    
    In [151]: a
    Out[151]: 
    0    1
    1    2
    2    3
    3    4
    4    5
    dtype: int64
    
    In [152]: b
    Out[152]: 
    0    0
    1    1
    2    2
    3    3
    4    4
    dtype: int64
    
    In [153]: a+b
    Out[153]: 
    0    1
    1    3
    2    5
    3    7
    4    9
    dtype: int64
  • 索引:sr[0], sr[[1,2,4]]
    In [157]: b
    Out[157]: 
    a    4
    b    7
    c   -5
    d    3
    e    0
    dtype: int64
    
    In [158]: b[0]
    Out[158]: 4
    
    In [159]: b['a']
    Out[159]: 4
  • 切片:sr[0:2](切片依然是视图形式,浅拷贝)
    In [161]: b[1:3]
    Out[161]: 
    b    7
    c   -5
    dtype: int64
    
    In [162]: b['b':'d']
    Out[162]: 
    b    7
    c   -5
    d    3
    dtype: int64
    
    In [163]: b['b':'c']
    Out[163]: 
    b    7
    c   -5
    dtype: int64
  • 通用函数:np.abs(sr)
  • 布尔值过滤:sr[sr>0]
    In [164]: b
    Out[164]: 
    a    4
    b    7
    c   -5
    d    3
    e    0
    dtype: int64
    
    In [165]: b[b>3]
    Out[165]: 
    a    4
    b    7
    dtype: int64
  • 统计函数:mean() sum() cumsum()
    In [169]: b
    Out[169]: 
    a    4
    b    7
    c   -5
    d    3
    e    0
    dtype: int64
    
    In [170]: b.mean()
    Out[170]: 1.8
    
    In [171]: b.sum()
    Out[171]: 9
    
    In [173]: b.cumsum(). #每个数字与这列之前的数据的和
    Out[173]: 
    a     4
    b    11
    c     6
    d     9
    e     9
    dtype: int64
  • Series支持字典的特性(标签):
    • 从字典创建Series:Series(dic), 
    • in运算:’a’ in sr、for x in sr
    • 键索引:sr['a'], sr[['a', 'b', 'd']]
    • 键切片:sr['a':'c']
    • 其他函数:get('a', default=0)等

整数索引:

如果索引是整数类型,则根据整数进行数据操作时总是面向标签的。

  • loc属性 以标签解释
  • iloc属性 以下标解释 
In [178]: sr = pd.Series(np.arange(4.))

In [179]: sr
Out[179]: 
0    0.0
1    1.0
2    2.0
3    3.0
dtype: float64

In [185]: sr.iloc[0]
Out[185]: 0.0

In [186]: sr.loc[0]
Out[186]: 0.0

Series数据对齐

  pandas在运算时,会按索引进行对齐然后计算。如果存在不同的索引,则结果的索引是两个操作数索引的并集。

  • sr1.add(sr2, fill_value=0)
  • 灵活的算术方法:add, sub, div, mul
In [189]: sr1
Out[189]: 
c    12
a    23
d    34
dtype: int64

In [190]: sr2
Out[190]: 
d    11
c    20
a    10
dtype: int64

In [191]: sr1+sr2
Out[191]: 
a    33
c    32
d    45
dtype: int64

In [192]: sr3 = pd.Series([11,20,10,14], index=['d','c','a','b'])

In [193]: sr2+sr3
Out[193]: 
a    20.0
b     NaN
c    40.0
d    22.0
dtype: float64


In [194]: sr2.add(sr3,fill_value = 0)
Out[194]: 
a    20.0
b    14.0
c    40.0
d    22.0
dtype: float64
  • 缺失数据:使用NaN(Not a Number)来表示缺失数据。其值等于np.nan。内置的None值也会被当做NaN处理。
  • 处理缺失数据的相关方法:
    • dropna() 过滤掉值为NaN的行
    • fillna() 填充缺失数据
    • isnull() 返回布尔数组,缺失值对应为True
    • notnull() 返回布尔数组,缺失值对应为False
  • 过滤缺失数据:sr.dropna() 或 sr[data.notnull()]
  • 填充缺失数据:fillna(0)

DataFrame

DataFrame是一个表格型的数据结构,含有一组有序的列。

DataFrame可以被看做是由Series组成的字典,并且共用一个索引。

创建方式:

  • pd.DataFrame({'one':[1,2,3,4],'two':[4,3,2,1]})
  • pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two':pd.Series([1,2,3,4],index=['b','a','c','d'])})
In [195]: df = pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']), 'two'
     ...: :pd.Series([1,2,3,4],index=['b','a','c','d'])})

In [196]: df
Out[196]: 
   one  two
a  1.0    2
b  2.0    1
c  3.0    3
d  NaN    4

csv文件读取与写入:

  • df.read_csv('filename.csv')
  • df.to_csv()

常用属性及方法:

  • T 转置
  • index 获取索引
  • columns 获取列索引
  • values 获取值数组
    In [213]: df
    Out[213]: 
       one  two
    a  1.0    2
    b  2.0    1
    c  3.0    3
    d  NaN    4
    
    In [214]: df.index
    Out[214]: Index(['a', 'b', 'c', 'd'], dtype='object')
    
    In [215]: df.columns
    Out[215]: Index(['one', 'two'], dtype='object')
    
    In [216]: df.values
    Out[216]: 
    array([[  1.,   2.],
           [  2.,   1.],
           [  3.,   3.],
           [ nan,   4.]])

索引和切片:

In [196]: df
Out[196]: 
   one  two
a  1.0    2
b  2.0    1
c  3.0    3
d  NaN    4

In [197]: df['one'] #只能是列名
Out[197]: 
a    1.0
b    2.0
c    3.0
d    NaN
Name: one, dtype: float64
In [221]: df
Out[221]: 
   one  two
a  1.0    2
b  2.0    1
c  3.0    3
d  NaN    4

In [222]: df.loc['a',df.columns[1]] #行和列
Out[222]: 2

通过位置获取:

  • df.iloc[3]
  • df.iloc[3,3]
  • df.iloc[0:3,4:6]
  • df.iloc[1:5,:]
  • df.iloc[[1,2,4],[0,3]]

通过布尔值过滤:

  • df[df['A']>0]
  • df[df['A'].isin([1,3,5])]
    In [237]: df['one'].isin([1.0,3.0])
    Out[237]: 
    a     True
    b    False
    c     True
    d    False
    Name: one, dtype: bool
  • df[df<0] = 0

DataFrame数据对齐与缺失数据:

DataFrame处理缺失数据的方法:

  • dropna(axis=0, how='any',…) #默认删一行,axis = o 删行,axis = 1 删列
  • In [261]: df
    Out[261]: 
       one  two    1
    a  1.0  2.0  NaN
    b  2.0  1.0  1.0
    c  3.0  3.0  NaN
    d  NaN  NaN  NaN
    3  1.0  1.0  1.0
    
    In [262]: df.dropna()
    Out[262]: 
       one  two    1
    b  2.0  1.0  1.0
    3  1.0  1.0  1.0
    
    In [263]: df.dropna(axis=1)
    Out[263]: 
    Empty DataFrame
    Columns: []
    Index: [a, b, c, d, 3]
  • fillna()
  • isnull()
  • notnull()
In [223]: df
Out[223]: 
   one  two
a  1.0    2
b  2.0    1
c  3.0    3
d  NaN    4

In [224]: df.fillna(11)
Out[224]: 
    one  two
a   1.0    2
b   2.0    1
c   3.0    3
d  11.0    4

pandas常用方法(适用Series和DataFrame):

  • mean(axis=0,skipna=False)
  • sum(axis=1)
  • sort_index(axis, …, ascending) 按行或列索引排序
  • sort_values(by, axis, ascending) 按值排序
  • NumPy的通用函数同样适用于pandas 
  • apply(func, axis=0) 将自定义函数应用在各行或者各列上 ,func可返回标量或者Series
  • applymap(func) 将函数应用在DataFrame各个元素上
  • map(func) 将函数应用在Series各个元素上

层次化索引

  • 层次化索引是Pandas的一项重要功能,它使我们能够在一个轴上拥有多个索引级别。
  • 例:data=pd.Series(np.random.rand(9), index=[['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c'], [1,2,3,1,2,3,1,2,3]])

从文件读取

  • 读取文件:从文件名、URL、文件对象中加载数据
    • read_csv 默认分隔符为csv
    • read_table 默认分隔符为\t
    • read_excel 读取excel文件
  • 读取文件函数主要参数:
    • sep 指定分隔符,可用正则表达式如'\s+'
    • header=None 指定文件无列名
    • name 指定列名
    • index_col 指定某列作为索引
    • skip_row 指定跳过某些行
    • na_values 指定某些字符串表示缺失值
    • parse_dates 指定某些列是否被解析为日期,布尔值或列表
  • 写入到文件:
    • to_csv
  • 写入文件函数的主要参数:
    • sep
    • na_rep 指定缺失值转换的字符串,默认为空字符串
    • header=False 不输出列名一行
    • index=False 不输出行索引一列
  • 其他文件类型:json, XML, HTML, 数据库
  • pandas转换为二进制文件格式(pickle):
    • save
    • load

时间对象处理(常作为索引):

  • 第三方包:dateutil
    • dateutil.parser.parse()
  • 成组处理日期:pandas
    • pd.to_datetime(['2001-01-01', '2002-02-02'])
  • 产生时间对象数组:date_range
    • start 开始时间
    • end 结束时间
    • periods 时间长度
    • freq 时间频率,默认为'D',可选H(our),W(eek),B(usiness),S(emi-)M(onth),(min)T(es), S(econd), A(year),…

时间序列就是以时间对象为索引的Series或DataFrame。

  • datetime对象作为索引时是存储在DatetimeIndex对象中的。
  • 时间序列特殊功能:
    • 传入“年”或“年月”作为切片方式
    • 传入日期范围作为切片方式
df = pd.read_csv('601318.csv',index_col='date',parse_dates=['date'],)


In [266]: df

Out[266]: 

            Unnamed: 0    open   close    high     low      volume    code

date                                                                      

2007-03-01           0  22.074  20.657  22.503  20.220  1977633.51  601318

2007-03-02           1  20.750  20.489  20.944  20.256   425048.32  601318

2007-03-05           2  20.300  19.593  20.384  19.218   419196.74  601318

2007-03-06           3  19.426  19.977  20.308  19.315   297727.88  601318

2007-03-07           4  19.995  20.520  20.706  19.827   287463.78  601318

2007-03-08           5  20.353  20.273  20.454  20.167   130983.83  601318

2007-03-09           6  20.264  20.101  20.353  19.735   160887.79  601318

2007-03-12           7  19.999  19.739  19.999  19.646   145353.06  601318

2007-03-13           8  19.783  19.818  19.982  19.699   102319.68  601318

2007-03-14           9  19.558  19.841  19.911  19.333   173306.56  601318

2007-03-15          10  20.097  19.849  20.525  19.779   152521.90  601318

2007-03-16          11  19.863  19.960  20.286  19.602   227547.24  601318

2007-03-20          12  20.662  20.211  20.715  20.088   222026.87  601318

2007-03-21          13  20.220  19.911  20.308  19.823   136728.32  601318

2007-03-22          14  20.066  20.026  20.273  19.969   167509.84  601318

2007-03-23          15  20.017  19.938  20.101  19.739   139810.14  601318

2007-03-26          16  19.955  20.282  20.397  19.946   223266.79  601318

2007-03-27          17  20.216  20.269  20.467  20.145   139338.19  601318

2007-03-28          18  20.264  20.565  20.706  20.123   258263.69  601318

df[df['close']>df['open']] #时间索引的好处
posted @ 2017-10-30 17:15  皖心  阅读(493)  评论(0编辑  收藏  举报