# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np
### Resample
# resample,重新采样,是对原样本重新处理的一个方法,是一个对常规时间序列数据重新采样和频率转换
index = pd.date_range('1/1/2000', periods=9, freq='T')
series = pd.Series(range(9), index=index)
print(series)
# 1. 降低采样频率为3分钟
# T 是分钟 , 3T 是3分钟. 9组数据,分为3份
print(series.resample('3T').sum())
# 2. 降低采样频率为3分钟,但是每个标签使right来代替left
print(series.resample('3T', label='right').sum())
# 3. 降低采样频率为3分钟,但是关闭right区间.
# 备注: 方向从右到左,能取到 头
print(series.resample('3T', label='right', closed='right').sum())
# 4. 增加采样频率到30秒,
# 备注: asfreq方法将其转换为高频度
print(series.resample('30S').asfreq()[0:5])
# 5. 增加采样频率到30秒,使用pad方法填充nan值
# 备注:pad() 填充空值 , pad方法:向下取整
print(series.resample('30S').pad()[0:5])
# 6. 增加采样频率到30秒,使用bfill方法填充nan值
# 备注: bfill() 填充空值,向上取整
print(series.resample('30S').bfill()[:5])
# 7.apply 自定义一个函数
#
def customer_resampler(array_like):
return np.sum(array_like) + 5
print(series.resample('3T').apply(customer_resampler))
#
#
##### pandas-resample按时间聚合实例
df = pd.read_csv('./mt.csv', index_col="date", parse_dates=["date"])
df.drop(labels="Unnamed: 0", axis=1, inplace=True) # 删除 名称为 Unnamed: 0 这列
# 1. 按年来提取数据
print(df['2018'])
print(df['2018':'2021'])
# 2. 按月来提取数据
print(df['2018-01':'2018-05'])
print(df['2018-05-23':'2018-09-30'])
# 3. 数据将以
# W 星期
# M 月
# Q 季度
# QS 季度的开始第一天
# A 年
# 10A 10年
# 10AS 十年聚合日期的第一天开始
print(df.resample('W').sum()) # rows 1028
print(df.resample('M').sum()) # rows 238
print(df.resample('Q').sum()) # rows 80
print(df.resample('QS').sum()) # rows 80
print(df.resample('A').sum()) # rows 21
# 具体 某列的数据聚合
# 备注: fillna(0) 填充nan值
print(df.open.resample('A').sum().fillna(0))
# 某两列,重新取样
print(df[['open', 'close']].resample('A').sum().fillna(0))
# 某个时间段内,以W聚合
print(df['2018-05':'2018-09'].resample('W').sum().fillna(0))
#
#
#
times = pd.date_range('20180101', periods=30)
ts = pd.Series(np.arange(1, 31), index=times)
print(ts)
ts_7d = ts.resample('7D').sum()
print(ts_7d)
# 关闭右区间, 左开. 左开右闭
# [1,8),[8,15),[15,22),[22-29),[29-5(下个月)) , label 为 left,标识从区间第一条数据开始
ts_7d = ts.resample('7D', closed='right', label='left').sum()
# (25,1],(1,8],(8,15],(15,22],(22,29],(29,5] ,
ts_7d = ts.resample('7D', closed='right', label='right').sum()
print(ts_7d)
ts_7h_asfreq = ts.resample('7H').asfreq()[-4:]
print(ts_7h_asfreq)
ts_7h_asfreq = ts.resample('7H').asfreq().ffill()[-4:]
print(ts_7h_asfreq)
ts_7h_asfreq = ts.resample('7H').bfill()[-4:]
print(ts_7h_asfreq)