【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.17 时间魔法:处理千万级时间序列的秘籍

news2025/1/27 17:02:11

在这里插入图片描述

1.17 时间魔法:处理千万级时间序列的秘籍

目录
时间魔法:处理千万级时间序列的秘籍
datetime64的精度的选择策略
滑动窗口统计的向量化实现
时区转换的位操作优化
金融高频交易数据处理实战
时间序列处理
精度优化
滑动窗口
时区转换
高频数据
datetime64精度选择
向量化统计
位操作优化
Tick数据清洗

1.17.1 datetime64的精度的选择策略

在处理时间序列数据时,选择合适的精度是非常重要的。NumPy 提供了 datetime64 类型来处理时间数据,datetime64 具有多种精度,包括年(Y)、月(M)、日(D)、小时(h)、分钟(m)、秒(s)、毫秒(ms)、微秒(us)、纳秒(ns)等。本节将详细介绍如何选择合适的精度,并展示其与内存占用的关系。

精度与内存关系表
精度单位时间范围内存占用/元素示例代码
年(Y)+/-2.9e9年8字节np.datetime64('2023','Y')
月(M)+/-2.4e5年8字节np.datetime64('2023-08','M')
纳秒(ns)+/-292年8字节np.datetime64('2023-08-15T12:34:56.123456789')
内存占用公式

内存总量 = 元素数量 × 8  字节 内存总量 = 元素数量 \times 8\ 字节 内存总量=元素数量×8 字节

1.17.1.1 时间精度与内存占用的关系
时间精度内存占用(字节)
Y4
M4
D8
h8
m8
s8
ms8
us8
ns8
1.17.1.2 选择合适的精度

选择合适的精度取决于你的应用场景和数据范围。例如,如果你处理的是年份数据,选择 datetime64[Y] 是最合适的,因为它占用的内存最少。如果你处理的是毫秒级时间戳,选择 datetime64[ms] 是最常见的。

import numpy as np

# 创建不同精度的 datetime64 数组
years = np.array(['2023', '2024'], dtype='datetime64[Y]')
months = np.array(['2023-01', '2023-02'], dtype='datetime64[M]')
days = np.array(['2023-01-01', '2023-01-02'], dtype='datetime64[D]')
hours = np.array(['2023-01-01T00', '2023-01-01T01'], dtype='datetime64[h]')
minutes = np.array(['2023-01-01T00:00', '2023-01-01T00:01'], dtype='datetime64[m]')
seconds = np.array(['2023-01-01T00:00:00', '2023-01-01T00:00:01'], dtype='datetime64[s]')
milliseconds = np.array(['2023-01-01T00:00:00.000', '2023-01-01T00:00:00.001'], dtype='datetime64[ms]')
microseconds = np.array(['2023-01-01T00:00:00.000000', '2023-01-01T00:00:00.000001'], dtype='datetime64[us]')
nanoseconds = np.array(['2023-01-01T00:00:00.000000000', '2023-01-01T00:00:00.000000001'], dtype='datetime64[ns]')

# 打印数组及其内存占用
arrays = [years, months, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds]
for array in arrays:
    print(f"类型: {array.dtype}, 数据: {array}, 内存占用: {array.nbytes} 字节")

1.17.2 滑动窗口统计的向量化实现

滑动窗口统计在时间序列分析中非常常见,例如计算滑动平均值。本节将介绍如何使用 NumPy 的向量化操作来实现滑动窗口统计,并通过示例进行展示。

1.17.2.1 滑动窗口的原理

滑动窗口统计是指在一个时间序列数据上滑动一个固定大小的窗口,并在每个窗口上计算某种统计量。常见的统计量包括均值、方差、最大值、最小值等。

滑动平均算法
原始数据
窗口划分
窗口运算
结果拼接
1.17.2.2 向量化滑动平均实现方案
import numpy as np

def moving_average(arr, window_size):
    """
    计算滑动平均值

    :param arr: 输入的时间序列数据
    :param window_size: 窗口大小
    :return: 滑动平均值数组
    """
    cumsum = np.cumsum(arr)  # 计算累积和
    cumsum[window_size:] = cumsum[window_size:] - cumsum[:-window_size]  # 计算滑动窗口内的累积和差值
    return cumsum[window_size - 1:] / window_size  # 计算滑动窗口内的平均值

# 创建一个时间序列数据
data = np.random.rand(10000000).astype(np.float32)  # 生成1000万条数据

# 计算滑动平均值
window_size = 1000
ma = moving_average(data, window_size)

# 打印前10个滑动平均值
print("前10个滑动平均值: ", ma[:10])

1.17.3 时区转换的位操作优化

在处理跨时区的时间序列数据时,时区转换是一个常见的需求。本节将介绍如何通过位操作优化时区转换的性能,并通过示例进行展示。

1.17.3.1 时区转换的原理

时区转换是指将一个时间戳从一个时区转换到另一个时区。通常,这需要考虑时间戳的纳秒级精度。

1.17.3.2 纳秒级时间戳的存储优化
import numpy as np
import pytz

def convert_timezone(arr, src_tz, dst_tz):
    """
    时区转换

    :param arr: 输入的时间戳数组
    :param src_tz: 源时区
    :param dst_tz: 目标时区
    :return: 转换后的时区数组
    """
    # 将时间戳转换为 datetime 对象
    dt_arr = np.array([np.datetime64(dt, 'ns') for dt in arr], dtype='datetime64[ns]']
    
    # 转换时区
    src_tz = pytz.timezone(src_tz)
    dst_tz = pytz.timezone(dst_tz)
    converted_dt_arr = np.array([src_tz.localize(pd.to_datetime(dt)).astimezone(dst_tz) for dt in dt_arr], dtype='datetime64[ns]')
    
    return converted_dt_arr

# 创建一个时间戳数组
timestamps = np.array(['2023-01-01T00:00:00.000000000', '2023-01-01T00:00:01.000000000'], dtype='datetime64[ns]')

# 进行时区转换
src_tz = 'UTC'
dst_tz = 'Asia/Shanghai'
converted_timestamps = convert_timezone(timestamps, src_tz, dst_tz)

# 打印转换后的时区数据
print("转换前的时区数据: ", timestamps)
print("转换后的时区数据: ", converted_timestamps)
时区映射表
65% 35% 时区转换类型占比 UTC到本地 本地到UTC
1.17.3.3 位操作优化示意图
位操作优化
时间戳转换为纳秒
位操作计算时区偏移
纳秒时间戳转换回 datetime64
原始时间戳: 2023-01-01T00:00:00.000000000
转换为纳秒: 1735662400000000000
时区偏移: 28800000000000 (8小时)
纳秒时间戳: 1735665280000000000
转换回 datetime64: 2023-01-01T08:00:00.000000000

1.17.4 金融高频交易数据处理实战

金融高频交易数据通常包含数百万甚至数千万条记录,处理这些数据需要高效的时间序列操作。本节将通过一个股票tick数据清洗的完整流程,展示如何使用 NumPy 处理高频交易数据。

1.17.4.1 股票tick数据清洗完整流程
  1. 读取数据:从文件中读取股票tick数据。
  2. 时间戳转换:将字符串时间戳转换为 datetime64 类型。
  3. 数据清洗:去除无效数据,如空值或异常值。
  4. 滑动窗口统计:计算滑动平均值等统计量。
  5. 数据存储:将清洗后的数据存储为 npy 文件。
import numpy as np
import pandas as pd

# 1. 读取数据
def read_tick_data(file_path):
    """
    从文件中读取股票 tick 数据

    :param file_path: 文件路径
    :return: 股票 tick 数据
    """
    data = pd.read_csv(file_path, parse_dates=['timestamp'], date_parser=lambda x: pd.to_datetime(x, unit='ns'))
    return data

# 2. 时间戳转换
def convert_timestamps(data):
    """
    将字符串时间戳转换为 datetime64 类型

    :param data: 股票 tick 数据
    :return: 转换后的时间戳数组
    """
    timestamps = data['timestamp'].values.astype('datetime64[ns]')
    return timestamps

# 3. 数据清洗
def clean_data(data):
    """
    清洗股票 tick 数据

    :param data: 股票 tick 数据
    :return: 清洗后的数据
    """
    data = data.dropna()  # 去除空值
    data = data[(data['price'] > 0) & (data['volume'] > 0)]  # 去除无效数据
    return data

# 4. 滑动窗口统计
def compute_rolling_stats(data, window_size):
    """
    计算滑动窗口统计量

    :param data: 股票 tick 数据
    :param window_size: 窗口大小
    :return: 滑动平均值、滑动标准差等统计量
    """
    prices = data['price'].values.astype(np.float32)
    rolling_mean = moving_average(prices, window_size)
    rolling_std = np.sqrt(moving_average(prices**2, window_size) - rolling_mean**2)
    return rolling_mean, rolling_std

# 5. 数据存储
def save_data(data, file_path):
    """
    将清洗后的数据存储为 npy 文件

    :param data: 清洗后的数据
    :param file_path: 文件路径
    """
    np.save(file_path, data, allow_pickle=True)

# 完整流程示例
file_path = 'tick_data.csv'
data = read_tick_data(file_path)
data = clean_data(data)
rolling_mean, rolling_std = compute_rolling_stats(data, window_size=1000)
save_data(data, 'cleaned_data.npy')
1.17.4.2 与Pandas时间序列的性能对比
import time

def benchmark_performance(func, *args, **kwargs):
    """
    测试函数性能

    :param func: 需要测试的函数
    :param args: 函数的参数
    :param kwargs: 函数的参数
    :return: 执行时间
    """
    start_time = time.time()
    func(*args, **kwargs)
    end_time = time.time()
    return end_time - start_time

# 生成测试数据
data = pd.read_csv('tick_data.csv', parse_dates=['timestamp'])

# 测试 NumPy 和 Pandas 的性能
numpy_time = benchmark_performance(clean_data, data)
pandas_time = benchmark_performance(lambda x: x.dropna().query('price > 0 and volume > 0'), data)

# 打印性能对比结果
print(f"NumPy 数据清洗时间: {numpy_time:.6f} 秒")
print(f"Pandas 数据清洗时间: {pandas_time:.6f} 秒")
性能对比表
方法数据规模耗时
循环1e6120ms
向量化1e62.3ms

总结

通过本篇文章的详细讲解和示例,我们对 NumPy 中的时间序列处理有了更深入的理解。主要内容包括:

  1. datetime64的精度的选择策略:介绍了 datetime64 的多种精度及其与内存占用的关系,并展示了如何选择合适的精度。
  2. 滑动窗口统计的向量化实现:详细讲解了滑动窗口统计的基本原理,并通过示例展示了如何使用 NumPy 的向量化操作实现滑动平均值。
  3. 时区转换的位操作优化:介绍了时区转换的基本原理,并通过位操作进行了优化的演示。
  4. 金融高频交易数据处理实战:通过一个股票tick数据清洗的完整流程,展示了如何使用 NumPy 处理千万级时间序列数据,并进行了与 Pandas 的性能对比。

希望这些内容对你有所帮助,如果你有任何问题或建议,欢迎在评论区留言。我们下一篇文章再见!

参考资料

资料名称链接
NumPy 官方文档https://numpy.org/doc/stable/
datetime64 类型https://numpy.org/doc/stable/reference/arrays.datetime.html
内存占用与精度关系https://numpy.org/doc/stable/user/basics.types.html
滑动窗口统计https://towardsdatascience.com/rolling-functions-in-numpy-23df47881d68
位操作优化https://www.geeksforgeeks.org/python-bitwise-operators/
pytz 时区库https://pypi.org/project/pytz/
Pandas 官方文档https://pandas.pydata.org/pandas-docs/stable/index.html
股票tick数据清洗https://realpython.com/finance-python-time-series/
金融数据处理https://www.mathworks.com/help/econ/financial-times-series-tutorial.html
高效数据处理https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html
时间序列分析https://www.sciencedirect.com/topics/computer-science/time-series-analysis
数据清洗技术https://www.datacamp.com/community/tutorials/data-cleaning-python
时区转换优化https://docs.python.org/3/library/datetime.html#timezone-objects

如果你觉得这篇文章对你有帮助,感谢点赞、收藏和关注!关注我,了解更多 Python 和 NumPy 的实用技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2284035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPS数据分析000009

一、函数与数据透视表统计数据时效率差异 函数 F4绝对引用 数据透视表 二、数据透视表基础操作 数据透视表:一个快速的生成报表的工具 显示详细信息 方式一; 方式二: 移动数据透视表 删除数据透视表 复制粘贴数据透视表 留足空间,否则拖动字…

Ansible自动化运维实战--script、unarchive和shell模块(6/8)

文章目录 一、script模块1.1、功能1.2、常用参数1.3、举例 二、unarchive模块2.1、功能2.2、常用参数2.3、举例 三、shell模块3.1、功能3.2、常用参数3.3、举例 一、script模块 1.1、功能 Ansible 的 script 模块允许你在远程主机上运行本地的脚本文件,其提供了一…

K8S 快速实战

K8S 核心架构原理: 我们已经知道了 K8S 的核心功能:自动化运维管理多个容器化程序。那么 K8S 怎么做到的呢?这里,我们从宏观架构上来学习 K8S 的设计思想。首先看下图: K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责核心的调度、管理和运维,Slave…

用Python和PyQt5打造一个股票涨幅统计工具

在当今的金融市场中,股票数据的实时获取和分析是投资者和金融从业者的核心需求之一。无论是个人投资者还是专业机构,都需要一个高效的工具来帮助他们快速获取股票数据并进行分析。本文将带你一步步用Python和PyQt5打造一个股票涨幅统计工具,不…

猿人学第一题 js混淆源码乱码

首先检查刷新网络可知,m参数被加密,这是一个ajax请求 那么我们直接去定位该路径 定位成功 观察堆栈之后可以分析出来这应该是一个混淆,我们放到解码平台去还原一下 window["url"] "/api/match/1";request function…

【学术会议征稿】第五届能源、电力与先进热力系统学术会议(EPATS 2025)

能源、电力与先进热力系统设计是指结合物理理论、工程技术和计算机模拟,对能源转换、利用和传输过程进行设计的学科领域。它涵盖了从能源的生产到最终的利用整个流程,旨在提高能源利用效率,减少能源消耗和环境污染。 重要信息 官网&#xf…

对神经网络基础的理解

目录 一、《python神经网络编程》 二、一些粗浅的认识 1) 神经网络也是一种拟合 2)神经网络不是真的大脑 3)网络构建需要反复迭代 三、数字图像识别的实现思路 1)建立一个神经网络类 2)权重更新的具体实现 3&am…

redis的分片集群模式

redis的分片集群模式 1 主从哨兵集群的问题和分片集群特点 主从哨兵集群可应对高并发写和高可用性,但是还有2个问题没有解决: (1)海量数据存储 (2)高并发写的问题 使用分片集群可解决,分片集群…

【29】Word:李楠-学术期刊❗

目录 题目​ NO1.2.3.4.5 NO6.7.8 NO9.10.11 NO12.13.14.15 NO16 题目 NO1.2.3.4.5 另存为手动/F12Fn光标来到开头位置处→插入→封面→选择花丝→根据样例图片,对应位置填入对应文字 (手动调整即可)复制样式:开始→样式对话框→管理…

基于 AI Coding 「RTC + STT」 Web Demo

文章目录 1. 写在最前面1.1 旧测试流程1.2 新测试流程 2. Cursor 编程 vs Copilot 编程2.1 coding 速度2.2 coding 正确性 3. 碎碎念 1. 写在最前面 为了 Fix 语音转文字(STT)产品在 Json 协议支持上的问题,笔者需要将推送到 RTC 的数据按照…

dup2 + fgets + printf 实现文件拷贝

思路 将源文件的内容读取到内存中,然后将这些内容写入到目标文件。 1: 打开源文件、目标文件 fopen() 以读模式打开源文件。 open ()以写模式打开目标文件。 2: 读取源文件、写入目标文件 fgets ()从源文件中读取内容。 printf ()将内容写入目标文件。 printf…

[ACTF2020 新生赛]Upload1

题目 以为是前端验证&#xff0c;试了一下PHP传不上去 可以创建一个1.phtml文件。对.phtml文件的解释: 是一个嵌入了PHP脚本的html页面。将以下代码写入该文件中 <script languagephp>eval($_POST[md]);</script><script languagephp>system(cat /flag);&l…

SpringBoot整合Swagger UI 用于提供接口可视化界面

目录 一、引入相关依赖 二、添加配置文件 三、测试 四、Swagger 相关注解 一、引入相关依赖 图像化依赖 Swagger UI 用于提供可视化界面&#xff1a; <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactI…

深度学习项目--基于LSTM的糖尿病预测探究(pytorch实现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 LSTM模型一直是一个很经典的模型&#xff0c;一般用于序列数据预测&#xff0c;这个可以很好的挖掘数据上下文信息&#xff0c;本文将使用LSTM进行糖尿病…

LeetCode - Google 大模型校招10题 第1天 Attention 汇总 (3题)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145368666 GroupQueryAttention(分组查询注意力机制) 和 KVCache(键值缓存) 是大语言模型中的常见架构&#xff0c;GroupQueryAttention 是注意力…

Kotlin开发(七):对象表达式、对象声明和委托的奥秘

Kotlin 让代码更优雅&#xff01; 每个程序员都希望写出优雅高效的代码&#xff0c;但现实往往不尽人意。对象表达式、对象声明和 Kotlin 委托正是为了解决代码中的复杂性而诞生的。为什么选择这个主题&#xff1f;因为它不仅是 Kotlin 语言的亮点之一&#xff0c;还能极大地提…

数据库、数据仓库、数据湖有什么不同

数据库、数据仓库和数据湖是三种不同的数据存储和管理技术&#xff0c;它们在用途、设计目标、数据处理方式以及适用场景上存在显著差异。以下将从多个角度详细说明它们之间的区别&#xff1a; 1. 数据结构与存储方式 数据库&#xff1a; 数据库主要用于存储结构化的数据&…

【2024年华为OD机试】 (B卷,100分)- 字符串摘要(JavaScriptJava PythonC/C++)

一、问题描述 题目描述 给定一个字符串的摘要算法&#xff0c;请输出给定字符串的摘要值。具体步骤如下&#xff1a; 去除字符串中非字母的符号&#xff1a;只保留字母字符。处理连续字符&#xff1a;如果出现连续字符&#xff08;不区分大小写&#xff09;&#xff0c;则输…

DIY QMK量子键盘

最近放假了&#xff0c;趁这个空余在做一个分支项目&#xff0c;一款机械键盘&#xff0c;量子键盘取自固件名称QMK&#xff08;Quantum Mechanical Keyboard&#xff09;。 键盘作为计算机或其他电子设备的重要输入设备之一&#xff0c;通过将按键的物理动作转换为数字信号&am…

mamba论文学习

rnn 1986 训练速度慢 testing很快 但是很快就忘了 lstm 1997 训练速度慢 testing很快 但是也会忘&#xff08;序列很长的时候&#xff09; GRU实在lstm的基础上改进&#xff0c;改变了一些门 transformer2017 训练很快&#xff0c;testing慢些&#xff0c;时间复杂度高&am…