正文共: 6791字 5 图

预计阅读时间: 17 分钟

Pandas_数据

每日分享

Attitude is a little thing that makes a big difference.

态度是件小事,但却意义重大。

小闫语录​:

一个态度端正,对事认真的人,即使能力欠佳,最后的成果肯定不会太差。一个能力突出,但是态度不端,眼高手低的人,即使完成了任务,效果也未必见好。用人,做人,态度须为第一。


Pandas_json_02


Pandas

1.Pandas介绍

1.1Pandas与Numpy的不同?

答:Numpy是一个科学计算库,用于计算,提高计算效率。Pandas是专门用于数据挖掘的开源python库,也可用于数据分析。Pandas以Numpy为基础,借力Numpy模块在计算方面性能高的优势;同时基于matplotlib,能够简便的画图。Pandas对二者进行封装,使数据处理更加的便捷。

1.2初识两个方法

pd.DataFrame(ndarry, index=xx, columns=xx)
# index:行索引
# columns:列索引


date_range(start=xx, end=xx, periods=xx, freq='B')
# start:开始时间
# end:结束时间
# periods:时间天数
# freq:递进单位,默认1天,'B'默认略过周末

1.3DataFrame

类似于数组中的二维数组。或者简单的理解为一张表。DataFrame对象既有行索引,又有列索引。

a.行索引,表明不同行,横向索引,叫index,0轴,axis=0。

b.列索引,表名不同列,纵向索引,叫columns,1轴,axis=1。

1.3.1属性和方法


  • shape -- 形状(维度的元组)
  • index -- 行索引

修改行索引:xx.index = xx
重设索引:xx.reset_index(drop=False)
设置新的下标索引。
drop:默认为False,不删除原来索引,如果为True,删除原来的索引值。
以某列值设置为新的索引:set_index(keys, drop=True)
keys:列索引名称或者列索引名称的列表。如果是多列,变为multindex
drop:布尔值,默认是True。当做新的索引,删除原来的列。

  • columns -- 列索引
  • values -- 值
  • ndarray.T -- 转置
  • head() -- 前几行(括号里面如果不指定参数,默认是5行)
  • tail() -- 后几行(括号里面如果不指定参数,默认是5行)

1.4MultiIndex与Panel

MultiIndex是多级或者分层索引对象。它是新的三维数组存储方式,通过index获取所有的索引。

index属性:


  • names:levels的名称。
  • levels:每个level的元组值。

在Pandas版本0.20.0之前使用Panel结构存储三维数组。它有很大的缺点,比如生成的对象无法直接看到数据,如果需要看到数据,需要进行索引。

pandas.Panel(data=None, items=None, major_axis=None, minor_axis=None, copy=False, dtype=None)
# 介绍几个常用的参数
# items - axis 0,每个项目对应于内部包含的数据帧(DataFrame)。
# major_axis - axis 1,它是每个数据帧(DataFrame)的索引(行)。
# minor_axis - axis 2,它是每个数据帧(DataFrame)的列。

1.5Series

Series类似于前面的一维数组,它只有行索引。

创建Series:

pd.Series()
# 可以指定内容,默认索引,如下:
pd.Series(np.arange(10))
# 也可以指定索引
pd.Series([6.7,5.6,3,10,2], index=[1,2,3,4,5])
# 还可以通过字典数据创建
pd.Series({'red':100, ''blue':200, 'green': 500, 'yellow':1000})

获取索引和值:


  • 对象.index -- 索引
  • 对象.values -- 值

2.基本数据操作

读取文件:

pd.read_csv()

2.1索引操作

可以直接使用行列索引,注意是先列后行,如下:

data['ethanyan']['2019-04-12']

对象.loc[]​-- 先行后列, 通过索引字符串索引。

data.loc['2018-02-27':'2018-02-22', 'ethanyan']

对象.iloc[]​-- 先行后列, 通过索引下标获取。

data.iloc[0:100, 0:2]

对象.ix[]​ -- 先行后列, 下标和字符串都OK。

2.2赋值操作

需求​:对DataFrame当中的Ethanyan列进行重新赋值为1

# 直接修改原来的值data['Ethanyan'] = 1# 或者data.Ethanyan = 1

2.3排序

2.3.1DataFrame

对内容进行排序:

对象.sort_values(by=**, ascending=**)    by  --  "x"         按照一个值排序            ["x","x"]   按照多值排序    ascending -- True(升序), False(降序)

对索引进行排序:

对象.sort_index()

2.3.2Series

同DataFrame一样,可以通过索引和内容进行排序,只是Series只有一列,所以不需要指定参数。

对象.sort_values(ascending=)    ascending=False:降序    ascending=True:升序对象.sort_index()

3.DataFrame运算

3.1算术运算

直接使用 ​+-​,是OK的;也可以使用 ​对象.add()​和 ​对象.sub()​。如:对列open进行 ​+1​操作:

data['open'].add(1)

如:列close减去open列:

data['close'].sub(data['open'])

3.2逻辑运算

3.2.1使用逻辑运算符号 ​< > | &​:

例如筛选p_change > 2的日期数据:

data['p_change'] > 2



2018-02-27 True

2018-02-26 True

2018-02-23 True

2018-02-22 False

2018-02-14 True

例如完成多个逻辑判断, 筛选p_change > 2并且open > 15:

data[(data['p_change'] > 2) & (data['open'] > 15)]









open high
close low volume price_change p_change turnover my_price_change


2017-11-14 28.00 29.89 29.34 27.68 243773.23 1.10 3.90 6.10 1.34

2017-10-31 32.62 35.22 34.44 32.20 361660.88 2.38 7.42 9.05 1.82

2017-10-27 31.45 33.20 33.11 31.45 333824.31 0.70 2.16 8.35 1.66

2017-10-26 29.30 32.70 32.41 28.92 501915.41 2.68 9.01 12.56 3.11

3.2.2逻辑运算函数

对象.query(expr)

  • expr:查询字符串

通过query使得刚才的过程更加方便简单

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

对象.isin(values)

例如判断'turnover'是否为4.19, 2.39

# 可以指定值进行一个判断,从而进行筛选操作

data[data['turnover'].isin([4.19, 2.39])]









open high close low volume price_change p_change turnover my_price_change


2018-02-27 23.53 25.88 24.16 23.53 95578.03 0.63 2.68 2.39 0.63

2017-07-25 23.07 24.20 23.70 22.64 167489.48 0.67 2.91 4.19 0.63

2016-09-28 19.88 20.98 20.86 19.71 95580.75 0.98 4.93 2.39 0.98

2015-04-07 16.54 17.98 17.54 16.50 122471.85 0.88 5.28 4.19 1.00

3.2.3统计函数

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

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

单独的统计函数,我们需要了解一下。例如:min(最小值), max(最大值), mean(平均值), median(中位数), var(方差), std(标准差),mode(众数)。

# 使用统计函数:0 代表列求结果,1 代表行求统计结果data.max(0)

对象.median() -- 中位数

对象.idxmax(axis=) -- 最大值的索引值

对象.idxmin(axis=)

总结如下:


​count​

Number of non-NA observations

​sum​

Sum of values

​mean​

Mean of values

​median​

Arithmetic median of values

​min​

Minimum

​max​

Maximum

​mode​

Mode

​abs​

Absolute Value

​prod​

Product of values

​std​

Bessel-corrected sample standard deviation

​var​

Unbiased variance

​idxmax​

compute the index labels with the maximum

​idxmin​

compute the index labels with the minimum

3.2.4累计统计函数


函数

作用

​cumsum​

计算前1/2/3/…/n个数的和

​cummax​

计算前1/2/3/…/n个数的最大值

​cummin​

计算前1/2/3/…/n个数的最小值

​cumprod​

计算前1/2/3/…/n个数的积

3.2.5自定义运算

对象.apply(func, axis=0)


  • func:自定义函数
  • axis=0:默认是列,axis=1为行进行运算

例如:我们定义一个函数,对列的最大值与最小值做差。

data.apply(lambda x: x.max() - x.min(), axis=0)

4.Pandas画图

对象.plot()    x -- x轴坐标的值    y -- y轴坐标的值    kind -- 画什么样的图        line -- 折线图        bar(barh) -- 柱状图        hist -- 直方图        pie -- 饼图        scatter -- 散点图

5.文件读取与存储

5.1csv文件

读取read_csv:

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


  • filepath_or_buffer:文件路径
  • usecols:指定读取的列名,列表形式

写入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,是否写进列索引值

5.2hdf文件

HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame

读取read_hdf​:

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


  • 从h5文件当中读取数据
  • path_or_buffer:文件路径
  • key:读取的键
  • return:Theselected object

写入to_hdf​:

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


注意​:最后保存内容是 xx.h5

官方推荐使用


优先选择使用HDF5文件存储


  1. HDF5在存储的时候支持压缩,​使用的方式是blosc,这个是速度最快​的也是pandas默认支持的。
  2. 使用压缩可以​提磁盘利用率,节省空间。
  3. HDF5还是跨平台的,可以轻松迁移到hadoop 上面。

5.3json文件

JSON是我们常用的一种数据交换格式,前面在前后端的交互经常用到,也会在存储的时候选择这种格式。所以我们需要知道Pandas如何进行读取和存储JSON格式。

读取read_json​:

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


  • path -- 路径
  • orient -- "records",以 ​columnsvalues​的形式输出。
  • lines -- 需要和之前的方式相同,按照每行读取json对象。
  • typ : default ‘frame’, 指定转换成的对象类型series或者dataframe

写入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:一个对象存储为一行,一般时,写入传递使用True。

6.高级处理-缺失值处理

首先需要判断是否有缺失值,也就是是否为NaN:

pd.isnull()pd.notnull()

如果有,需要进行进行处理:

a.缺失值是nan,直接处理

  • 删除np.dropna()
  • 替换np.fillna(value, inplace=True)

  • value:替换成的值
  • inplace:True:会修改原数据,False:不替换修改原数据,生成新的对象

b.缺失值不是nan,替换成nan再处理

np.replace(to_replace="?", value=np.nan)

7.高级处理-数据离散化

7.1为什么要离散化?

答:连续属性离散化的目的是为了简化数据结构,​数据离散化技术可以用来减少给定连续属性值的个数​。离散化方法经常作为数据挖掘的工具。

7.2什么是数据的离散化?

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

简单的说,就是对数据进行分类。

7.3使用方法

pd.qcut(data, bins):


  • 把数据分成大致相等的几类。一般会与value_counts搭配使用,统计每组的个数。
  • bins -- 需要分成几类

series.value_counts():

  • 统计分组次数

pd.cut(data, bins):


  • data -- 指定分组的间隔
  • bins -- 在哪儿进行分割

7.4one_hot编码(热独编码,哑变量)

什么是one_hot编码?

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

pandas.get_dummies(data, prefix=None)


  • data:array-like, Series, or DataFrame
  • prefix:分组名字

8.高级处理-合并

pd.concat([], axis=)


  • 按照行或列进行合并。
  • [xx, xx] 合并的两张表。
  • axis=0为列索引,axis=1为行索引。

pd.merge()


  • left和right是DataFrame结构数据。
  • how -- 按照什么方式进行连接(左连接、右连接、外连接、内连接),默认是内连接。
  • on -- 依据哪几个键

9.高级处理-交叉表与透视表

pd.crosstab(*, *)


  • 交叉表
  • 返回对象是具体的数据统计

pd.pivot_table([], index="")


  • 透视表
  • [] -- 比较内容
  • index=xx -- 按照比较的标准
  • 直接返回对应的占比情况

10.高级处理-分组与聚合

对象.groupby(key, as_index=False).max()


  • key -- 按照哪个键进行分组
  • key值也可以传多个,然后通过多个标准进行分组
  • as_index -- 当前列是否当成索引

注意​:分组聚合一般放到一起使用,抛开聚合,只说分组,没有意义.


Pandas_数据_03


Pandas_json_04