74.Pandas的应用-5
Pandas的应用-5
DataFrame的应用
窗口计算
DataFrame
对象的rolling
方法允许我们将数据置于窗口中,然后就可以使用函数对窗口中的数据进行运算和处理。例如,我们获取了某只股票近期的数据,想制作5日均线和10日均线,那么就需要先设置窗口再进行运算。我们可以使用三方库pandas-datareader
来获取指定的股票在某个时间段内的数据,具体的操作如下所示。
安装pandas-datareader
三方库。
pip install pandas-datareader |
通过pandas-datareader
提供的get_data_stooq
从 Stooq 网站获取百度(股票代码:BIDU)近期股票数据。
import pandas_datareader as pdr |
输出:

上面的DataFrame
有Open
、High
、Low
、Close
、Volume
五个列,分别代码股票的开盘价、最高价、最低价、收盘价和成交量,接下来我们对百度的股票数据进行窗口计算。
baidu_df.rolling(5).mean() |
输出:

上面的Close
列的数据就是我们需要的5日均线,当然,我们也可以用下面的方法,直接在Close
列对应的Series
对象上计算5日均线。
baidu_df.Close.rolling(5).mean() |
输出:
Date |
相关性判定
在统计学中,我们通常使用协方差(covariance)来衡量两个随机变量的联合变化程度。如果变量 的较大值主要与另一个变量 的较大值相对应,而两者较小值也相对应,那么两个变量倾向于表现出相似的行为,协方差为正。如果一个变量的较大值主要对应于另一个变量的较小值,则两个变量倾向于表现出相反的行为,协方差为负。简单的说,协方差的正负号显示着两个变量的相关性。方差是协方差的一种特殊情况,即变量与自身的协方差。
如果 和 是统计独立的,那么二者的协方差为0,这是因为在 和 独立的情况下:
协方差的数值大小取决于变量的大小,通常是不容易解释的,但是正态形式的协方差大小可以显示两变量线性关系的强弱。在统计学中,皮尔逊积矩相关系数就是正态形式的协方差,它用于度量两个变量 和 之间的相关程度(线性相关),其值介于-1
到1
之间。
估算样本的协方差和标准差,可以得到样本皮尔逊系数,通常用希腊字母 表示。
我们用 值判断指标的相关性时遵循以下两个步骤。
- 判断指标间是正相关、负相关,还是不相关。
- 当 $ \rho \gt 0 $,认为变量之间是正相关,也就是两者的趋势一致。
- 当 $ \rho \lt 0 $,认为变量之间是负相关,也就是两者的趋势相反。
- 当 $ \rho = 0 $,认为变量之间是不相关的,但并不代表两个指标是统计独立的。
- 判断指标间的相关程度。
- 当 $ \rho $ 的绝对值在 $ [0.6,1] $ 之间,认为变量之间是强相关的。
- 当 $ \rho $ 的绝对值在 $ [0.1,0.6) $ 之间,认为变量之间是弱相关的。
- 当 $ \rho $ 的绝对值在 $ [0,0.1) $ 之间,认为变量之间没有相关性。
皮尔逊相关系数适用于:
- 两个变量之间是线性关系,都是连续数据。
- 两个变量的总体是正态分布,或接近正态的单峰分布。
- 两个变量的观测值是成对的,每对观测值之间相互独立。
DataFrame
对象的cov
方法和corr
方法分别用于计算协方差和相关系数,corr
方法的第一个参数method
的默认值是pearson
,表示计算皮尔逊相关系数;除此之外,还可以指定kendall
或spearman
来获得肯德尔系数或斯皮尔曼等级相关系数。
接下来,我们从名为boston_house_price.csv
的文件中获取著名的波士顿房价数据集来创建一个DataFrame
,我们通过corr
方法计算可能影响房价的13
个因素中,哪些跟房价是正相关或负相关的,代码如下所示。
boston_df = pd.read_csv('data/csv/boston_house_price.csv') |
说明:如果需要上面例子中的 CSV 文件,可以通过下面的百度云盘地址进行获取,数据在《从零开始学数据分析》目录中。链接:https://pan.baidu.com/s/1rQujl5RQn9R7PadB2Z5g_g,提取码:e7b4。
输出:

斯皮尔曼相关系数对数据条件的要求没有皮尔逊相关系数严格,只要两个变量的观测值是成对的等级评定资料,或者是由连续变量观测资料转化得到的等级资料,不论两个变量的总体分布形态、样本容量的大小如何,都可以用斯皮尔曼等级相关系数来进行研究。我们通过下面的方式来计算斯皮尔曼相关系数。
boston_df.corr('spearman') |
输出:

在 Notebook 或 JupyterLab 中,我们可以为PRICE
列添加渐变色,用颜色直观的展示出跟房价负相关、正相关、不相关的列,DataFrame
对象style
属性的background_gradient
方法可以完成这个操作,代码如下所示。
boston_df.corr('spearman').style.background_gradient('RdYlBu', subset=['PRICE']) |

上面代码中的RdYlBu
代表的颜色如下所示,相关系数的数据值越接近1
,颜色越接近红色;数据值越接近1
,颜色越接近蓝色;数据值在0
附件则是黄色。
plt.get_cmap('RdYlBu') |

Index的应用
我们再来看看Index
类型,它为Series
和DataFrame
对象提供了索引服务,常用的Index
有以下几种。
范围索引(RangeIndex)
代码:
sales_data = np.random.randint(400, 1000, 12) |
输出:
月份 |
分类索引(CategoricalIndex)
代码:
cate_index = pd.CategoricalIndex( |
输出:
苹果 6 |
代码:
ser.groupby(level=0).sum() |
输出:
苹果 19 |
多级索引(MultiIndex)
代码:
ids = np.arange(1001, 1006) |
说明:上面的代码使用了
MultiIndex
的类方法from_product
,该方法通过ids
和sms
两组数据的笛卡尔积构造了多级索引。
输出:
语文 数学 英语 |
代码:
# 计算每个学生的成绩,期中占25%,期末占75% |
输出:
语文 数学 英语 |
日期时间索引(DatetimeIndex)
-
通过
date_range()
函数,我们可以创建日期时间索引,代码如下所示。代码:
pd.date_range('2021-1-1', '2021-6-1', periods=10)
输出:
DatetimeIndex(['2021-01-01 00:00:00', '2021-01-17 18:40:00',
'2021-02-03 13:20:00', '2021-02-20 08:00:00',
'2021-03-09 02:40:00', '2021-03-25 21:20:00',
'2021-04-11 16:00:00', '2021-04-28 10:40:00',
'2021-05-15 05:20:00', '2021-06-01 00:00:00'],
dtype='datetime64[ns]', freq=None)代码:
pd.date_range('2021-1-1', '2021-6-1', freq='W')
输出:
DatetimeIndex(['2021-01-03', '2021-01-10', '2021-01-17', '2021-01-24',
'2021-01-31', '2021-02-07', '2021-02-14', '2021-02-21',
'2021-02-28', '2021-03-07', '2021-03-14', '2021-03-21',
'2021-03-28', '2021-04-04', '2021-04-11', '2021-04-18',
'2021-04-25', '2021-05-02', '2021-05-09', '2021-05-16',
'2021-05-23', '2021-05-30'],
dtype='datetime64[ns]', freq='W-SUN') -
通过
DateOffset
类型,我们可以设置时间差并和DatetimeIndex
进行运算,具体的操作如下所示。代码:
index = pd.date_range('2021-1-1', '2021-6-1', freq='W')
index - pd.DateOffset(days=2)输出:
DatetimeIndex(['2021-01-01', '2021-01-08', '2021-01-15', '2021-01-22',
'2021-01-29', '2021-02-05', '2021-02-12', '2021-02-19',
'2021-02-26', '2021-03-05', '2021-03-12', '2021-03-19',
'2021-03-26', '2021-04-02', '2021-04-09', '2021-04-16',
'2021-04-23', '2021-04-30', '2021-05-07', '2021-05-14',
'2021-05-21', '2021-05-28'],
dtype='datetime64[ns]', freq=None)代码:
index + pd.DateOffset(days=2)
输出:
DatetimeIndex(['2021-01-05', '2021-01-12', '2021-01-19', '2021-01-26',
'2021-02-02', '2021-02-09', '2021-02-16', '2021-02-23',
'2021-03-02', '2021-03-09', '2021-03-16', '2021-03-23',
'2021-03-30', '2021-04-06', '2021-04-13', '2021-04-20',
'2021-04-27', '2021-05-04', '2021-05-11', '2021-05-18',
'2021-05-25', '2021-06-01'],
dtype='datetime64[ns]', freq=None) -
可以使用
DatatimeIndex
类型的相关方法来处理数据,具体包括:-
shift()
方法:通过时间前移或后移数据,我们仍然以上面百度股票数据为例,代码如下所示。代码:
baidu_df.shift(3, fill_value=0)
输出:
代码:
baidu_df.shift(-1, fill_value=0)
输出:
-
asfreq()
方法:指定一个时间频率抽取对应的数据,代码如下所示。代码:
baidu_df.asfreq('5D')
输出:
代码:
baidu_df.asfreq('5D', method='ffill')
输出:
-
resample()
方法:基于时间对数据进行重采样,相当于根据时间周期对数据进行了分组操作,代码如下所示。代码:
baidu_df.resample('1M').mean()
输出:
说明:上面的代码中,
W
表示一周,5D
表示5
天,1M
表示1
个月。 -
-
时区转换
-
获取时区信息。
import pytz
pytz.common_timezones -
tz_localize()
方法:将日期时间本地化。代码:
baidu_df = baidu_df.tz_localize('Asia/Chongqing')
baidu_df输出:
-
tz_convert()
方法:转换时区。代码:
baidu_df.tz_convert('America/New_York')
输出:
-