前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python-for-data-重新采样和频率转换

python-for-data-重新采样和频率转换

作者头像
皮大大
发布于 2021-03-01 06:44:32
发布于 2021-03-01 06:44:32
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

Python-for-data-重新采样和频率转换

什么是重新采样

重新采样指的是将时间序列从一个频率转换到另一个频率的过程。

  • 向下采样:高频率—>低频率
  • 向上采样:低频率—>高频率

但是也并不是所有的采样方式都是属于上面的两种

pandas中使用resample方法来实现频率转换

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pandas as pd
import numpy as np
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rng = pd.date_range("2020-05-10",periods=100,freq="D")
ts = pd.Series(np.random.randn(len(rng)),index=rng)
ts
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-05-10    0.239122
2020-05-11    0.847263
2020-05-12    0.394896
2020-05-13    1.556826
2020-05-14   -0.612460
                ...
2020-08-13    0.246714
2020-08-14    1.890153
2020-08-15   -2.090757
2020-08-16   -1.076017
2020-08-17    1.139343
Freq: D, Length: 100, dtype: float64
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ts.resample("M").mean()  # 相当于是先根据M月份进行分组,再求平均值
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-05-31    0.147573
2020-06-30   -0.194357
2020-07-31   -0.027795
2020-08-31   -0.030770
Freq: M, dtype: float64
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ts.resample("M",kind="period").mean()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-05    0.147573
2020-06   -0.194357
2020-07   -0.027795
2020-08   -0.030770
Freq: M, dtype: float64

向下采样

将数据聚合到一个规则的低频上,例如将时间转换为每个月,“M"或者"BM”,将数据分成一个月的时间间隔。

每个间隔是半闭合的,一个数据只能属于一个时间间隔。时间间隔的并集必须是整个时间帧

一分钟的数据栗子
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rng = pd.date_range("2020-01-01", periods=12,freq="T")  # T 表示的是分钟
ts = pd.Series(np.arange(12),index=rng)
ts
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-01-01 00:00:00     0
2020-01-01 00:01:00     1
2020-01-01 00:02:00     2
2020-01-01 00:03:00     3
2020-01-01 00:04:00     4
2020-01-01 00:05:00     5
2020-01-01 00:06:00     6
2020-01-01 00:07:00     7
2020-01-01 00:08:00     8
2020-01-01 00:09:00     9
2020-01-01 00:10:00    10
2020-01-01 00:11:00    11
Freq: T, dtype: int64
箱体边界问题

默认情况下,左箱体边界是包含的。00:00的值是00:00到00:05间隔内的值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 通过计算每一组的加和将这些数据聚合到五分钟的块或者柱内
ts.resample("5min",closed="right").sum()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2019-12-31 23:55:00     0
2020-01-01 00:00:00    15
2020-01-01 00:05:00    40
2020-01-01 00:10:00    11
Freq: 5T, dtype: int64

产生的时间序列按照每个箱体左边的时间戳被标记。

传递label="right"可以使用右箱体边界标记时间序列

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ts.resample("5min",closed="right",label="right").sum()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2020-01-01 00:00:00     0
2020-01-01 00:05:00    15
2020-01-01 00:10:00    40
2020-01-01 00:15:00    11
Freq: 5T, dtype: int64
索引移动

向loffset参数传递字符串或者日期偏置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ts.resample("5min",closed="right",
           label="right",loffset="-2s").sum()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2019-12-31 23:59:58     0
2020-01-01 00:04:58    15
2020-01-01 00:09:58    40
2020-01-01 00:14:58    11
Freq: 5T, dtype: int64
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ts.resample("5min",closed="right",label="right").sum().index
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DatetimeIndex(['2020-01-01 00:00:00', '2020-01-01 00:05:00',
               '2020-01-01 00:10:00', '2020-01-01 00:15:00'],
              dtype='datetime64[ns]', freq='5T')

开端-峰值-谷值-结束(OHLC)

在金融数据中,为每个数据桶计算4个值是常见的问题:

  • 开端:第一个值
  • 结束:最后一个值
  • 峰值:最大的一个值
  • 谷值:最小的一个值

通过ohlc聚合函数能够得到四种聚合值列的DF数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ts.resample("5min").ohlc()

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

open

high

low

close

2020-01-01 00:00:00

0

4

0

4

2020-01-01 00:05:00

5

9

5

9

2020-01-01 00:10:00

10

11

10

11

向上采样和填充值问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
frame = pd.DataFrame(np.random.randn(2,4),
                   index=pd.date_range("5/1/2020",periods=2,freq="W-WED"),
                   columns=["Colorado","Texas","New York","Ohio"])
frame

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Colorado

Texas

New York

Ohio

2020-05-06

0.639827

0.306684

0.458653

0.461327

2020-05-13

1.056361

0.815583

1.627846

0.326976

从每个礼拜转到每天:asfreq()

低频转到高频的时候会形成缺失值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 采用asfreq方法在不聚合的情况下,转换到高频率
df_daily = frame.resample("D").asfreq()  #
df_daily

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Colorado

Texas

New York

Ohio

2020-05-06

0.639827

0.306684

0.458653

0.461327

2020-05-07

NaN

NaN

NaN

NaN

2020-05-08

NaN

NaN

NaN

NaN

2020-05-09

NaN

NaN

NaN

NaN

2020-05-10

NaN

NaN

NaN

NaN

2020-05-11

NaN

NaN

NaN

NaN

2020-05-12

NaN

NaN

NaN

NaN

2020-05-13

1.056361

0.815583

1.627846

0.326976

填充值填充

ffill():使用前面的值填充,limit限制填充的次数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
frame.resample("D").ffill(limit=3)   # ffill()使用前面的值填充

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Colorado

Texas

New York

Ohio

2020-05-06

0.639827

0.306684

0.458653

0.461327

2020-05-07

0.639827

0.306684

0.458653

0.461327

2020-05-08

0.639827

0.306684

0.458653

0.461327

2020-05-09

0.639827

0.306684

0.458653

0.461327

2020-05-10

NaN

NaN

NaN

NaN

2020-05-11

NaN

NaN

NaN

NaN

2020-05-12

NaN

NaN

NaN

NaN

2020-05-13

1.056361

0.815583

1.627846

0.326976

使用区间重新采样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
frame = pd.DataFrame(np.random.randn(24,4),
                    index=pd.period_range("1-2019","12-2020",freq="M"),
                    columns=["Colorado","Texas","New York","Ohio"])
frame[:5]

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Colorado

Texas

New York

Ohio

2019-01

-1.160706

0.309239

0.847304

0.610020

2019-02

-0.860034

0.153525

0.481263

-1.149621

2019-03

-1.506958

-0.822806

0.223697

0.364879

2019-04

-1.245177

1.886646

0.011271

1.074032

2019-05

-0.752537

0.788435

0.277268

-0.551638

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
annual_frame = frame.resample("A-DEC").mean()
annual_frame

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Colorado

Texas

New York

Ohio

2019

-0.520804

0.19733

0.341988

-0.107696

2020

-0.481252

-0.13397

0.424763

-0.014648

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Q-DEC:每季度、年末在12月份
annual_frame.resample("Q-DEC").ffill()

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Colorado

Texas

New York

Ohio

2019Q1

-0.520804

0.19733

0.341988

-0.107696

2019Q2

-0.520804

0.19733

0.341988

-0.107696

2019Q3

-0.520804

0.19733

0.341988

-0.107696

2019Q4

-0.520804

0.19733

0.341988

-0.107696

2020Q1

-0.481252

-0.13397

0.424763

-0.014648

2020Q2

-0.481252

-0.13397

0.424763

-0.014648

2020Q3

-0.481252

-0.13397

0.424763

-0.014648

2020Q4

-0.481252

-0.13397

0.424763

-0.014648

convention参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
annual_frame.resample("Q-DEC",convention="end").ffill()

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Colorado

Texas

New York

Ohio

2019Q4

-0.520804

0.19733

0.341988

-0.107696

2020Q1

-0.520804

0.19733

0.341988

-0.107696

2020Q2

-0.520804

0.19733

0.341988

-0.107696

2020Q3

-0.520804

0.19733

0.341988

-0.107696

2020Q4

-0.481252

-0.13397

0.424763

-0.014648

向上和向下采样的比较
  • 在向下采样中,目标频率必须是原频率的子区间:变小
  • 在向上采样中,目标频率必须是原频率的父区间:变大
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
annual_frame.resample("Q-MAR").ffill()

.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>

Colorado

Texas

New York

Ohio

2019Q4

-0.520804

0.19733

0.341988

-0.107696

2020Q1

-0.520804

0.19733

0.341988

-0.107696

2020Q2

-0.520804

0.19733

0.341988

-0.107696

2020Q3

-0.520804

0.19733

0.341988

-0.107696

2020Q4

-0.481252

-0.13397

0.424763

-0.014648

2021Q1

-0.481252

-0.13397

0.424763

-0.014648

2021Q2

-0.481252

-0.13397

0.424763

-0.014648

2021Q3

-0.481252

-0.13397

0.424763

-0.014648

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-5-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【算法/训练】:动态规划DP
动态规划(Dynamic Programming,DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学等领域中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题
IsLand1314
2024/10/15
4200
【算法/训练】:动态规划DP
【算法专题】动态规划之简单多状态 dp 问题
题目:一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。 在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
YoungMLet
2024/03/01
1840
【动态规划】陶然无喜亦无忧,人生且自由 - 简单多状态模型
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
用户11369350
2024/12/26
820
【动态规划】陶然无喜亦无忧,人生且自由 - 简单多状态模型
JS算法之动态规划
今天,我们继续探索JS算法相关的知识点。我们来谈谈关于「动态规划」的相关知识点和具体的算法。
前端柒八九
2022/12/19
6.2K0
JS算法之动态规划
简单多状态DP问题
一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
南桥
2024/09/20
1050
简单多状态DP问题
每周算法:斐波那契数列模型+路径问题+简单多状态dp+子数组系列
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
啊QQQQQ
2024/11/19
900
每周算法:斐波那契数列模型+路径问题+简单多状态dp+子数组系列
【LeetCode】动态规划 刷题训练(五)
cost数组的横坐标 代表 N号房子,纵坐标 代表 颜色 在每号房子中分别选取一种颜色,但是相邻之间不能选取相同的颜色,求最小花费
lovevivi
2023/10/17
2490
【LeetCode】动态规划 刷题训练(五)
算法之动态规划
动态规划(Dynamic Programming,简称DP)算法是一种通过将问题(比较复杂)划分为相互重叠的子问题(简单易于求解),并解决子问题来解决原问题的方法。它通常用于优化问题,其中需要找到最优解或最大/最小值。
九转成圣
2024/04/10
1650
算法之动态规划
动态规划入门看这篇就够了,万字长文!
今天是小浩算法 “365刷题计划” 动态规划 - 整合篇。大家应该期待已久了吧!奥利给!
程序员小浩
2020/05/08
1.6K0
动态规划入门看这篇就够了,万字长文!
算法:动态规划
上面是一个按照时间段发生的任务a,b,c,d,e,f,g,h,有的任务之间会有时间重叠。定义:
用户3578099
2022/04/18
1.7K0
算法:动态规划
漫画:动态规划系列 第六讲
在前两篇中,我们分别学习了 “三角形最小路径和” 以及“矩形最小路径和” 的问题,相信已经掌握了这类题型的解题方式。我们只要明确状态的定义,基本上都可以顺利求解。
程序员小浩
2020/03/31
3780
【动态规划】【简单多状态 dp 问题】按摩师、打家劫舍、删除并获得点数、粉刷房子
这题其实和“打家劫舍”问题很像,取完一个数之后,就不能取相邻的数了,还要取的值最大
椰椰椰耶
2024/11/15
900
【动态规划】【简单多状态 dp 问题】按摩师、打家劫舍、删除并获得点数、粉刷房子
用javascript分类刷leetcode3.动态规划(图文视频讲解)
动态规划,英文:Dynamic Programming,简称DP,将问题分解为互相重叠的子问题,通过反复求解子问题来解决原问题就是动态规划,如果某一问题有很多重叠子问题,使用动态规划来解是比较有效的。
js2030code
2022/11/18
8820
动态规划一篇就够了 全网第二详细, 逐步理解, 万字总结
动态规划,一直以来听着就是一种很高深莫测的算法思想。尤其是上学时候算法的第一堂课,老师巴拉巴拉列了一大堆的算法核心思想,贪心、回溯、动态规划... ...,开始感觉要在算法世界里游刃有余的进行解决各种各样牛B问题了,没想到的还是稀里糊涂学过了之后还就真的是学过了(大学的课程还真是一个样子)。再后来才明白,大学的课程一般来说就是入门级讲解,用来开拓眼界的,真正想要有一番自己的见解,必须要在背后下一番辛苦,形成自己的思考逻辑。
Python编程爱好者
2020/09/03
6.5K2
动态规划一篇就够了 全网第二详细, 逐步理解, 万字总结
数据结构与算法 | 动态规划算法(Dynamic Programming)
上一篇文末已经提到了记忆化搜索是动态规划(Dynamic Programming)的一种形式,是一种自顶向下(Top-Down)的思考方式,通常采用递归的编码形式;既然动态规划有自顶向下(Top-Down)的递归形式,自然想到对应的另外一种思考方式自底向上( Bottom-Up ),也就是本篇要写的内容。
Java研究者
2023/11/16
5380
数据结构与算法 | 动态规划算法(Dynamic Programming)
动态规划 —— dp 问题-粉刷房子
https://leetcode.cn/problems/JEj789/description/
迷迭所归处
2024/11/19
630
动态规划 —— dp 问题-粉刷房子
动态规划LeetCode[简单]题全解
在文章[LeetCode]动态规划及LeetCode题解分析中,Jungle介绍到求解动态规划类问题,一般分为三个步骤,这里做个简单回顾:
用户6557940
2022/07/24
2540
[LeetCode]动态规划之打家劫舍ⅠⅡⅢ
在文章[LeetCode]动态规划及LeetCode题解分析中,Jungle介绍到求解动态规划类问题,一般分为三个步骤:
用户6557940
2022/07/24
3000
[LeetCode]动态规划之打家劫舍ⅠⅡⅢ
【算法日记】从零开始认识动态规划(一)
动态规划(Dynamic Programming),简称DP。动态规划的核心是依次解决子问题,通过状态转化得到最终的结果。也就是说,针对可以划分成若干子问题的问题,我们可以使用动态规划来进行解决。
叫我龙翔
2025/01/10
1381
【算法日记】从零开始认识动态规划(一)
算法训练之动态规划(五)——简单多状态问题
可以看到题目要求给房子上颜色,并且相邻的房子颜色不能相同~这显然是是一个多状态的问题,接下来我们来一步步分析一下~
用户11352420
2025/04/12
510
算法训练之动态规划(五)——简单多状态问题
推荐阅读
相关推荐
【算法/训练】:动态规划DP
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 什么是重新采样
  • 向下采样
    • 一分钟的数据栗子
    • 箱体边界问题
    • 索引移动
  • 开端-峰值-谷值-结束(OHLC)
  • 向上采样和填充值问题
    • 从每个礼拜转到每天:asfreq()
    • 填充值填充
  • 使用区间重新采样
    • convention参数
    • 向上和向下采样的比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档