跳到主内容
研究工具量化研究工具与数据基础 · 第1–5讲4/5 · 配套练习模块导览 →
练习

第4讲:Pandas入门 (Introduction to pandas) · 练习

完成序列索引、缺失值处理和频率转换,组合多个价格表,并计算滚动统计与对数收益。

← 返回本讲讲义
完成状态保存在当前浏览器,可随时取消。
code
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

练习 1#

a. Series

给定一组数据,请创建一个带有日期时间索引的 Pandas Series s,索引从 2016-01-01 开始,频率为每日,且长度与数据相同。

python

code
l = np.random.randint(1, 100, size=1000)
s = pd.Series(l)
## 你的代码写在这里

b. 访问 Series 元素

  • 打印 Series s 前 50 个元素中每隔一个的元素。

  • 查找索引为 2017-02-20 的值。

python

code
## 你的代码写在这里
## 你的代码写在这里

c. 布尔索引

在 Series s 中,打印所有介于 1 和 3 之间的值。

python

code
## 你的代码写在这里

练习 2:索引和时间序列#

a. 显示

打印 Series s 的前 5 个和后 5 个元素。

python

code
## 你的代码写在这里
## 你的代码写在这里

b. 重采样

  • 使用 resample 方法将每日数据上采样到月度频率,使用 median 方法,使每个月的值为该月中所有天的价格中位数。

  • 将每日数据填充为包括周末和节假日的完整每日数据,使用前向填充方法。

python

code
symbol = "CMG"
start = "2012-01-01"
end = "2016-01-01"
prices = get_pricing(symbol, start_date=start, end_date=end, fields="price")
## 你的代码写在这里
## 你的代码写在这里

练习 3:缺失数据#

  • 使用前向填充方法替换所有 NaN 实例。

  • 不填充数据,而是移除数据中所有的 NaN 实例。

python

code
## 你的代码写在这里
## 你的代码写在这里

练习 4:使用 Pandas 进行时间序列分析#

a. 常规信息

打印 Series s 的计数、均值、标准差、最小值、第 25、50 和 75 百分位数以及最大值。

python

code
print("Summary Statistics")
## 你的代码写在这里

b. Series 操作

  • 计算该 Series 的加法和乘法回报。

  • 计算 60 天窗口的滚动均值。

  • 计算 60 天窗口的标准差。

python

code
data = get_pricing('GE', fields='open_price', start_date='2016-01-01', end_date='2017-01-01')
## 你的代码写在这里
## 你的代码写在这里
# 滚动均值
## 你的代码写在这里
## 你的代码写在这里
# 滚动标准差
## 你的代码写在这里
## 你的代码写在这里

练习 5:DataFrames#

a. 索引

使用 dict_data 创建一个 DataFrame,并以 l 作为其索引。

python

code
l = {'fifth', 'fourth', 'third', 'second', 'first'}
dict_data = {'a': [1, 2, 3, 4, 5], 'b': ['L', 'K', 'J', 'M', 'Z'], 'c': np.random.normal(0, 1, 5)}
## 你的代码写在这里

b. DataFrame 操作

  • 将以下两个 Series 连接成一个 DataFrame。

  • 将列名重命名为 Good Numbers 和 Bad Numbers。

  • 将索引更改为从 2016-01-01 开始的日期时间索引。

python

code
s1 = pd.Series([2, 3, 5, 7, 11, 13], name='prime')
s2 = pd.Series([1, 4, 6, 8, 9, 10], name='other')
## 你的代码写在这里
## 你的代码写在这里
## 你的代码写在这里

练习 6:访问 DataFrame 元素#

a. 列

  • 检查 DataFrame 某一列的数据类型。

  • 打印 2013-01-01 至 2013-01-10 时间范围内的值。

python

code
symbol = ["XOM", "BP", "COP", "TOT"]
start = "2012-01-01"
end = "2016-01-01"
prices = get_pricing(symbol, start_date=start, end_date=end, fields="price")
if isinstance(symbol, list):
    prices.columns = map(lambda x: x.symbol, prices.columns)
else:
    prices.name = symbol
# 检查这两者的数据类型
prices.XOM.head()
prices.loc[:, 'XOM'].head()
## 你的代码写在这里
## 你的代码写在这里
## 你的代码写在这里

练习 7:布尔索引#

a. 过滤

从上题的 prices 中过滤数据,仅打印满足以下条件的值:

  • BP > 30

  • XOM < 100

  • BP > 30 且 XOM < 100 的交集

  • (BP > 30 且 XOM < 100) 与 TOT 无 NaN 值的并集

  • 添加 TSLA 列并删除 XOM 列。

python

code
# 过滤 prices 数据,仅打印满足以下条件的值
# BP > 30
# XOM < 100
# BP > 30 且 XOM < 100
# (BP > 30 且 XOM < 100) 与 TOT 无 NaN 的并集
## 你的代码写在这里
# 添加 TSLA 列并删除 XOM 列
## 你的代码写在这里

b. DataFrame 操作(再次)

  • 连接以下两个 DataFrame。

  • 将缺失数据填充为 0。

python

code
df_1 = get_pricing(['SPY', 'VXX'], start_date=start, end_date=end, fields='price')
df_2 = get_pricing(['MSFT', 'AAPL', 'GOOG'], start_date=start, end_date=end, fields='price')
## 你的代码写在这里
# 将 GOOG 的缺失数据填充为 0
## 你的代码写在这里

练习 8:时间序列分析#

a. 汇总

  • 打印上述 prices DataFrame 的摘要。

  • 计算对数回报并打印前 10 个值。

  • 打印每家公司的乘法回报。

  • 标准化 2014 至 2015 年的回报并绘图。

  • 绘制 60 天窗口的滚动均值。

  • 绘制 60 天窗口的滚动标准差。

python

code
# 打印 'prices' 时间序列的摘要
## 你的代码写在这里
# 打印前 10 个值的自然对数回报
## 你的代码写在这里
# 打印乘法回报
## 你的代码写在这里
# 标准化回报并绘图
## 你的代码写在这里
# 滚动均值
## 你的代码写在这里
# 滚动标准差
## 你的代码写在这里
# 绘图
## 你的代码写在这里

完成练习后,自评一次

建议先独立作答,再展开参考答案进行核对。