6)Pandas画图
- DataFrame.plot(kind=‘line’)
- kind : str,需要绘制图形的种类
- line : line plot 折线图 默认的
- bar:柱状图
- barh:horizontal bar plot
- hist :直方图
- pie:饼图
- scatter:散点图
- kind : str,需要绘制图形的种类
2.pands.Series.plot
7)Pandas文件读取与存储
1.CSV
1.1 read_csv
- pands.read_csv(filepath_or_buffer,sep=’,’)
- filepath_or_buffer:文件的路径
- usecols:指定读取的列名,列表形式
1.2 to _csv
- DataFrame.to_csv(filepath_or_buffer,sep=’,’,columns=None,header=True,index=True,mode=‘w’,encoding=None)
- filepath_or_buffer:文件路径
- sep:分隔符,默认用’,'隔开
- columns:选择需要保存的列索引
- header:是否写进列索引,默认为True
- index:是否写进行索引
- mode=‘w’,重写 mode=‘a’ 追加数据
2.HDF5
2.1read_hdf 和to_hdf
HDF5文件的读取和存储需要指定一个键,值为要存储的DataFrame
- pands.read_hdf(filepath_or_buffer,key,**kwargs)
- filepath_or_buffer:文件路径
- key:读取的键
- return : Theselected object
- DataFrame.to_hdf(filepath_or_buffer,key,**kwargs)
3.JSON
JSON是我们常用的一种数据交换格式,经常在前后端交互和存储的时候使用到这种数据格式。
Pandas也有自己的读取和存储JSON的格式!
3.1 read_json
-
pandas.read_json(filepath_or_buffer,orient,typ,lines)
-
将JSON格式转换成默认的Pandas DataFrame格式
-
orient :str,数据的存储格式
-
-
‘split’ : dict like {index -> [index], columns -> [columns], data -> [values]}
- split 将索引总结到索引,列名到列名,数据到数据。将三部分都分开了
-
‘records’ : list like [{column -> value}, … , {column -> value}]
- records 以
columns:values
的形式输出
- records 以
-
‘index’ : dict like {index -> {column -> value}}
- index 以
index:{columns:values}...
的形式输出
- index 以
-
‘columns’ : dict like {column -> {index -> value}}
,默认该格式
- colums 以
columns:{index:values}
的形式输出
- colums 以
-
‘values’ : just the values array
- values 直接输出值
-
-
-
lines : boolean, default False
- 按照每行读取json对象
-
typ : default ‘frame’, 指定转换成的对象类型series或者dataframe
-
3.2 to_json
- DataFrame.to_json(filepath_or_buffer,orient,lines)
- 将pandas对象存储为json格式
- filepath_or_buffer:文件路径
- orient:存储的json格式{‘split’,‘records’,‘index’,‘columns’,‘values’}
- lines:一个对象存储为一行
说明:
推荐使用HDF5文件存储
- HDF5支持压缩
- 节省空间
- 支持跨平台
8)缺失值处理
1.如何处理nan
-
如果缺失值的标记方式是NaN
-
判断数据中是否包含NaN
-
pd.isnull(df)
- pd.notnull(df)
-
存在缺失值NaN,并且是np.NaN
-
1.存在缺失值的: dropna(axis=‘rows’)
注意:这个不会修改原数据,需要接受返回值
-
2.替换缺失值:finllna(value,inplace=True)
-
-
vlaue:替换成的值
- inplace : True 会修改原数据, False 会生成新对象
-
-
如果缺失值没有用NaN标记,比如使用’?’
- 先替换’?'为np.nan,然后再drapna(axis=‘rows’)
2.示例
# 读取数据
movie = pd.read_csv("movie.csv")
# 判断缺失值是否存在
movie.notnull().all()
# 存在缺失值NaN,并且缺失值的np.nan的处理方案
# 第一种方法.删除
data = movie.dropna()
# 第二种方法.替换
for i in movie.columns:
if np.all(pd.notnull(movie[i])) == False:
movie[i].fillna(movie[i].mean(),inplace=True)
# 存在默认标记的 如 '?'
# 先将'?'替换为np.nan
data = data.replace(to_replace='?',value=np.nan)
# 然后再删除np.nan
data.dropna()
9)数据离散化
1.为什么要进行离散化?
连续数据离散化的目的是为了简化数据结果,数据离散化技术可以用来减少给定连续属性值的个数。离散化的方法常作为数据挖掘的工具。
2.什么是数据的离散化?
连续数据的离散化就是在连续属性的值域上,将值域划分为若干个离散的区间,最后用不同的符号或整数值代表落在每个子区间中的属性值。
3.分组工具
-
pd.quct(data,q):自动分组
- 对数据进行分组,一般会与value_counts搭配使用,统计每组的个数
-
series.value_counts():统计分组次数
-
pd.cut(data,bins):自定义分组区间
4.示例
# 读取数据
data = pd.read_csv("stock_day.csv")
p_change = data['p_change']
# 自行分组
qcut = pd.qcut(p_change,10)
# 计算每个组的数据个数
qcut.value_counts()
# 自定义区间分组
bins = [-1,1,5,10,13,16,20]
p_counts = pd.cut(p_change,bins=bins)
5.将股票涨跌幅分组数据变成ont-hot编码
5.1什么是one-hot编码?
把每个类别生成一个布尔列,这些列中之后一列可以为这个样本取值为1,其又被称为热编码
- pandas.get_dummies(data,prefis=None)
- data:array-like,Series,DataFrame
- prefix:分组名字(前缀名)
# 得出one-hot编码矩阵
dummies = pd.get_dummies(p_counts,prefix='test')
10)合并
1.pd.concat 实现数据合并
- pd.concay([data1,data2],axis=1)
- 按照行或列进行合并,axis=0为列索引,axis=1为行索引
# 按照行索引进行合并
pd.concat([data,dummies],axis=1)
2.pd.merge
- pd.merge(lef,rigt,how=‘inner’,on=None)
- 可以指定按照两组数据的共同键值对合并或者左右各自合并
- left :DataFrame
- right:另一个DataFrame
- on:指定的共同键
- how:按照什么方式连接
2.1 pd.merge 合并
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']})
# 默认内连接合并
# 就是将left和right中共同有key1,key的数据合并起来,其他的不要
result = pd.merge(left,right,on=['key1','key2'])
# 左连接
# 就是以left表为主合并右表,左表数据全部显示,右表中跟随左边,没有的数据用NaN表示
result = pd.merge(left,right,how='left',on=['key1','key2'])
# 右连接
# 和左连接相反
result = pd.merge(left,right,how='right',on=['key1','key2'])
# 外连接
# 将left和right的所有数据连接起来,没有的数据用NaN表示
result = pd.merge(left,right,how='outer',on=['key1','key2'])
11)交叉表与透视表
1.交叉表与透视表有什么用?
- 交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表)
- pd.crosstab(value1,value2)
- 透视表:透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数
- data.pivor_table()
- DataFrame.pivor_table([],index=[])
2.案例分析
-
准备两列数据,星期数据以及涨跌幅是好是坏数据
-
进行交叉表计算
# 寻找星期几和股票涨幅的关系 # 1.先把对应的日期找到星期几 date = pd.to_datetime(data.index).weekday data['week'] = date # 2.假如把p_change按照大小去分个类0为界限 data['posi_neg'] = np.where(data['p_change'] > 0 ,1, 0) # 通过交叉表找寻两列数据的关系 count = pd.croesstab(data['week'],data['post_neg'])
但是我们看到count只是每个星期日子的好坏天数,并没有得到比例,该怎么去做?
-
对于每个星期的总天数求和,运用触发运算出比例
# 算数运算,求和 sum_ = count.sum(axis=1).astype(np.float32) # 进行相除,得出比例 result = count.div(sum_,axis=0)
-
使用plot画出柱状图,查看结果
result.plot(kind='bar',stacker=True) plt.show()
-
使用pivor_table(透视表)实现
透视表会使刚才的过程更加简单
data.pivot_table(['posi_neg'],index='week')
12)分组和聚合
1.1什么是分组和聚合?
分组和聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组请求。
pandas中抛开聚合谈分组无意义。
2.分组的API
- DataFrame.groupby(key,as_index=False)
- key:分组的列依据,可以是列表
- 案例:不同颜色的不同笔的价格数据
col =pd.DataFrame({'color': ['white','red','green','red','green'], 'object': ['pen','pencil','pencil','ashtray','pen'],'price1':[5.56,4.20,1.30,0.56,2.75],'price2':[4.75,4.12,1.60,0.75,3.15]})
# 数据结果如下:
color object price1 price2
0 white pen 5.56 4.75
1 red pencil 4.20 4.12
2 green pencil 1.30 1.60
3 red ashtray 0.56 0.75
4 green pen 2.75 3.15
- 进行分组,对颜色分组,price进行聚合
# 分组,求平均值
col.groupby(['color'])['price1'].mean()
# 结果
color
green 2.025
red 2.380
white 5.560
Name: price1, dtype: float64
# 分组,数据的结构不变
col.groupby(['color'],as_index=False)['price1'].mean()
# 结果
color price1
0 green 2.025
1 red 2.380
2 white 5.560
13)小案例
问题1:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获取?
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv("movie.csv")
# 平均分
df['Rating'].mean()
# 导演人数
np.unique(df['Director']).shape[0]
问题2:对于这一组电影数据,如果我们想rating的分布情况,应该如何呈现数据?
# 1 直接展示
df['Rating'].plot(kind='hist',figsize=(20,8))
# 2 详细展示
plt.figure(figsize=(20,8),dpi=100)
plt.hist(df['Rating'],bins=20)
max_ = df['Rating'].max()
min_ = fd['Rating'].min()
plt.xticks(np.linspace(min_,max_,num=21))
plt.grid()
plt.show()
问题3:对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?
思路分析
-
思路
- 1、创建一个全为0的dataframe,列索引置为电影的分类,temp_df
- 2、遍历每一部电影,temp_df中把分类出现的列的值置为1
- 3、求和
-
1.创建一个全是0的df,索引为电影分类
# 进行字符串分割 temp_list = [i.split(',') for i in df['Genre']] # 获取电影的分类 genre_list = np.unique([j for i in temp_list for j in i]) # 添加新的列 temp_df = pd.DataFrame(np.zeros([df.shape[0],genre_list.shape[0]]),colums=genre_list)
-
2.遍历每一部电影,将分类中出现的列置为1
for i in range(1000): temp_df.ix[i,temp_list[i]] = 1
-
3.求和 绘图
temp_df.sum().sort_values(ascending=False).plot(kind='bar',figsize=(20,8),colormap='cool')