使用Resample函数转换时间序列
一、什么是resample函数?
它是Python数据分析库Pandas的方法函数。
它主要用于转换时间序列的频次。可以做一些统计汇总的工作。
什么叫转换时间序列的频次呢?
比如说股票的日k和周k,
假设我只能获取到股票日K的数据,比如说11月1号到11月5号,那怎么样将它转换为以周为单位的K线呢?
日期 | 周期 | 开盘价 | 收盘价 | 最高价 | 最低价 |
---|---|---|---|---|---|
11月1号 | 周一 | 1.11 | 1.11 | 1.11 | 1.12 |
11月2号 | 周二 | 1.12 | 1.12 | 1.11 | 1.12 |
11月3号 | 周三 | 1.13 | 1.13 | 1.11 | 1.12 |
11月4号 | 周四 | 1.15 | 1.14 | 1.11 | 1.12 |
11月5号 | 周五 | 1.14 | 1.15 | 1.11 | 1.12 |
首先我们要明确,周K的开盘、收盘、最高、最低是什么。每周的开盘价是当周第一天的开盘价,收盘价是当周最后一天的收盘价,它的最高价是这周最高的价格,最低价是本周所有最低价中最低的价格。所以你去看炒股平台,它的周k都是以周五的交易日为记录的时间点位置。开盘、收盘、最高、最低是按照我刚刚讲解的这个规则来计算的。至于月K、年K的选取规则也是一样的。月K的周期是一个月,年K的周期是一年。
这个计算准确性你也可以通过网上的数据进行验证。这个计算规则,包括开盘、收盘、最高、最低的计算,收拾resample函数可以做到的事情。此外Resample还有个功能,就是做统计汇总,比如说我想计算一支股票总的周成交量,就可以使用Resample.sum函数去把周一到周五的成交量加起来。
为了方便大家记忆 ,你也可以把resample理解为Excel表格中的透视表功能。你可以按照日期做各种筛选和汇总统计的。最重要的是他可以按照日期。
二、实战Resample函数
因为这2节课还是一些比较基础的部分,所以还没有做模块化的内容。
我们会在创建股票数据库的时候 来做真正的模块化的工作。到这里都是初级的脚本的形式。先提前说下。
1.日K 转换为 周K
1.1函数文档学习
谷歌搜索Pandas Resample
:第一个链接就是这个函数的官方文档
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html
这里有介绍:Resample是属于Pandas DataFrame下面的方法。这里有关于参数的解释。
这里我们只对2个常用参数讲解,一个是rule,另一个是closed。
- rule表示的是你放一个什么样的周期性指标在里面,用m代表Month,Y代表Year,w代表Week,
- closed代表你取哪一个分界线,举例来说,比如说我把日k转换为周k,到底我是取周一为分界线还是周五为分界线呢?这就是通过closed来确定的。
这里有它的例子:
>>>index = pd.date_range('1/1/2000', periods=9, freq='T')
>>>series = pd.Series(range(9), index=index)
>>>series
2000-01-01 00:00:00 0
2000-01-01 00:01:00 1
2000-01-01 00:02:00 2
2000-01-01 00:03:00 3
2000-01-01 00:04:00 4
2000-01-01 00:05:00 5
2000-01-01 00:06:00 6
2000-01-01 00:07:00 7
2000-01-01 00:08:00 8
Freq: T, dtype: int64
这里首先创建了一个时间序列的DataFrame
,就是这个series
变量。你可以理解为它是一个只有一个字段的表格样式。接着往下看:
>>>series.resample('3T').sum()
2000-01-01 00:00:00 3
2000-01-01 00:03:00 12
2000-01-01 00:06:00 21
Freq: 3T, dtype: int64
这里使用了Resample
方法,3T
就是3分钟,T
表示分钟。sum()
就是汇总,也就是针对这一列数据进行汇总。
也就是说,每3分钟统计依次。注意到,这个时间序列汇总的时间取的值是3分钟的第一分钟。如果我想取时间周期的最后一分钟,可以将label的值改为“right":
>>>series.resample('3T', label='right').sum()
2000-01-01 00:03:00 3
2000-01-01 00:06:00 12
2000-01-01 00:09:00 21
Freq: 3T, dtype: int64
1.2实战
获取日K真实的数据:
#获取日k
df = get_price("000001.XSHG", end_date='2021-05-30 14:00:00',count=20, frequency='1d', fields=['open','close','high','low','volume','money'])
print(df)
可以看到获取到了4月28号
到5月28号
的所有数据。为了更方便理解 我们再添加一列数据,就是当前日期是星期几
的列。
#获取日k
df = get_price("000001.XSHG", end_date='2021-05-30 14:00:00',count=20, frequency='1d', fields=['open','close','high','low','volume','money'])
df['weekday']=df.index.weekday
print(df)
这里0
代表周一,这里如何转换为按“周”统计呢
#获取周k
import pandas as pd
df_week = pd.DataFrame()
df_week = df['open'].resample('W').first()
print(df_week)
可以看到这里的2021-05-30
是一个礼拜的最后一天。它对应的开盘价确实是这个数字。说明我们计算的周K数据是正确的。
收盘价就是每周收盘价
最后一天的数据。
最高价就是每周收盘价
的最大值。
最低价就是每周收盘价
的最小值。
#获取周k
import pandas as pd
df_week = pd.DataFrame()
df_week['open'] = df['open'].resample('W').first()
df_week['close'] = df['close'].resample('W').last()
df_week['high'] = df['high'].resample('W').max()
df_week['low'] = df['low'].resample('W').min()
print(df_week)
对比数据,close是最后一天的收盘价的数据。high是当前周的每天的最高价的最高价。low是当前周的每天的最低价的最低价。
我们通过不到10行代码就能将日K
的数据转换为周K
的数据。
2.汇总统计功能(统计月成交量、成交额)
汇总成交量和成交额
我想要把volume
(成交量)和money
(成交额)转换为总成交量和总成交额
#获取周k
import pandas as pd
df_week = pd.DataFrame()
df_week['open'] = df['open'].resample('W').first()
df_week['close'] = df['close'].resample('W').last()
df_week['high'] = df['high'].resample('W').max()
df_week['low'] = df['low'].resample('W').min()
df_week['volume(sum)'] = df['volume'].resample('W').sum()
df_week['money(sum)'] = df['money'].resample('W').sum()
print(df_week)
3.日K 转换为 月K
假设我有一年的数据,如果想转换为月K应该怎么转?
只需要改2个地方:
- 添加
start_date
获取到一整年的数据 - 将
resample
的参数改为M即可,M代表Month
#获取日kdf = get_price("000001.XSHG", end_date='2021-05-30 14:00:00', start_date='2020-05-30', frequency='1d', fields=['open','close','high','low','volume','money']) df['weekday']=df.index.weekdayprint(df)#获取周kimport pandas as pddf_week = pd.DataFrame()df_week['open'] = df['open'].resample('M').first()df_week['close'] = df['close'].resample('M').last()df_week['high'] = df['high'].resample('M').max()df_week['low'] = df['low'].resample('M').min()print(df_week)