学习内容
时间重采样
Tips:
穿插两个小知识点
closed:划分区间的依据,left会划成左闭右开区间;right会划分成左开右闭的区间。一般来说,closed为right的时候,区间会比为left的时候多一个。区间划分完毕,聚合运算就在这个区间内执行。
label:划分区间完毕,根据label的不同,区间的索引就不同。如果label为left,则区间左边的日期作为索引;如果label为right,则区间右边的日期作为索引。
重点
1.Series-resample的使用
import pandas as pd
import numpy as np
s=pd.Series(np.random.randint(0,50,60),
index=pd.date_range("2020-01-28 9:30",periods=60,freq="T"))
#创建60个以分钟为单位的数据,认为股票的每分钟成交量
print(s.resample("5min").sum())
#5分钟为基本单位,每五分钟求和,默认索引在最开始 的时间点
2020-01-28 09:30:00 136
2020-01-28 09:35:00 158
2020-01-28 09:40:00 82
2020-01-28 09:45:00 114
2020-01-28 09:50:00 93
2020-01-28 09:55:00 89
2020-01-28 10:00:00 118
2020-01-28 10:05:00 194
2020-01-28 10:10:00 172
2020-01-28 10:15:00 134
2020-01-28 10:20:00 123
2020-01-28 10:25:00 36
print(s.resample("5min",label="right").sum())
#左开右闭区间,索引为最晚时间点
2020-01-28 09:35:00 114
2020-01-28 09:40:00 97
2020-01-28 09:45:00 110
2020-01-28 09:50:00 85
2020-01-28 09:55:00 91
2020-01-28 10:00:00 83
2020-01-28 10:05:00 47
2020-01-28 10:10:00 117
2020-01-28 10:15:00 149
2020-01-28 10:20:00 97
2020-01-28 10:25:00 99
2020-01-28 10:30:00 150
Freq: 5T, dtype: int32
#把上述数据默认为股票的实时价格,引入ohlc
print(s.resample("5min").ohlc())
open high low close
2020-01-28 09:30:00 39 48 15 15
2020-01-28 09:35:00 28 40 24 24
2020-01-28 09:40:00 1 32 1 32
2020-01-28 09:45:00 28 48 13 24
2020-01-28 09:50:00 12 38 10 18
2020-01-28 09:55:00 48 48 35 39
2020-01-28 10:00:00 8 35 8 35
2020-01-28 10:05:00 28 43 15 21
2020-01-28 10:10:00 24 38 24 38
2020-01-28 10:15:00 48 48 2 40
2020-01-28 10:20:00 17 48 0 48
2020-01-28 10:25:00 43 43 15 39
2.以月为单位,整合Series数据
import pandas as pd
import numpy as np
s = pd.Series(np.random.randint(0, 50, 60), index=pd.date_range("2020-01-28", periods=60, freq="D"))
print(s.groupby(lambda x: x.month).sum())#使用函数
1 81
2 867
3 645
dtype: int32
print(s.groupby(s.index.to_period('M')).sum())
#将日期索引转化成以月为周期,并成为分组依据,将内容求和
2020-01 81
2020-02 867
2020-03 645
Freq: M, dtype: int32
#注意两者的区别
3.DateFrame-resamp的使用
df = pd.DataFrame(np.random.randint(10, 50, 40).reshape(10, 4),
index=pd.date_range("2020-01-28", periods=10, freq="M"),
columns=list("ABCD"))
#创建40个数据,以月为单位
print(df.resample("10D").sum())#以10天为采样周期,求其和
A B C D
2020-01-31 14 30 38 44
2020-02-10 0 0 0 0
2020-02-20 38 25 30 20
2020-03-01 0 0 0 0
2020-03-11 0 0 0 0
2020-03-21 0 0 0 0
2020-03-31 38 30 16 32
2020-04-10 0 0 0 0
2020-04-20 0 0 0 0
2020-04-30 33 27 33 15
2020-05-10 0 0 0 0
2020-05-20 0 0 0 0
2020-05-30 45 19 12 29
2020-06-09 0 0 0 0
2020-06-19 0 0 0 0
2020-06-29 26 11 49 43
2020-07-09 0 0 0 0
2020-07-19 0 0 0 0
2020-07-29 34 45 25 47
2020-08-08 0 0 0 0
2020-08-18 0 0 0 0
2020-08-28 37 14 18 44
2020-09-07 0 0 0 0
2020-09-17 0 0 0 0
2020-09-27 46 15 42 30
2020-10-07 0 0 0 0
2020-10-17 0 0 0 0
2020-10-27 17 11 18 24
df = pd.DataFrame(np.random.randint(10, 50, 20).reshape(5, 4),
index=pd.date_range("2020-01-28", periods=5, freq="M"),
columns=list("ABCD"))
print(df.resample("A-DEC").ffill())#采样以年为单位,12月为截至
A B C D
2020-12-31 38 31 17 17
print(df.resample("A-MAR").ffill())#一年为单位,3月截至
A B C D
2020-03-31 14 41 45 43
2021-03-31 43 42 42 49
4.csv文件的采样
import pandas as pd
import numpy as np
df=pd.read_csv('002001.csv')
wdf=df["Adj Close"].resample("W-FRI").ohlc()
print(wdf)
#这样操作为报错,虽然csv文件含有日期,但是读取后python不支持,这时候要加上解析时间的代码
df=pd.read_csv('002001.csv',index_col="Date",parse_dates=True)
#这样就可以操作了,python就会识别日期
#源数据有Date索引,这里指定为列索引,自动解析
open high low close
Date
2015-10-02 13.41 13.41 13.41 13.41
2015-10-09 13.41 14.75 13.41 14.62
2015-10-16 15.30 15.30 14.73 15.25
2015-10-23 15.03 15.22 14.26 15.20
2015-10-30 15.18 15.30 15.02 15.22
2015-11-06 14.74 15.86 14.62 15.86
2015-11-13 16.02 16.59 15.95 15.95
2015-11-20 16.21 16.22 15.75 16.08
2015-11-27 16.05 16.94 15.54 15.54
2015-12-04 15.70 16.62 15.70 16.62
2015-12-11 16.63 16.63 15.56 15.62
2015-12-18 16.06 16.60 16.06 16.31
2015-12-25 16.85 16.95 16.85 16.95
#在此基础上就可以进行一些列操作了
wdf["Volume"]=df['Volume'].resample('W-FRI').sum()
#加上交易量
open high low close Volume
Date
2015-10-02 13.41 13.41 13.41 13.41 0
2015-10-09 13.41 14.75 13.41 14.62 42135700
2015-10-16 15.30 15.30 14.73 15.25 73234300
2015-10-23 15.03 15.22 14.26 15.20 69848500
2015-10-30 15.18 15.30 15.02 15.22 64253700
2015-11-06 14.74 15.86 14.62 15.86 67429500
2015-11-13 16.02 16.59 15.95 15.95 87379300
2015-11-20 16.21 16.22 15.75 16.08 41097000
2015-11-27 16.05 16.94 15.54 15.54 64976300
2015-12-04 15.70 16.62 15.70 16.62 53552100
2015-12-11 16.63 16.63 15.56 15.62 42382600
2015-12-18 16.06 16.60 16.06 16.31 45879500
2015-12-25 16.85 16.95 16.85 16.95 27652100