每日分享
Attitude is a little thing that makes a big difference.
态度是件小事,但却意义重大。
小闫语录:
一个态度端正,对事认真的人,即使能力欠佳,最后的成果肯定不会太差。一个能力突出,但是态度不端,眼高手低的人,即使完成了任务,效果也未必见好。用人,做人,态度须为第一。
Pandas
1.Pandas介绍
1.1Pandas与Numpy的不同?
答:Numpy是一个科学计算库,用于计算,提高计算效率。Pandas是专门用于数据挖掘的开源python库,也可用于数据分析。Pandas以Numpy为基础,借力Numpy模块在计算方面性能高的优势;同时基于matplotlib,能够简便的画图。Pandas对二者进行封装,使数据处理更加的便捷。
1.2初识两个方法
1. pd.DataFrame(ndarry, index=xx, columns=xx) 2. # index:行索引 3. # columns:列索引 1. date_range(start=xx, end=xx, periods=xx, freq='B') 2. # start:开始时间 3. # end:结束时间 4. # periods:时间天数 5. # 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文件存储
- HDF5在存储的时候支持压缩,使用的方式是blosc,这个是速度最快的也是pandas默认支持的。
- 使用压缩可以提磁盘利用率,节省空间。
- 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",以
columns:values
的形式输出。 - 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 -- 当前列是否当成索引
注意:分组聚合一般放到一起使用,抛开聚合,只说分组,没有意义.