【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.16 记录数组:面向对象的数据操作

在这里插入图片描述

2.16 记录数组:面向对象的数据操作

内容提要

本文将深入探讨 NumPy 的 recarray 数据结构,这是一种特殊的数据类型,允许用户以面向对象的方式访问数组中的数据。我们首先介绍 recarray 的基本特性,然后讨论如何优化属性访问,接着介绍如何将 recarray 与 SQL 集成,最后通过一个金融时间序列案例来展示 recarray 的实际应用和性能优势。

目录

2.16 记录数组:面向对象的数据操作
2.16.1 recarray 基本特性
2.16.2 属性访问优化
2.16.3 与SQL的集成
2.16.4 金融时间序列案例
2.16.5 总结与参考文献

2.16.1 recarray 基本特性

2.16.1.1 什么是 recarray

recarray 是 NumPy 中的一种特殊数组类型,它允许用户像访问对象属性一样访问数组中的字段。这种数据类型在处理结构化数据时非常有用,特别是在需要频繁访问多个字段的情况下。

2.16.1.2 创建 recarray
import numpy as np

# 创建一个结构化数组
data = np.array([(1, 'Alice', 20), (2, 'Bob', 25), (3, 'Charlie', 30)], 
                dtype=[('id', int), ('name', 'U10'), ('age', int)])

# 将结构化数组转换为 recarray
rec_data = data.view(np.recarray)

# 访问字段
print(rec_data.name)  # 输出: ['Alice' 'Bob' 'Charlie']
2.16.1.3 访问和修改 recarray 的字段
# 修改字段
rec_data.age[1] = 26
print(rec_data.age)  # 输出: [20 26 30]

# 添加字段
rec_data = rec_data.append(('salary', 0), np.zeros(len(rec_data), dtype=int))
rec_data.salary[0] = 5000
print(rec_data.salary)  # 输出: [5000 0 0]
2.16.1.4 recarray 的优势
  • 面向对象的访问方式:可以像访问对象属性一样访问数组中的字段,代码更简洁。
  • 性能优势:在某些情况下,recarray 的访问性能优于普通的结构化数组。
  • 兼容性recarray 与 Pandas 等数据处理库的兼容性较好,可以方便地进行数据交换和处理。

2.16.2 属性访问优化

2.16.2.1 结构化数组与 recarray 的性能对比
import time

# 创建一个大型结构化数组
large_data = np.array([(i, f'Name{i}', 20 + i % 10) for i in range(1000000)], 
                      dtype=[('id', int), ('name', 'U10'), ('age', int)])

# 创建 recarray
rec_large_data = large_data.view(np.recarray)

# 测试结构化数组的访问性能
start_time = time.time()
for i in range(1000000):
    large_data[i]['age']
print(f"结构化数组访问时间: {time.time() - start_time:.2f} 秒")

# 测试 recarray 的访问性能
start_time = time.time()
for i in range(1000000):
    rec_large_data.age[i]
print(f"recarray 访问时间: {time.time() - start_time:.2f} 秒")
2.16.2.2 优化属性访问的方法
  • 缓存属性:在频繁访问属性时,可以将属性值缓存起来,减少重复计算。
  • 使用 recarray:对于需要频繁访问多个字段的场景,使用 recarray 可以显著提升性能。
2.16.2.3 缓存属性示例
class DataCache:
    def __init__(self, data):
        self.data = data
        self.cache = {}

    def __getattr__(self, attr):
        if attr not in self.cache:
            self.cache[attr] = self.data[attr]  # 缓存属性值
        return self.cache[attr]

# 创建一个缓存对象
cached_data = DataCache(large_data)

# 测试缓存对象的访问性能
start_time = time.time()
for i in range(1000000):
    cached_data.age[i]
print(f"缓存对象访问时间: {time.time() - start_time:.2f} 秒")

2.16.3 与SQL的集成

2.16.3.1 使用 pandas 进行 SQL 式查询

pandas 是一个非常强大的数据处理库,它可以方便地将 NumPy recarray 转换为 DataFrame,并进行 SQL 式的查询。

import pandas as pd

# 将 recarray 转换为 DataFrame
df = pd.DataFrame.from_records(rec_large_data, columns=rec_large_data.dtype.names)

# 进行 SQL 式的查询
result = df.query("age > 25 and age < 30")
print(result)
2.16.3.2 使用 sqlite3 集成 SQL 查询

我们还可以将 recarray 的数据存储到 SQLite 数据库中,然后使用 SQL 语句进行查询。

import sqlite3

# 创建一个 SQLite 连接
conn = sqlite3.connect(':memory:')  # 使用内存数据库
cursor = conn.cursor()

# 创建表
cursor.execute('''CREATE TABLE people (id INTEGER, name TEXT, age INTEGER)''')

# 插入数据
cursor.executemany('''INSERT INTO people (id, name, age) VALUES (?, ?, ?)''', 
                   [(rec_large_data.id[i], rec_large_data.name[i], rec_large_data.age[i]) 
                    for i in range(len(rec_large_data))])

# 提交事务
conn.commit()

# 执行 SQL 查询
cursor.execute('''SELECT * FROM people WHERE age > 25 AND age < 30''')
result = cursor.fetchall()
print(result)

2.16.4 金融时间序列案例

2.16.4.1 生成金融时间序列数据
import pandas as pd
import numpy as np

# 生成日期范围
dates = pd.date_range('20200101', periods=1000, freq='D')

# 生成随机股票价格
prices = np.random.rand(1000) * 100

# 创建结构化数组
stock_data = np.array([(dates[i], prices[i]) for i in range(1000)], 
                      dtype=[('date', 'datetime64[D]'), ('price', float)])

# 转换为 recarray
rec_stock_data = stock_data.view(np.recarray)
2.16.4.2 计算每日收益率
# 计算每日收益率
returns = np.diff(rec_stock_data.price) / rec_stock_data.price[:-1]

# 将收益率添加到 recarray
rec_stock_data = np.lib.recfunctions.append_fields(rec_stock_data, 'return', 
                                                    returns, 
                                                    dtypes=[float], 
                                                    usemask=False)

print(rec_stock_data[:5])
2.16.4.3 画图展示时间序列数据
import matplotlib.pyplot as plt

# 画图展示股票价格
plt.figure(figsize=(10, 6))
plt.plot(rec_stock_data.date, rec_stock_data.price, label='Stock Price')
plt.xlabel('Date')
plt.ylabel('Price')
plt.title('Stock Price Time Series')
plt.legend()
plt.show()

2.16.5 总结与参考文献

2.16.5.1 总结

本文详细介绍了 NumPy 的 recarray 数据结构,包括其基本特性、属性访问优化、与 SQL 的集成,以及在金融时间序列中的应用。通过 recarray,我们可以更高效地处理结构化数据,代码更加简洁和面向对象。

2.16.5.2 参考文献
资料名称链接
NumPy 官方文档https://numpy.org/doc/
Pandas 官方文档https://pandas.pydata.org/pandas-docs/stable/
SQLite 官方文档https://www.sqlite.org/docs.html
Python 官方文档https://docs.python.org/3/
Stack Overflowhttps://stackoverflow.com/
GitHubhttps://github.com/
数据科学手册http://datasciencehandbook.com/
Real Pythonhttps://realpython.com/
Mediumhttps://medium.com/
Towards Data Sciencehttps://towardsdatascience.com/
GeeksforGeekshttps://www.geeksforgeeks.org/
W3Schoolshttps://www.w3schools.com/
Programizhttps://www.programiz.com/
Python 数据处理教程https://pythondata处理.com/
NumPy 高级应用https://numpy高级应用.com/
Pandas 高级应用https://pandas高级应用.com/

这篇文章包含了详细的原理介绍、代码示例、源码注释以及案例等。希望这对您有帮助。如果有任何问题请随私信或评论告诉我。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

本地搭建deepseek-r1

一、下载ollama(官网下载比较慢&#xff0c;可以找个网盘资源下) 二、安装ollama 三、打开cmd&#xff0c;拉取模型deepseek-r1:14b(根据显存大小选择模型大小&#xff09; ollama pull deepseek-r1:14b 四、运行模型 ollama run deepseek-r1:14b 五、使用网页api访问&#x…

linux本地部署deepseek-R1模型

国产开源大模型追平甚至超越了CloseAI的o1模型&#xff0c;大国崛起时刻&#xff01;&#xff01;&#xff01; DeepSeek R1 本地部署指南   在人工智能技术飞速发展的今天&#xff0c;本地部署AI模型成为越来越多开发者和企业关注的焦点。本文将详细介绍如何在本地部署DeepS…

手写MVVM框架-环境搭建

项目使用 webpack 进行进行构建&#xff0c;初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server&#xff0c;html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…

git基础使用--4---git分支和使用

文章目录 git基础使用--4---git分支和使用1. 按顺序看2. 什么是分支3. 分支的基本操作4. 分支的基本操作4.1 查看分支4.2 创建分支4.3 切换分支4.4 合并冲突 git基础使用–4—git分支和使用 1. 按顺序看 -git基础使用–1–版本控制的基本概念 -git基础使用–2–gti的基本概念…

想品客老师的第十天:类

类是一个优化js面向对象的工具 类的声明 //1、class User{}console.log(typeof User)//function//2、let Hdclass{}//其实跟1差不多class Stu{show(){}//注意这里不用加逗号&#xff0c;对象才加逗号get(){console.log(后盾人)}}let hdnew Stu()hd.get()//后盾人 类的原理 类…

JavaFX - 3D 形状

在前面的章节中&#xff0c;我们已经了解了如何在 JavaFX 应用程序中的 XY 平面上绘制 2D 形状。除了这些 2D 形状之外&#xff0c;我们还可以使用 JavaFX 绘制其他几个 3D 形状。 通常&#xff0c;3D 形状是可以在 XYZ 平面上绘制的几何图形。它们由两个或多个维度定义&#…

arm-linux-gnueabihf安装

Linaro Releases windows下打开wsl2中的ubuntu&#xff0c;资源管理器中输入&#xff1a; \\wsl$gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz 复制到/home/ark01/tool 在 Ubuntu 中创建目录&#xff1a; /usr/local/arm&#xff0c;命令如下&#xff1a; …

【双指针题目】

双指针 美丽区间&#xff08;滑动窗口&#xff09;合并数列&#xff08;双指针的应用&#xff09;等腰三角形全部所有的子序列 美丽区间&#xff08;滑动窗口&#xff09; 美丽区间 滑动窗口模板&#xff1a; int left 0, right 0;while (right < nums.size()) {// 增大…

【汽车电子软件架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子软件架构&#xff1a;AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风&#xff0c;从概念与定义入手&#xff0c;希望读者能对AutoSAR架构有一个整体的认识&#xff0c;然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…

八、Spring Boot 日志详解

目录 一、日志的用途 二、日志使用 2.1 打印日志 2.1.1 在程序中获取日志对象 2.1.2 使用日志对象打印日志 2.2、日志框架介绍 2.2.1 门面模式(外观模式) 2.2.2 门面模式的实现 2.2.3 SLF4J 框架介绍 2.3 日志格式的说明 2.4 日志级别 2.4.1 日志级别的分类 2.4.2…

【Linux】24.进程信号(1)

文章目录 1. 信号入门1.1 进程与信号的相关知识1.2 技术应用角度的信号1.3 注意1.4 信号概念1.5 信号处理常见方式概览 2. 产生信号2.1 通过终端按键产生信号2.2 调用系统函数向进程发信号2.3 由软件条件产生信号2.4 硬件异常产生信号2.5 信号保存 3. 阻塞信号3.1 信号其他相关…

[Proteus仿真]基于51单片机的智能温控系统

[Proteus仿真]基于51单片机的智能温控系统 基于51单片机的智能温控系统&#xff1a;DS18B20精准测温LCD1602双屏显示三键设置上下限声光报警&#xff0c;支持温度校准、抗干扰设计、阈值记忆。 一.仿真原理图 ​​ 二.模块介绍 温度采集模块&#xff08;DS18B20&#xff0…

Windows下怎么安装FFFmpeg呢?

在Windows下使用Open-webui报错&#xff0c;说Couldnt find ffmpeg or avconv,解决open-webui报错Couldn‘t find ffmpeg or avconv-CSDN博客于是尝试解决问题&#xff0c;那么Windows下怎么安装FFFmpeg呢&#xff1f; 尝试了两种方法。 第一种方法pip安装&#xff08;失败&…

C基础寒假练习(2)

一、输出3-100以内的完美数&#xff0c;(完美数&#xff1a;因子和(因子不包含自身)数本身 #include <stdio.h>// 函数声明 int isPerfectNumber(int num);int main() {printf("3-100以内的完美数有:\n");for (int i 3; i < 100; i){if (isPerfectNumber…

【智力测试——二分、前缀和、乘法逆元、组合计数】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int mod 1e9 7; const int N 1e5 10; int r[N], c[N], f[2 * N]; int nr[N], nc[N], nn, nm; int cntr[N], cntc[N]; int n, m, t;void init(int n) {f[0] f[1] 1;for (int i …

Vue-el挂载点

目录 一、Vue中的el挂载点是什么&#xff1f;二、Vue实例的作用范围是什么呢&#xff1f;三、Vue中的el是否可以挂载哪些选择器&#xff1f;四、el是否可以设置其他的dom元素呢&#xff1f; 一、Vue中的el挂载点是什么&#xff1f; el是用来设置Vue实例挂载&#xff08;管理&a…

c语言练习【实现终端功能、dup2实现文件拷贝、read write文件加载到链表】

练习1&#xff1a;实现终端功能 请实现一个终端的功能&#xff0c;注意需要带有cd功能 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h>#define MAX_CM…

MySQL数据库环境搭建

下载MySQL 官网&#xff1a;https://downloads.mysql.com/archives/installer/ 下载社区版就行了。 安装流程 看b站大佬的视频吧&#xff1a;https://www.bilibili.com/video/BV12q4y1477i/?spm_id_from333.337.search-card.all.click&vd_source37dfd298d2133f3e1f3e3c…

1.2 基于深度学习的底层视觉技术

文章目录 高层视觉任务与底层视觉任务深度神经网络相对于传统方法的优势 高层视觉任务与底层视觉任务 计算机视觉中的任务包含高层视觉任务&#xff0c;底层视觉任务。高层视觉任务是处理语义级别相关的任务&#xff0c;例如图像分类、目标检测、图像分割等。底层视觉任务处理与…

YOLOV11-1:YoloV11-安装和CLI方式训练模型

YoloV11-安装和CLI方式训练模型 1.安装和运行1.1安装的基础环境1.2安装yolo相关组件1.3命令行方式使用1.3.1 训练1.3.2 预测 本文介绍yoloV11的安装和命令行接口 1.安装和运行 1.1安装的基础环境 GPU环境&#xff0c;其中CUDA是12.4版本 1.2安装yolo相关组件 # 克隆github…