【Python从入门到进阶】59、Pandas库中Series对象的操作(二)

news2024/10/5 12:59:48

接上篇《58、Pandas库中Series对象的操作(一)》
上一篇我们讲解了Pandas库中Series对象的基本概念、对象创建和操作,本篇我们来继续学习Series对象的运算、函数应用、时间序列操作,以及Series的案例实践。

一、Series对象的运算

1. 数值型数据的算术运算

Pandas的Series对象支持基本的算术运算,包括加法、减法、乘法和除法。这些运算可以在Series对象之间进行,也可以与标量(即单一数值)进行。在进行算术运算时,Pandas会尝试进行元素级别的对齐(element-wise alignment),如果Series对象的索引不同,Pandas会尝试基于索引进行匹配,或者在某些情况下使用NaN(Not a Number)来填充缺失的位置。
加法:通过+运算符或add()方法实现。
减法:通过-运算符或sub()方法实现。
乘法:通过*运算符或mul()方法实现。
除法:通过/运算符或div()方法实现。
代码示例:

import pandas as pd

# 创建Series对象
s1 = pd.Series([1, 2, 3, 4])
s2 = pd.Series([10, 20, 30, 40])

# 加法
s_add = s1 + s2
print("加法:", s_add)

# 减法
s_sub = s1 - s2
print("减法:", s_sub)

# 乘法
s_mul = s1 * s2
print("乘法:", s_mul)

# 除法
s_div = s1 / s2
print("除法:", s_div)

2. 布尔索引与数据筛选

Pandas的Series对象支持基于布尔索引(Boolean Indexing)的数据筛选。布尔索引允许你根据条件表达式的结果来选取Series中的元素。当条件表达式作用于Series对象时,会返回一个与原始Series具有相同索引的布尔型Series,其中True表示满足条件的元素,False表示不满足条件的元素。然后,你可以使用这个布尔型Series来索引原始Series,从而选取满足条件的元素。
条件表达式:使用比较运算符(如==、<、>等)创建条件表达式。
布尔索引:将条件表达式的结果用作索引,选取满足条件的元素。
代码示例:

import pandas as pd

# 创建Series对象
s = pd.Series(['apple','banana','cherry','date'])

# 布尔索引选以'a'开头的元素
filtered_s = s[s.str.startswith('a')]
print("筛选结果:", filtered_s)

3. 排序操作

Pandas的Series对象提供了两种排序方法:sort_values()和sort_index()。
sort_values():根据Series中的值进行排序。默认情况下,数据按升序排序,但也可以指定ascending=False进行降序排序。
sort_index():根据Series的索引进行排序。同样地,也可以指定ascending参数来控制排序顺序。
这两种方法都会返回一个新的已排序的Series对象,原始Series对象保持不变。
代码示例:

import pandas as pd

# 创建带有索引的Series对象
s = pd.Series([3, 1, 4, 1, 5], index=['d', 'b', 'a', 'c', 'e'])

# 根据值排序
s_sorted_values = s.sort_values()
print("按值排序:", s_sorted_values)

# 根据索引排序
s_sorted_index = s.sort_index()
print("按索引排序:", s_sorted_index)

4. 统计信息

Pandas的Series对象提供了许多统计方法,用于计算数据的描述性统计量。这些统计方法包括:
mean():计算Series中元素的均值(平均值)。
std():计算Series中元素的标准差。
max():返回Series中的最大值。
min():返回Series中的最小值。
此外,还有其他一些常用的统计方法,如median()(中位数)、mode()(众数)、quantile()(分位数)等。这些方法可以帮助你快速了解数据的分布情况和特征。
代码示例:

import pandas as pd  
  
# 创建Series对象  
s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9])  
  
# 计算统计信息  
mean_value = s.mean()  
std_value = s.std()  
max_value = s.max()  
min_value = s.min()  
  
print("均值:", mean_value)  
print("标准差:", std_value)  
print("最大值:", max_value)  
print("最小值:", min_value)

二、Series对象的函数应用

1. 使用apply()方法应用自定义函数

apply()方法是Pandas中Series对象的一个强大工具,它允许用户应用自定义函数到Series中的每个元素。通过apply()方法,用户可以轻松地执行复杂的元素级操作,这些操作可能无法通过内置的Pandas函数直接实现。

示例:定义一个函数,该函数将Series中的每个元素平方,并使用apply()方法将其应用到Series对象上。

import pandas as pd  
  
# 自定义函数,计算平方  
def square(x):  
    return x ** 2  
  
# 创建Series对象  
s = pd.Series([1, 2, 3, 4, 5])  
  
# 使用apply()方法应用自定义函数  
s_squared = s.apply(square)  
print(s_squared)

2. 使用map()方法应用字典映射

map()方法允许用户将一个字典中的键-值对映射到Series中的元素。当Series中的元素是字典的键时,这些元素将被替换为对应的值。这对于数据转换和分类特别有用。

示例:创建一个字典,将一组数字映射到它们的字符串表示形式,并使用map()方法将其应用到Series对象上。

import pandas as pd  
  
# 创建字典映射  
mapping = {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'}  
  
# 创建Series对象  
s = pd.Series([1, 2, 3, 4, 5])  
  
# 使用map()方法应用字典映射  
s_mapped = s.map(mapping)  
print(s_mapped)

3. 使用str属性进行字符串操作

对于包含字符串的Series对象,Pandas提供了str属性,该属性包含了一系列用于字符串操作的方法。这些方法与Python内置的字符串方法类似,但可以在整个Series对象上高效地应用。

示例:使用str.upper()方法将Series中的字符串转换为大写,并使用str.contains()方法检查字符串是否包含特定的子字符串。

import pandas as pd  
  
# 创建包含字符串的Series对象  
s = pd.Series(['apple', 'banana', 'cherry', 'Date', 'apple pie'])  
  
# 使用str.upper()方法转换为大写  
s_upper = s.str.upper()  
print(s_upper)  
  
# 使用str.contains()方法检查是否包含'apple'  
contains_apple = s.str.contains('apple')  
print(contains_apple)

4.pct_change()函数

pct_change()函数是Pandas库中Series和DataFrame对象的一个方法,用于计算当前元素与前一元素之间的百分比变化。它对于时间序列数据特别有用,因为它可以帮助你快速了解数据是如何随时间变化的。

具体来说,pct_change()方法计算的是当前元素与前一个元素之间的差异,然后将其除以前一个元素(得到的结果是一个比率),再乘以100(将结果转换为百分比)。第一个元素的百分比变化通常是NaN(不是数字),因为没有前一个元素可以与之比较。下面是一个简单的例子来说明pct_change()是如何工作的:

import pandas as pd  

# 创建一个简单的 Series  
s = pd.Series([100, 105, 102, 110, 108])  
  
# 计算百分比变化  
change = s.pct_change()  
  
print(change)

输出是这样的:

0         NaN  
1    0.050000  
2   -0.028571  
3    0.078431  
4   -0.018182  
dtype: float64

解释:
第一个元素的百分比变化是 NaN,因为没有前一个元素可以与之比较。
第二个元素的百分比变化是 (105 - 100) / 100 * 100 = 5%。
第三个元素的百分比变化是 (102 - 105) / 105 * 100 = -2.8571%。
以此类推...
默认情况下,pct_change() 会计算与前一个元素的百分比变化,但你也可以通过传递一个整数参数来计算与前面多个元素的百分比变化。例如,s.pct_change(2)会计算当前元素与两个前面的元素的百分比变化。

三、Series对象的时间序列操作

1. 转换为日期时间格式

Pandas 提供了一个非常方便的函数 to_datetime(),可以将 Series 对象中的字符串或其他格式的数据转换为日期时间格式。这在进行时间序列分析时非常重要。

示例:将一个包含日期字符串的 Series 转换为日期时间格式。

import pandas as pd  
  
# 创建一个包含日期字符串的 Series  
dates_str = pd.Series(['2023-01-01', '2023-01-02', '2023-01-03'])  
  
# 使用 to_datetime() 转换为日期时间格式  
dates_dt = pd.to_datetime(dates_str)  
print(dates_dt)

2. 时间序列的日期组件提取

对于日期时间格式的 Series,Pandas 提供了 .dt 访问器,它允许你提取日期时间对象的各个组件,如年、月、日、小时等。

示例:从日期时间格式的 Series 中提取年份和月份。

# 假设 dates_dt 已经是日期时间格式的 Series  
  
# 提取年份  
years = dates_dt.dt.year  
print(years)  
  
# 提取月份  
months = dates_dt.dt.month  
print(months)

3. 时间序列的位移

shift() 方法允许你沿着索引轴(通常是时间轴)移动数据。这对于时间序列分析中的滞后或领先分析非常有用。示例:将时间序列数据向前移动一个单位(例如,一天)。

# 假设 dates_dt 及其对应的值 series 是我们的时间序列数据
values = pd.Series([56, 44, 79], index=dates_dt)

# 值向前移动一个单位(日期)
shifted_values = values.shift(1)
print(shifted_values)

# 计算数据的变动情况(当前数据 - 前一天数据)
value_changes = values - shifted_values

# 打印数据变动情况
print("数据变动情况:")
print(value_changes)

注意:位移后的第一个值将会是 NaN,因为没有前一天的数据可供参考。

4. 时间序列的重采样

resample() 方法允许你根据指定的频率重新采样时间序列数据。这对于将高频数据转换为低频数据(如每日数据转换为每月数据)或将低频数据转换为高频数据(通过插值或填充)非常有用。示例:将每日数据重采样为每月数据,并计算每月的平均值。

# 假设 values 是每日数据的时间序列

# 重采样为每月数据,并计算平均值
monthly_mean = values.resample('ME').mean()
# 这里应该是前面56, 44, 79这一月份书所有数据的平均值
# (56+44+79)/3 = 59.666667
print(monthly_mean)

在这个例子中,'M' 表示月份,'MS' 通常用来表示月份的开始,'MD' 通常用来表示月份的结束。Pandas 支持多种频率代码,如 'D'(天)、'H'(小时)等。重采样后,你会得到一个具有新频率的时间序列数据。

四、Series案例实践:股票数据分析

在本案例实践中,我们将展示如何使用Pandas的Series对象对股票数据进行分析和处理。我们将分析一个假设的股票数据集,该数据集包含了某只股票在一段时间内的每日收盘价。

1. 数据准备

假设我们已经有了一个简单的字典,它包含了某只股票几天的收盘价。

import pandas as pd  
  
# 假设的收盘价数据  
stock_data = {  
    '2023-01-01': 100,  
    '2023-01-02': 102,  
    '2023-01-03': 101,  
    '2023-01-04': 103,  
    '2023-01-05': 105  
}  
  
# 将字典转换为Pandas Series对象,并设置日期为索引  
stock_prices = pd.Series(stock_data)  
stock_prices.index = pd.to_datetime(stock_prices.index)

2. 数据可视化

使用Matplotlib库来绘制收盘价的时间序列图。

import matplotlib.pyplot as plt  
  
# 绘制收盘价的时间序列图  
# 调用matplotlib.pyplot模块的figure函数创建一个新的图形窗口,并设置其大小  
plt.figure(figsize=(10, 5))  
  
# 调用Series对象的plot方法绘制时间序列图  
# 这里的title参数设置了图形的标题  
stock_prices.plot(title='Stock Price Over Time', grid=True)  
  
# 设置x轴的标签,即日期  
plt.xlabel('Date')  
  
# 设置y轴的标签,即收盘价  
plt.ylabel('Close Price')  
  
# 调用plt.show()函数显示图形  
plt.show()

这段代码的主要目的是使用matplotlib库来绘制一个表示股票收盘价的时间序列图。通过plt.figure()创建一个新的图形窗口,并设置其大小。然后,通过stock_prices.plot()调用Series对象的plot方法,绘制出时间序列图,并设置图形的标题为“Stock Price Over Time”。接着,使用plt.xlabel()和plt.ylabel()分别设置x轴和y轴的标签。最后,调用plt.show()来显示图形。

3. 数据分析

计算每日的收益率(即相对于前一日的百分比变化)。

# 计算每日收益率  
returns = stock_prices.pct_change()  
  
# 显示前几日的收益率  
print("Daily Returns:")  
print(returns.head())

效果:

4. 结论

通过上面的代码,我们展示了如何使用Pandas Series对象来表示和分析简单的股票数据。我们首先创建了一个包含收盘价的Series对象,并使用Matplotlib绘制了时间序列图。接着,我们计算了每日的收益率,并打印了前几日的收益率。这个案例简洁明了,展示了Series对象在数据分析中的基本用法。

至此,我们完成了Series对象的所有讲解。下一篇我们来讲解Pandas库中DataFrame对象的操作。

转载请注明出处:https://guangzai.blog.csdn.net/article/details/140084333

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

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

相关文章

基于JSP的体育竞赛成绩管理系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;JSP 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#xff1a;MyEclipse, Tomcat, MySQL 系统展示 首页 管理…

Windows Ternimal

Windows Ternimal 安装 Windows 终端概述 | Microsoft Learn wt --help在当前目录打开 lextm/windowsterminal-shell: Install/uninstall scripts for Windows Terminal context menu items 打开指定目录 wt -d %USERPROFILE% ohmyposh 美化 1 安装 2 添加 ohmyposh bin…

数字签名解析

1. 概述 数字签名不是手写签名的数字图像&#xff1b; 数字签名是一种可以提供认证的加密形式&#xff0c;是转向完全无纸环境的一个途径&#xff1b; 数字签名机制用以解决伪造、抵赖、冒充和篡改、完整性保护等安全问题。 2. 公钥密码与数字签名的关系 要实现数字签名&#…

【python爬虫实战】爬取豆瓣top250(网站有反爬虫机制肿么办)

关于请求头headers: 值得注意的是&#xff0c;与上一篇 &#xff1a;​​​​​​【python爬虫实战】爬取书店网站的 书名&价格&#xff08;注释详解&#xff09;-CSDN博客 爬取书名不同&#xff0c;这次爬取豆瓣网站必须使用“请求头headers”&#xff0c;不然将没有输…

SSM学习2:依赖注入、依赖自动装配、集合注入、加载properties文件

依赖注入 依赖注入方式 setter注入——引用类型 setter注入——简单类型 public class BookDaoImpl implements BookDao {public void setDatabaseName(String databaseName) {this.databaseName databaseName;}public void setNum(int num) {this.num num;}private Stri…

【图像超分辨率】一个简单的总结

文章目录 图像超分辨率(Image Super-Resolution, ISR)1 什么是图像超分辨率&#xff1f;2 图像超分辨率通常有哪些方法&#xff1f;&#xff08;1&#xff09;基于插值的方法&#xff08;2&#xff09;基于重建的方法&#xff08;3&#xff09;基于学习的方法&#xff08;LR im…

jenkins 发布服务到linux服务器

1.环境准备 1.1 需要一台已经部署了jenkins的服务器&#xff0c;上面已经集成好了&#xff0c;jdk、maven、nodejs、git等基础的服务。 1.2 需要安装插件 pusblish over ssh 1.3 准备一台额外的linux服务器&#xff0c;安装好jdk 2.流程描述 2.1 配置jenkins&#xff0c;包括p…

统计是一门艺术(参数假设检验)

1.参数假设检验 在总体分布已知的情况下&#xff0c;对分布中未知参数的检验。 &#xff08;1&#xff09;相关基本概念 零假设/原假设与对立假设/备择假设&#xff1a; 任务&#xff1a;根据样本作出是否接受H0 复合假设与简单假设&#xff1a; 否定域/拒绝域与接受域&…

Python:谈谈常规滤波器(带通、低通、高通、带阻)的用法

一、滤波器的作用 滤波器在信号处理中用于移除或减少信号中的噪声&#xff0c;同时保持信号的某些特性。滤波器通常用于音频、视频和图像处理等领域。滤波器根据其 designed for different purposes and can be divided into several types, such as lowpass filters, highpass…

【Unity设计模式】✨使用 MVC 和 MVP 编程模式

前言 最近在学习Unity游戏设计模式&#xff0c;看到两本比较适合入门的书&#xff0c;一本是unity官方的 《Level up your programming with game programming patterns》 ,另一本是 《游戏编程模式》 这两本书介绍了大部分会使用到的设计模式&#xff0c;因此很值得学习 本…

Linux rpm与yum

一、rpm包管理 rpm用于互联网下载包的打包及安装工具&#xff0c;它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。RPM是RedHat Package Manager (RedHat软件包管理工具&#xff09;的缩写&#xff0c;类似windows的setup.exe&#xff0c;这一文件格式名称虽然打上了R…

Python pip install模块时C++编译环境问题

pip install模块时C编译环境问题 在接触和使用python后&#xff0c;常常会通过pip install命令安装第三方模块&#xff0c;大多数模块可以直接安装&#xff0c;但许多新同学仍会遇见某些模块需要实时编译后才能安装&#xff0c;如报错信息大概是缺乏C编译环境&#xff0c;本文则…

Golang-GMP

GMP调度 golang-GMP语雀笔记整理 GMP调度设计目的&#xff0c;为何设计GMP?GMP的底层实现几个核心数据结构GMP调度流程 设计目的&#xff0c;为何设计GMP? 无论是多进程、多线程目的都是为了并发提高cpu的利用率&#xff0c;但多进程、多线程都存在局限性。比如多进程通过时…

Python变量的命名规则与赋值方式

第二章&#xff1a;Python 基础语法 第一节&#xff1a;变量的命名规则与赋值方式 2.1.1 引言 在编程中&#xff0c;变量是存储数据的基本单元。变量的命名和赋值是编程语言中表达和操作数据的基础。了解和遵循变量命名规则对于编写清晰、可维护的代码至关重要。 2.1.2 变量…

嵌入式Linux系统编程 — 5.2 Linux系统时间与日期

目录 1 了解Linux系统时间 1.1 几种常用的时间 1.2 如何查看几种常用的时间 1.3 Linux 系统中的时间 2 time、gettimeofday获取时间 2.1 time函数 2.2 ​​​​​​​gettimeofday函数&#xff1a; 2.3 示例程序 3 时间转换函数 3.1 ctime与ctime_r函数 3.2 localti…

小白学python(第四天)顺序与分支篇

这几天因为个人原因&#xff0c;python篇会更新比较慢&#xff0c;还望大家谅解&#xff0c;那么废话不多说&#xff0c;我们现在就进入正题 顺序篇 这个没啥好说的&#xff0c;就是自上而下&#xff0c;依次执行 分支篇 条件&#xff08;if&#xff09;语句语法格式&#…

Listary(Windows 文件搜索工具)专业版值得购买吗?

说到经典的国货软件&#xff0c;有一款 Win 软件是一定绕不过去的。它就是知名的本地文件搜索工具 Listary&#xff01; 便捷的文件搜索窗口&#xff1b;快捷操作的体验&#xff1b;与系统更匹配的外观设计&#xff1b;更智能的排序和更可靠的索引。 便捷的文件搜索窗口 紧凑…

百亿级存储架构: ElasticSearch+HBase 海量存储架构与实现

百亿级存储架构&#xff1a; ElasticSearchHBase 海量存储架构与实现 尼恩&#xff1a;百亿级数据存储架构起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿…

AI大模型API:驱动人工智能创新的核心引擎

在当今快速发展的人工智能领域&#xff0c;AI大模型API成为了开发者必备的利器。这些API为开发者提供了强大的人工智能模型和算法&#xff0c;使他们能够轻松地构建智能化应用和解决方案。作为开发者&#xff0c;我们可以借助AI大模型API实现自然语言处理、图像识别、声音合成等…

windows电脑使用netsh添加端口转发、设置端口转发和删除端口转发

目录 1. 添加端口转发 2. 查看是否添加成功 3. 设置端口转发 4. 删除端口转发 除查看命令外&#xff0c;其他命令需要以管理员方式运行。 1. 添加端口转发 命令&#xff1a; netsh interface portproxy add v4tov4 listenaddress你的外部IP listenport你的外部端口 conne…