- 1 pandas介绍
- 1.1 Pandas介绍
- 1.2 为什么使用Pandas
- 1.3 案例:在numpy当中创建的股票涨跌幅数据形式
- 1.4 Dataframe
- 1.4.1 Dataframe结构
- 1.4.2 Datatframe的常用属性和方法
- 1.4.3 Datatframe索引的设置
- 修改行列索引值
- 重设索引
- 1.6 Series结构
- 1.6.1 创建series
- 1.6.2 series获取索引和值
- 1.7 小结
- 2 基本数据操作
- 2.1 索引操作
- 2.1.1 直接使用行列索引(先列后行)
- 2.1.2 结合loc或者iloc使用索引
- 2.1.3 使用ix组合索引(已官方弃用)
- 2.2 赋值操作
- 2.3 排序
- Dataframe排序
- Series
- 2.4 总结
- 3 Dataframe运算
- 3.1 算术运算
- 3.2 逻辑运算
- 3.2.1 逻辑运算符号<、 >、|、 &
- 筛选单个结果
- 完成多个逻辑判断
- 3.2.2 逻辑运算函数
- 3.3 统计运算
- 3.3.1 describe()
- 3.3.2 统计函数
- 3.4 累计统计函数
- 3.5 自定义运算
- 案例:定义一个对列,最大值-最小值的函数
- 4 Pandas画图
- 4.1 pandas.Dataframe.plot
- 4.2 pandas.Series.plot
- 4.5 文件读取与存储
- 5.1 CSV
- 5.1.1 读取csv文件-read_csv
面板 数据 (三维数据)分析 计量经济学(数据分析80% 跑计量20%)
- 以Numpy为基础,借力Numpy模块在计算方面性能高的优势
- 基于matplotlib,能够简便的画图
- 独特的数据结构
- 便捷的数据处理能力
- 读取文件方便
- 封装了Matplotlib、Numpy的画图和计算
import numpy as np import pandas as pd # 创建一个符合正态分布的10个股票5天的涨跌幅数据 st_change = np.random.normal(0,1,(10,5)) st_change
这样的数据形式很难看到存储的是什么样的数据,并且也很难获取相应的数据,比如需要获取某个指定股票的数据,就很难去获取!!
- 让数据更有意义的显示
给股票涨跌幅数据增加行列索引,显示效果更佳
# 使用Pandas中的数据结构 st_change = pd.Dataframe(st_change) st_change
- 增加行索引
错误写法:以下书写的代码可能会出现全Nan值
# 错误 # 构造行索引序列 st_code = ['股票'+str(i) for i in range(st_change.shape[0])] print(st_code) # 添加行索引 data = pd.Dataframe(st_change, index=st_code) data
正确写法:
方法1:对dataframe结构的行索引index直接更改,有可能出问题,取决于赋什么值。以前这样做可以,现在不太推荐了
print(st_change.shape) print(st_change.shape[0]) print(st_change.shape[1]) # 构造行索引序列 st_code = ['股票'+ str(i) for i in range(st_change.shape[0])] print(st_code) # 添加行索引 data = pd.Dataframe(st_change) data.index = st_code data
方法2:用rename方法改
df.rename(index={原行索引名:替换行索引名})
待增加
- 增加列索引
股票的日期是一个时间的序列,我们要实现从前往后的时间还要考虑每月的总天数等,不方便。使用pd.date_range():用于生成一组连续的时间序列(暂时了解)
date_range(start=None,end=None, periods=None, freq='B') start:开始时间 end:结束时间 periods:时间天数 freq:递进单位,默认1天,'B'默认略过周末 # 生成一个时间的序列,略过周末非交易日
以下是错误代码,和上面可能出现错误的写法一样,全体nan值
# 生成一个时间的序列,略过周末非交易日
date = pd.date_range('2017-01-01', periods=stock_change.shape[1], freq='B')
# index代表行索引,columns代表列索引
data = pd.Dataframe(stock_change, index=stock_index, columns=date)
正确代码
# 增加列索引
# 股票的日期是一个时间的序列,我们要实现从前往后的时间还要考虑每月的总天数等,不方便。使用
# pd.date_range():用于生成一组连续的时间序列(暂时了解)
# 生成一个时间的序列,略过周末非交易日
date = pd.date_range('2017-01-01',periods=st_change.shape[1],freq='B')
# index代表行索引,columns代表列索引
data = pd.Dataframe(st_change)
data.columns = date
data
1.4 Dataframe
1.4.1 Dataframe结构
Dataframe对象既有行索引,又有列索引
- 行索引,表明不同行,横向索引,叫index
- 列索引,表名不同列,纵向索引,叫columns
常用属性:
- shape
numpy的array结构和pandas的dataframe结构一样都可以调用查看shape属性
data.shape
- index
Dataframe的行索引列表
data.index
- columns
Dataframe的列索引列表
data.columns
- values
直接获取其中array的值
data.values
- T
转置
转置之后实际数据并没有转置
data.T
常用方法:
- head(5):显示前5行内容
如果不补充参数,默认5行。填入参数N则显示前N行
data.head(5)
- tail(5):显示后5行内容
如果不补充参数,默认5行。填入参数N则显示后N行
data.tail(5)1.4.3 Datatframe索引的设置 修改行列索引值
注意:以下修改方式是错误的
错误写法1
# 错误修改方式 data.index[3] = '股票_3' #报错: TypeError: Index does not support mutable operations
错误写法2:
# 错误 # 构造行索引序列 st_code = ['股票'+str(i) for i in range(st_change.shape[0])] print(st_code) # 添加行索引 data = pd.Dataframe(st_change, index=st_code) data
正确的方式:
写法1:对dataframe结构的行索引index直接更改,有可能出问题,取决于赋什么值。以前这样做可以,现在不太推荐了
stock_code = ["股票_" + str(i) for i in range(stock_change.shape[0])] # 必须整体全部修改 data.index = stock_code
写法2:用rename方法改
df.rename(index={原行索引名:替换行索引名})
data5 = np.random.normal(0,1,(10,5))
data5 = pd.Dataframe(data5)
data5.rename(index={0:1,2:22})
重设索引
- reset_index(drop=False)
- 设置新的下标索引
- drop:默认为False,不删除原来索引,如果为True,删除原来的索引值
# 重置索引,drop=False # 增加了列索引 data.reset_index()
# 重置索引,drop=True # 删掉原来的行索引 data.reset_index(drop=True)
- 以某列值设置为新的索引
set_index(keys,drop=True)- keys : 列索引名成或者列索引名称的列表
- drop : boolean, default True.当做新的索引,删除原来的列
设置新索引案例
# 以某列值设置为新的索引
df = pd.Dataframe({'month': [1, 4, 7, 10],
'year': [2012, 2014, 2013, 2014],
'sale':[55, 40, 84, 31]})
print(df)
# 以月份设置新的索引
df.set_index('month')
# 设置多个索引,以年和月份
df.set_index(['year','month'])
注:通过刚才的设置,这样Dataframe就变成了一个具有MultiIndex的Dataframe。
- series结构只有行索引
我们获取’股票0’的所有数据(可能要转置)
data # series data['股票0'] type(data['股票0']) # 这一步相当于是series去获取行索引的值 data data['股票0']['2017-01-02']1.6.1 创建series
通过已有数据创建
- 指定内容,默认索引
# 创建series # 指定内容,默认索引 pd.Series(np.arange(10))
- 指定索引
# 创建series # 指定索引 pd.Series([6.7, 5.6, 3, 10, 2], index=[1, 2, 3, 4, 5])
- 通过字典数据创建
# 创建series
# 通过字典数据创建
pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})
1.6.2 series获取索引和值
- index
- values
data3 = pd.Series({'red':100, 'blue':200, 'green': 500, 'yellow':1000})
print(data3.index)
print(data3.values)
1.7 小结
- pandas的三种数据结构
- Dataframe结构
- Series结构
- index索引对象
pandas库简介(1)–pandas的三种数据结构https://blog.csdn.net/zby1001/article/details/54234121
Numpy当中我们已经讲过使用索引选取序列和切片选择,pandas也支持类似的操作,也可以直接使用列名、行名称,甚至组合使用
2.1.1 直接使用行列索引(先列后行)# 2 基本数据操作 # 2.1 索引操作 # 2.1.2 结合loc或者iloc使用索引 # 使用loc:只能指定行列索引的名字 data5.loc[1:3,4] data5.loc[1:3,2:4]2.1.2 结合loc或者iloc使用索引
# 2 基本数据操作 # 2.1 索引操作 # 2.1.2 结合loc或者iloc使用索引 # 使用loc:只能指定行列索引的名字 data5.loc[1:3,4] data5.loc[1:3,2:4] data5.loc[[1,3],[2,4]]
# 2 基本数据操作 # 2.1 索引操作 # 2.1.2 结合loc或者iloc使用索引 # 使用iloc可以通过索引的下标去获取 data5.iloc[0:8,4:5] # 得到一列 data5.iloc[0:8,3:6] data5.iloc[[1,3],[2,3]]2.1.3 使用ix组合索引(已官方弃用)
已经被弃用
2.2 赋值操作# 2.2 赋值操作 # 直接修改原来的值 data5[1] = 4 data52.3 排序
排序有两种形式,一种对内容进行排序,一种对索引进行排序
Dataframe排序- 使用df.sort_values(key=, ascending=)对内容进行排序
- 单个键或者多个键进行排序,默认升序
- ascending=False:降序
- ascending=True:升序
# 2.3 排序 # Dataframe排序 # 按照涨跌幅大小进行排序 , 使用ascending指定按照大小排序 data6 = data5.sort_values(by=3,ascending=False).head() data6
# 2.3 排序 # Dataframe排序 # 按照多个键进行排序 data7 = data5.sort_values(by=[2,4]) data7
- 使用sort_index对索引进行排序
# 2.3 排序 # Dataframe排序 # 使用sort_index对索引进行排序 # 对索引进行排序 data7.sort_index()Series
- 使用series.sort_values(ascending=True)对内容进行排序
series排序时,只有一列,不需要参数
data5[4] type(data5[4]) # pandas.core.series.Series data5[4].sort_values(ascending=True).head()
- 使用series.sort_index()对索引进行排序
与df一致
data5[4].sort_index()2.4 总结
- 索引操作,loc和iloc
- 赋值操作
- sort_values对内容进行排序
- sort_index对索引进行排序
- add(other) # 加
比如进行数学运算加上具体的一个数字
# 3 Dataframe运算 # 3.1 算术运算 data5[1].add(1)
- sub(other) # 减
求差
# 3 Dataframe运算 # 3.1 算术运算 data5 # 1、筛选两列数据 st = data5[0] end = data5[1] # 相减 data5[5] = end.sub(st) data5
- add()、sub()、mul()和div()分别表示加减乘除(注意乘法是对应元素相乘,而不是矩阵乘法)
# 3 Dataframe运算 # 3.1 算术运算 # 乘 first = data5[1] second = data5[2] data5['乘'] = first.mul(second) data5
# 3 Dataframe运算 # 3.1 算术运算 # 除 first = data5[1] second = data5[2] data5['除'] = second.div(first) data53.2 逻辑运算 3.2.1 逻辑运算符号<、 >、|、 & 筛选单个结果
# 3.2 逻辑运算 # 3.2.1 逻辑运算符号<、 >、|、 & # 逻辑判断的结果可以作为筛选的依据 print(data5[2] > 0.5) print(data5[data5[2]>0.5])完成多个逻辑判断
- 与判断 &
# 3.2 逻辑运算 # 3.2.1 逻辑运算符号<、 >、|、 & data5[(data5[4]>0.1)&(data5[5]<4)]
- 或判断
# 3.2 逻辑运算 # 3.2.1 逻辑运算符号<、 >、|、 & data5[(data5[4]>0.1)|(data5[5]<4)]3.2.2 逻辑运算函数
- query(expr)
- expr:查询字符串
通过query使得刚才的过程更加方便简单
# 3.2 逻辑运算
# 3.2.2 逻辑运算函数
data5.query("乘>0 | 除>0")
- isin(values)
# 3.2 逻辑运算 # 3.2.2 逻辑运算函数 data5[data5[1].isin([4])]3.3 统计运算 3.3.1 describe()
综合分析: 能够直接得出很多统计结果, count , mean , std , min , max 等
# 3.3 统计运算 # 3.3.1 describe() # 计算平均值、标准差、最大值、最小值 data5.describe()3.3.2 统计函数
Numpy当中已经详细介绍,在这里我们演示min(最小值), max(最大值), mean(平均值), median(中位数), var(方差), std(标准差)结果
附上numpy的学习地址:
python使用numpy模块的介绍,基本操作,处理数据,包括生成数组,正态分布,均匀数组,数值改变,索引切片,形状修改,类型修改,数组去重,值运算,数组运算,合并分割,IO操作(读取)https://blog.csdn.net/weixin_55579895/article/details/120687601?spm=1001.2014.3001.5502
对于单个函数去进行统计的时候,坐标轴还是按照这些默认为“columns” (axis=0, default),如果要对行“index” 需要指定(axis=1)
- max()、min()
# 3.3 统计运算 # 3.3.2 统计函数 # 使用统计函数:0 代表列求结果, 1 代表行求统计结果 data5.max()
- std()、var()
# 3.3 统计运算 # 3.3.2 统计函数 # 方差 data5.var(1)
# 3.3 统计运算 # 3.3.2 统计函数 # 标准差 data5.std()
- median():中位数
中位数为将数据从小到大排列,在最中间的那个数为中位数。如果没有中间数,取中间两个数的平均值。
# 3.3 统计运算 # 3.3.2 统计函数 # 中位数 data5.median(0)
- idxmax() # 求出最大值的位置、idxmin() # 求出最小值的位置
# 3.3 统计运算 # 3.3.2 统计函数 data5.idxmax(0) data5.idxmax(axis=0)
# 3.3 统计运算 # 3.3.2 统计函数 data5.idxmin(0) data5.idxmin(axis=0)3.4 累计统计函数
| 函数 | 作用 |
|---|---|
| cumsum | 计算前1/2/3/…/n个数的和(值一个个累计上去) |
| cummax | 计算前1/2/3/…/n个数的最大值 |
| cummin | 计算前1/2/3/…/n个数的最小值 |
| cumprod | 计算前1/2/3/…/n个数的积 |
以上这些函数可以对series和dataframe操作
这里我们按照时间的从前往后来进行累计
# 3.4 累计统计函数 # 排序 data8 = data5.sort_index() # 求和 st_0 = data8[0] st_0.cumsum() # data8
使用plot函数画出图像
import matplotlib.pyplot as plt # plot显示图形 st_0.cumsum().plot() # 需要调用show,才能显示出结果 plt.show()3.5 自定义运算
- apply(func, axis=0)
- func:自定义函数
- axis=0:默认是列,axis=1为行进行运算
# 3.5 自定义运算 data5[[0,1]].apply(lambda x: x.max() - x.min(),axis=1)4 Pandas画图 4.1 pandas.Dataframe.plot
- Dataframe.plot (x=None, y=None, kind=‘line’)
- x : label or position, default None
- y : label, position or list of label, positions, default None
- Allows plotting of one column versus another
- kind : str
- ‘line’ : line plot (default)
- ‘bar’ : vertical bar plot
- ‘barh’ : horizontal bar plot
- ‘hist’ : histogram
- ‘pie’ : pie plot
- ‘scatter’ : scatter plot
更多参数细节:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFram
e.plot.html?highlight=plot#pandas.Dataframe.plot
更多参数细节:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.plo
t.html?highlight=plot#pandas.Series.plot
我们的数据大部分存在于文件当中,所以pandas会支持复杂的IO操作,pandas的API支持众多的文件格式,如CSV、SQL、XLS、JSON、HDF5。
注:最常用的HDF5和CSV文件
- pandas.read_csv(filepath_or_buffer, sep =’,’ , delimiter = None)
- filepath_or_buffer:文件路径
- usecols:指定读取的列名,列表形式



