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

在这里插入图片描述

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

内容提要

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

目录

Syntax error in textmermaid version 10.9.0

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/

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

posted @   爱上编程技术  阅读(7)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示