Python金融大数据分析——第6章 金融时间序列 笔记第6章 金融时间序列
-
-
6.1 pandas基础
-
6.1.1 使用DataFrame类的第一步
-
6.1.2 使用DataFrame类的第二步
-
6.1.3 基本分析
-
6.1.4 Series类
-
6.1.5 GroupBy操作
-
-
6.2 金融数据
-
6.3 回归分析
-
6.4 高频数据
-
第6章 金融时间序列
6.1 pandas基础
6.1.1 使用DataFrame类的第一步
import pandas as pd
import numpy as np
df = pd.DataFrame([10, 20, 30, 40], columns=['numbers'], index=['a', 'b', 'c', 'd'])
df
# numbers
# a 10
# b 20
# c 30
# d 40
df.index
# Index(['a', 'b', 'c', 'd'], dtype='object')
df.columns
# Index(['numbers'], dtype='object')
df.loc['c']
# numbers 30
# Name: c, dtype: int64
df.loc[['a', 'b']]
# numbers
# a 10
# b 20
df.loc[df.index[1:3]]
# numbers
# b 20
# c 30
df.sum()
# numbers 100
# dtype: int64
df.apply(lambda x: x ** 2)
# numbers
# a 100
# b 400
# c 900
# d 1600
df ** 2
# numbers
# a 100
# b 400
# c 900
# d 1600
df['floats'] = (1.5, 2.5, 3.5, 4.5)
df
# numbers floats
# a 10 1.5
# b 20 2.5
# c 30 3.5
# d 40 4.5
df['floats']
# a 1.5
# b 2.5
# c 3.5
# d 4.5
# Name: floats, dtype: float64
df.floats
# a 1.5
# b 2.5
# c 3.5
# d 4.5
# Name: floats, dtype: float64
df['names'] = pd.DataFrame(['Yves', 'Guido', 'Felix', 'Francesc'], index=['d', 'a', 'b', 'c'])
df
# numbers floats names
# a 10 1.5 Guido
# b 20 2.5 Felix
# c 30 3.5 Francesc
# d 40 4.5 Yves
df.append({'numbers': 100, 'floats': 5.75, 'names': 'Henry'}, ignore_index=True)
# numbers floats names
# 0 10 1.50 Guido
# 1 20 2.50 Felix
# 2 30 3.50 Francesc
# 3 40 4.50 Yves
# 4 100 5.75 Henry
df = df.append(pd.DataFrame({'numbers': 100, 'floats': 5.75, 'names': 'Henry'}, index=['z', ]))
df
# floats names numbers
# a 1.50 Guido 10
# b 2.50 Felix 20
# c 3.50 Francesc 30
# d 4.50 Yves 40
# z 5.75 Henry 100
df.join(pd.DataFrame([1, 4, 9, 16, 25], index=['a', 'b', 'c', 'd', 'y'], columns=['squares', ]))
# floats names numbers squares
# a 1.50 Guido 10 1.0
# b 2.50 Felix 20 4.0
# c 3.50 Francesc 30 9.0
# d 4.50 Yves 40 16.0
# z 5.75 Henry 100 NaN
df = df.join(pd.DataFrame([1, 4, 9, 16, 25],
index=['a', 'b', 'c', 'd', 'y'],
columns=['squares', ]),
how='outer')
df
# floats names numbers squares
# a 1.50 Guido 10.0 1.0
# b 2.50 Felix 20.0 4.0
# c 3.50 Francesc 30.0 9.0
# d 4.50 Yves 40.0 16.0
# y NaN NaN NaN 25.0
# z 5.75 Henry 100.0 NaN
df[['numbers', 'squares']].mean()
# numbers 40.0
# squares 11.0
# dtype: float64
df[['numbers', 'squares']].std()
# numbers 35.355339
# squares 9.669540
# dtype: float64
[/code]
### 6.1.2 使用DataFrame类的第二步
```code
a = np.random.standard_normal((9, 4))
a.round(6)
# array([[ 0.109076, -1.05275 , 1.253471, 0.39846 ],
# [-1.561175, -1.997425, 1.158739, -2.030734],
# [ 0.764723, 0.760368, 0.864103, -0.174079],
# [ 2.429043, 0.281962, -0.496606, 0.009445],
# [-1.679758, -1.02374 , -1.135922, 0.077649],
# [-0.247692, 0.301198, 2.156474, 1.537902],
# [ 1.162934, 2.102327, -0.4501 , 0.812529],
# [-0.374749, -0.818229, -1.013962, -0.476855],
# [ 0.626347, 2.294829, -1.29531 , -0.031501]])
df = pd.DataFrame(a)
df
# 0 1 2 3
# 0 0.109076 -1.052750 1.253471 0.398460
# 1 -1.561175 -1.997425 1.158739 -2.030734
# 2 0.764723 0.760368 0.864103 -0.174079
# 3 2.429043 0.281962 -0.496606 0.009445
# 4 -1.679758 -1.023740 -1.135922 0.077649
# 5 -0.247692 0.301198 2.156474 1.537902
# 6 1.162934 2.102327 -0.450100 0.812529
# 7 -0.374749 -0.818229 -1.013962 -0.476855
# 8 0.626347 2.294829 -1.295310 -0.031501
df.columns = [['No1', 'No2', 'No3', 'No4']]
df
# No1 No2 No3 No4
# 0 0.109076 -1.052750 1.253471 0.398460
# 1 -1.561175 -1.997425 1.158739 -2.030734
# 2 0.764723 0.760368 0.864103 -0.174079
# 3 2.429043 0.281962 -0.496606 0.009445
# 4 -1.679758 -1.023740 -1.135922 0.077649
# 5 -0.247692 0.301198 2.156474 1.537902
# 6 1.162934 2.102327 -0.450100 0.812529
# 7 -0.374749 -0.818229 -1.013962 -0.476855
# 8 0.626347 2.294829 -1.295310 -0.031501
df['No2'][3]
# 0.2819621128403918
dates = pd.date_range('2018-01-01', periods=9, freq='M')
dates
# DatetimeIndex(['2018-01-31', '2018-02-28', '2018-03-31', '2018-04-30',
# '2018-05-31', '2018-06-30', '2018-07-31', '2018-08-31',
# '2018-09-30'],
# dtype='datetime64[ns]', freq='M')
[/code]
data_range函数参数
参数 | 格式 | 描述
---|---|---
start | 字符串/日期时间 | 生成日期的左界
end | 字符串/日期时间 | 生成日期的右界
periods | 整数/None | 期数(如果start或者end空缺)
freq | 字符串/日期偏移 | 频率字符串,例如5D (5天)
tz | 字符串/None | 本地化索引的时区名称
nonnalize | 布尔值,默认None | 将star和end规范化为午夜
name | 字符串,默认None | 结果索引名称
```code
df.index = dates
df
# No1 No2 No3 No4
# 2018-01-31 0.109076 -1.052750 1.253471 0.398460
# 2018-02-28 -1.561175 -1.997425 1.158739 -2.030734
# 2018-03-31 0.764723 0.760368 0.864103 -0.174079
# 2018-04-30 2.429043 0.281962 -0.496606 0.009445
# 2018-05-31 -1.679758 -1.023740 -1.135922 0.077649
# 2018-06-30 -0.247692 0.301198 2.156474 1.537902
# 2018-07-31 1.162934 2.102327 -0.450100 0.812529
# 2018-08-31 -0.374749 -0.818229 -1.013962 -0.476855
# 2018-09-30 0.626347 2.294829 -1.295310 -0.031501
[/code]
data_range函数频率参数值
别名 | 描述
---|---
B | 交易日
C | 自定义交易日(试验性)
D | 日历日
W | 每周
M | 每月底
BM | 每月最后一个交易日
MS | 月初
BMS | 每月第一个交易日
Q | 季度末
BQ | 每季度最后一个交易日
QS | 季度初
BQS | 每季度第一个交易日
A | 每年底
BA | 每年最后一个交易日
AS | 每年初
BAS | 每年第一个交易日
H | 每小时
T | 每分钟
S | 每秒
L | 毫秒
U | 微秒
通常可以从一个 ndarray 对象生成 DataFrame 对象。 但是也可以简单地使用NumPy的array函数从DataFrame 生成一个
ndarray。
```code
np.array(df).round(6)
# array([[ 0.109076, -1.05275 , 1.253471, 0.39846 ],
# [-1.561175, -1.997425, 1.158739, -2.030734],
# [ 0.764723, 0.760368, 0.864103, -0.174079],
# [ 2.429043, 0.281962, -0.496606, 0.009445],
# [-1.679758, -1.02374 , -1.135922, 0.077649],