【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.10 文本数据炼金术:从CSV到结构化数组

在这里插入图片描述

1.10 《文本数据炼金术:从CSV到结构化数组》

目录
1.10 文本数据炼金术:从CSV到结构化数组
1.10.1 引言
1.10.2 结构化数据类型定义详解
1.10.3 处理缺失值的5种策略
1.10.4 大文件分块读取优化
1.10.5 时区转换等高级处理
1.10.6 结构化数组与Pandas的互操作对比
1.10.7 总结

1.10.1 引言

在数据科学和机器学习领域,处理文本数据是一项常见的任务。CSV(Comma-Separated Values)文件是一种常用的文本数据格式,它们以逗号分隔的值来存储数据。将CSV文件转换为NumPy的结构化数组可以显著提高数据处理的效率和灵活性。本文将详细探讨如何从CSV文件中读取数据并将其转换为NumPy的结构化数组,同时介绍处理缺失值、大文件分块读取优化、时区转换等高级处理技巧,并与Pandas进行互操作对比。

文本数据处理流程
数据加载
类型转换
缺失值处理
数据优化
高级转换
分块读取
结构化类型定义
填充策略
内存映射
时区转换

1.10.2 结构化数据类型定义详解

1.10.2.1 什么是结构化数组?

结构化数组(Structured Array)是NumPy中的一种高级数据类型,它允许每个字段有不同的数据类型。与普通的NumPy数组相比,结构化数组具有更强的描述性和灵活性,适用于处理复杂的数据结构。

1.10.2.2 创建结构化数组

可以使用numpy.dtype对象来定义结构化数据类型。以下是一个简单的例子:

import numpy as np# 定义结构化数据类型
dtype = np.dtype([('name', 'U20'),  # 姓名,使用Unicode字符串,最多20个字符('age', 'i4'),    # 年龄,使用32位整数('gender', 'U10'), # 性别,使用Unicode字符串,最多10个字符('height', 'f8')  # 身高,使用64位浮点数
])# 创建结构化数组
data = np.array([('Alice', 25, 'Female', 165.5),('Bob', 30, 'Male', 175.0),('Charlie', 35, 'Male', 180.0)
], dtype=dtype)print(data)

1.10.2.3 数据类型映射表(Python↔NumPy)

Python Data TypeNumPy Data Type
int‘i4’
float‘f8’
str‘U20’ or ‘S20’
bool‘b1’
datetime‘datetime64’
None‘O’ (object)

1.10.2.4 结构化数组的操作

结构化数组支持各种NumPy的操作,如索引、切片、排序等。以下是一些示例:

# 索引
print(data['name'])  # 输出所有姓名# 切片
print(data[1:3])  # 输出第2和第3个记录# 排序
sorted_data = np.sort(data, order='age')  # 按年龄排序
print(sorted_data)

1.10.2.5 多字段排序

多字段排序允许我们根据多个字段对结构化数组进行排序。例如,我们可以先按年龄排序,再按身高排序:

sorted_data = np.sort(data, order=['age', 'height'])
print(sorted_data)

1.10.2.6 内存效率

结构化数组在内存使用上比普通数组更高效,因为它可以精确地存储每个字段的数据类型和大小。这对于处理大规模数据集非常有帮助。

1.10.3 处理缺失值的5种策略

1.10.3.1 填充默认值

对于缺失值,最简单的处理方式是填充默认值。例如,对于整数字段,可以填充0;对于浮点数字段,可以填充np.nan

data = np.array([('Alice', 25, 'Female', 165.5),('Bob', 30, 'Male', np.nan),  # 缺失值('Charlie', 35, 'Male', 180.0)
], dtype=dtype)# 填充默认值
data['height'] = np.nan_to_num(data['height'], nan=0.0)  # 将nan填充为0.0
print(data)

1.10.3.2 插值

插值是一种常用的数据填充方法。NumPy提供了多种插值方法,如线性插值和最近邻插值。

import pandas as pddf = pd.DataFrame(data)
df['height'] = df['height'].interpolate()  # 线性插值
data = df.to_records(index=False)  # 转换回NumPy结构化数组
print(data)

1.10.3.3 删除缺失值的记录

如果缺失值不影响整体数据,可以考虑删除这些记录。

data = data[~np.isnan(data['height'])]  # 删除height字段为nan的记录
print(data)

1.10.3.4 使用掩码数组

NumPy的掩码数组(Masked Array)可以方便地处理缺失值。

masked_data = np.ma.masked_invalid(data['height'])  # 创建掩码数组
print(masked_data)

1.10.3.5 使用特殊标记

在某些情况下,可以使用特殊标记来表示缺失值,例如-1或-999。

data['height'] = np.where(np.isnan(data['height']), -999, data['height'])  # 将nan填充为-999
print(data)

1.10.4 大文件分块读取优化

1.10.4.1 问题背景

处理大规模的CSV文件时,一次性加载所有数据到内存中可能会导致内存溢出。因此,需要使用分块读取的方法来优化性能。

1.10.4.2 使用numpy.loadtxt分块读取

numpy.loadtxt可以通过设置skiprowsmax_rows参数来实现分块读取。

import numpy as npdef read_chunk(file, dtype, skiprows, max_rows):return np.loadtxt(file, dtype=dtype, delimiter=',', skiprows=skiprows, max_rows=max_rows)# 定义结构化数据类型
dtype = np.dtype([('name', 'U20'),('age', 'i4'),('gender', 'U10'),('height', 'f8')
])# 读取大文件
chunk_size = 1000
with open('large_file.csv', 'r') as file:for i in range(0, 10000, chunk_size):chunk = read_chunk(file, dtype, i, chunk_size)print(f"读取了第{i + 1}到第{i + chunk_size}行数据")print(chunk)

1.10.4.3 使用生成器实现流式处理

生成器是一种更高效的方法,可以在读取数据时进行处理,而无需将所有数据加载到内存中。

def read_csv_in_chunks(file, dtype, chunk_size=1000):with open(file, 'r') as f:while True:chunk = np.loadtxt(f, dtype=dtype, delimiter=',', max_rows=chunk_size)if len(chunk) == 0:breakyield chunk# 读取大文件
dtype = np.dtype([('name', 'U20'),('age', 'i4'),('gender', 'U10'),('height', 'f8')
])for i, chunk in enumerate(read_csv_in_chunks('large_file.csv', dtype)):print(f"读取了第{i * chunk_size + 1}到第{(i + 1) * chunk_size}行数据")print(chunk)

1.10.4.4 Dask库的使用

Dask是一个用于并行计算的库,可以轻松处理大规模的数据集。

import dask.array as da# 读取大文件
dask_data = da.from_csv('large_file.csv', dtype=dtype, blocksize=1000 * 1024)  # 每块1MB
print(dask_data)

1.10.5 时区转换等高级处理

1.10.5.1 时区转换的重要性

在处理时间数据时,时区转换是一个关键步骤。不同的时区会导致时间戳的不一致,影响数据分析的准确性。

1.10.5.2 时区转换的实现

NumPy的时间戳类型datetime64支持时区转换。以下是一个简单的示例:

import numpy as np
import pytz
from datetime import datetime# 生成带时区的日期时间
dt = np.datetime64('2023-01-01T00:00:00', 'ns').astype(datetime).replace(tzinfo=pytz.utc)
print(dt)# 转换时区
dt = dt.astimezone(pytz.timezone('Asia/Shanghai'))
print(dt)

1.10.5.3 带时区的时间戳转换实战

实际应用中,我们可能需要处理包含时间戳的CSV文件,并进行时区转换。

import numpy as np
import pytz
from datetime import datetime# 定义结构化数据类型
dtype = np.dtype([('name', 'U20'),('age', 'i4'),('gender', 'U10'),('timestamp', 'datetime64[ns]')  # 时间戳字段
])# 读取数据
data = np.loadtxt('large_file.csv', dtype=dtype, delimiter=',')# 转换时区
def convert_timezone(timestamp, from_tz, to_tz):dt = timestamp.astype(datetime).replace(tzinfo=from_tz)return dt.astimezone(to_tz).timestamp()from_tz = pytz.utc
to_tz = pytz.timezone('Asia/Shanghai')data['timestamp'] = np.vectorize(convert_timezone)(data['timestamp'], from_tz, to_tz)
print(data)

1.10.5.4 时区转换的性能优化

时区转换是一个计算密集型操作,可以使用NumPy的矢量化函数来提高性能。

# 矢量化时区转换函数
convert_timezone_vec = np.vectorize(convert_timezone, otypes=[np.float64])data['timestamp'] = convert_timezone_vec(data['timestamp'], from_tz, to_tz)
print(data)

1.10.6 结构化数组与Pandas的互操作对比

1.10.6.1 Pandas的优势

Pandas是Python中处理数据的最常用库之一,它提供了丰富的数据处理功能和高效率的性能。

1.10.6.2 从Pandas DataFrames到NumPy结构化数组

Pandas DataFrames可以轻松地转换为NumPy的结构化数组。

import pandas as pd
import numpy as np# 读取CSV文件
df = pd.read_csv('large_file.csv')# 转换为NumPy结构化数组
dtype = np.dtype([('name', 'U20'),('age', 'i4'),('gender', 'U10'),('height', 'f8')
])data = df.to_records(index=False, convert_datetime64=True, dtype=dtype)
print(data)

1.10.6.3 从NumPy结构化数组到Pandas DataFrames

同样,NumPy的结构化数组也可以轻松地转换为Pandas DataFrames。

# 转换为Pandas DataFrames
df = pd.DataFrame(data)
print(df)

1.10.6.4 性能对比

在处理大规模数据时,NumPy通常比Pandas更高效。以下是一个简单的性能对比示例:

import time# 生成大规模数据
large_data = np.array([(f'User{i}', np.random.randint(18, 80), np.random.choice(['Male', 'Female']), np.random.rand())for i in range(1000000)
], dtype=dtype)# 使用NumPy处理
start_time = time.time()
numPy_data = np.sort(large_data, order='age')
end_time = time.time()
print(f"NumPy处理时间: {end_time - start_time:.2f}秒")# 使用Pandas处理
df = pd.DataFrame(large_data)
start_time = time.time()
pandas_data = df.sort_values(by='age')
end_time = time.time()
print(f"Pandas处理时间: {end_time - start_time:.2f}秒")

1.10.7 总结

本文详细介绍了如何从CSV文件中读取数据并将其转换为NumPy的结构化数组。我们讨论了结构化数据类型的定义、缺失值的处理、大文件的分块读取优化、时区转换等高级处理技巧,并与Pandas进行了互操作对比。

参考文献

参考资料名称链接
NumPy官方文档https://numpy.org/doc/stable/
Pandas官方文档https://pandas.pydata.org/docs/
Dask官方文档https://docs.dask.org/en/latest/
Python官方文档https://docs.python.org/3/
《NumPy用户指南》https://numpy.org/doc/stable/user/index.html
《Pandas用户指南》https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html
《Dask用户指南》https://docs.dask.org/en/latest/user.html
《Python数据科学手册》https://jakevdp.github.io/PythonDataScienceHandbook/
《NumPy教程》https://towardsdatascience.com/numpy-tutorial-e0ebc6d53b6f
《Pandas教程》https://towardsdatascience.com/pandas-tutorial-906df96a3e50
《Dask教程》https://towardsdatascience.com/dask-tutorial-20e2ff974da1
《NumPy性能优化》https://realpython.com/faster-numpy-arrays-cython/
《Pandas性能优化》https://towardsdatascience.com/10-tips-for-faster-pandas-1e52b1d465bb
《Dask性能优化》https://medium.com/condition-red/dask-performance-tips-6d6ce01646c2
《NumPy结构化数组详解》https://numpy.org/doc/stable/user/basics.rec.html
《Pandas处理缺失值》https://pandas.pydata.org/pandas-docs/stable/user_guide/missing_data.html
《Dask读取大文件》https://docs.dask.org/en/latest/array-creation.html
《NumPy时区转换》https://numpy.org/doc/stable/reference/arrays.datetime.html
《Pandas时区转换》https://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html
《Dask流式处理》https://docs.dask.org/en/latest/delayed.html
《Python生成器详解》https://realpython.com/introduction-to-python-generators/
《NumPy和Pandas互操作》https://numpy.org/doc/stable/user/basics.interface.html
《NumPy和Pandas性能对比》https://towardsdatascience.com/performance-comparison-of-numpy-vs-pandas-vs-python-list-2c96d35c8b00
《NumPy和Pandas在数据科学中的应用》https://medium.com/@a/data-science-with-numpy-and-pandas-8d2b4c0a4e58
《NumPy和Pandas的最佳实践》https://towardsdatascience.com/numpy-and-pandas-best-practices-b0e0dee09e73
《NumPy和Pandas处理大文件的技巧》https://towardsdatascience.com/working-with-large-data-in-python-and-pandas-9c0ea4d44feb

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程概念:【环境变量】【程序地址空间】

目录 一.环境变量 1.1基本概念 1.2命令行参数 1.3一个例子,一个环境变量 1.4环境变量的组织方式 1.5查看环境变量的方法 ​编辑 1.6从存储的角度理解环境变量 1.7环境变量最开始是从系统的配置文件里来的 1.8认识更多的环境变量 HOME HISTSIZE HOSTNANE…

医疗集群系统中基于超融合数据库架构的应用与前景探析

一、引言 1.1 研究背景与意义 随着医疗信息化的飞速发展,医疗数据呈爆炸式增长。从日常诊疗记录、患者病历,到各类医疗影像、检查检验数据等,海量信息不断涌现。据统计,医疗数据的年增长率高达 30% 以上 ,2025 年,全球医疗数据量将达到 2314 艾字节(EB)。如此庞大的数…

【leetcode100】从前序与中序遍历序列构造二叉树

1、题目描述 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: [3,9,20,nul…

【CSS入门学习】Flex布局设置div水平、垂直分布与居中

水平平均分布 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>…

【ARM】解决MDK在打开工程的时候提示CMSIS的版本不对问题

1、 文档目标 解决MDK在打开使用Compiler 6的工程的时候&#xff0c;提示CMSIS 的API版本过低的报错。 2、 问题场景 客户在Pack包中打开一个示例工程&#xff0c;打算熟悉一下对应芯片的功能和软件的功能&#xff0c;但是&#xff0c;打开软件后&#xff0c;在构建信息输出框…

PyCharm接入DeepSeek实现AI编程

目录 效果演示 创建API key 在PyCharm中下载CodeGPT插件 配置Continue DeepSeek 是一家专注于人工智能技术研发的公司&#xff0c;致力于开发高性能、低成本的 AI 模型。DeepSeek-V3 是 DeepSeek 公司推出的最新一代 AI 模型。其前身是 DeepSeek-V2.5&#xff0c;经过持续的…

【PyTorch][chapter 29][李宏毅深度学习]Fine-tuning LLM

参考&#xff1a; https://www.youtube.com/watch?veC6Hd1hFvos 目录&#xff1a; 什么是 Fine-tune 为什么需要Fine-tuning 如何进行Fine-tune Fine-tuning- Supervised Fine-tuning 流程 Fine-tuning参数训练的常用方案 LORA 简介 示例代码 一 什么是 Fine-tune …

动手学图神经网络(3):利用图神经网络进行节点分类 从理论到实践

利用图神经网络进行节点分类&#xff1a;从理论到实践 前言 在之前的学习中&#xff0c;大家对图神经网络有了初步的了解。本次教程将深入探讨如何运用图神经网络&#xff08;GNNs&#xff09;来解决节点分类问题。在节点分类任务里&#xff0c;大家往往仅掌握少量节点的真实…

云原生:构建现代化应用的基石

一、什么是云原生&#xff1f; 云原生是一种构建和运行应用程序的方法&#xff0c;旨在充分利用云计算的分布式系统优势&#xff0c;例如弹性伸缩、微服务架构、容器化技术等。云原生应用程序从设计之初就考虑到了云环境的特点&#xff0c;能够更好地适应云平台的动态变化&…

springboot3 集成 knife4j(接口文档)

提示&#xff1a;文章是集成 knife4j&#xff0c;而非 swagger2 或者 swagger3&#xff0c;效果如图 文章目录 前言一、添加依赖二、如何集成1.配置文件2.注解部分1.Tag2.Operation3.Parameter4.Schema 3.使用 总结 前言 提示&#xff1a;&#xff1a;大家在开发阶段&#xff…

基于单片机的智能小区门禁系统设计(论文+源码)

1总体架构 智能小区门禁系统以STM32单片机和WiFi技术为核心&#xff0c;STM32单片机作为主控单元&#xff0c;通过WiFi模块实现与手机APP的连接&#xff0c;构建整个门禁系统。系统硬件包括RFID模块、指纹识别模块、显示屏、按键以及继电器。通过RFID绑定IC卡、APP面部识别、指…

后盾人JS--闭包明明白白

延伸函数环境生命周期 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

The just sharing principle: advice for advice givers

原文 A while ago I wrote about how Only you know what’s best for your application. That’s because only you fully understand the context within which you are making technical decisions. Any advice need to filtered through that context in order to determi…

Charles 4.6.7 浏览器网络调试指南:HTTPS抓包(三)

概述 在现代互联网应用中&#xff0c;网络请求和响应是服务交互的核心。对于开发者和测试人员来说&#xff0c;能够准确捕获并分析这些请求&#xff0c;是保证系统稳定性和性能的关键。Charles作为一个强大的网络调试工具&#xff0c;不仅可以捕获普通的HTTP请求&#xff0c;还…

安装Office自定义项,安装期间出错

个人博客地址&#xff1a;安装Office自定义项&#xff0c;安装期间出错 | 一张假钞的真实世界 卸载PowerDesigner后&#xff0c;打开“WPS文字”时出现下图错误&#xff1a; 解决方法&#xff1a; 按“WinR”快捷键&#xff0c;打开【运行】框&#xff0c;在对话框中输入“re…

图漾相机搭配VisionPro使用简易教程

1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0 /9.5/9.6版本经测试&#xff0c;可正常打开图漾相机&#xff0c;建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载&#xff1a;https://gitee.com/percipioxyz/camport…

信息系统管理工程师第6-8章精讲视频及配套千题通关双双发布,附第14章思维导图

这一周发文少&#xff0c;不是我在偷懒&#xff0c;而是在和信管的视频及千题通关“”浴血奋战 &#xff0c;特别是第8章卡了我很久&#xff0c;因为内容实在太多&#xff0c;精讲视频估计都差不多4个小时了&#xff0c;还好终于在春节前拿下&#xff0c;提供给小分队的同学&am…

RNN实现阿尔茨海默症的诊断识别

本文为为&#x1f517;365天深度学习训练营内部文章 原作者&#xff1a;K同学啊 一 导入数据 import torch.nn as nn import torch.nn.functional as F import torchvision,torch from sklearn.preprocessing import StandardScaler from torch.utils.data import TensorDatase…

ui-automator定位官网文档下载及使用

一、ui-automator定位官网文档简介及下载 AndroidUiAutomator&#xff1a;移动端特有的定位方式&#xff0c;uiautomator是java实现的&#xff0c;定位类型必须写成java类型 官方地址&#xff1a;https://developer.android.com/training/testing/ui-automator.html#ui-autom…

算法每日双题精讲 —— 二分查找(寻找旋转排序数组中的最小值,点名)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#x1f4aa; 在算法的…