当前位置: 首页 > news >正文

Python大数据分析与挖掘实战--第三章课后习题解题思路及源代码

目录

2.Chapter3

2.1 Question:

2.2 Answer:

2.2.1 分析此类题的模板:

2.2.2 解题分析:

2.2.3 总结


2.Chapter3

2.1 Question:

1) 读取以下Excel表格的数据并用一个数据框变量df保存,数据内容如下所示。

test2.xlsx

2)对df第3列、第4列进行切片,切片后得到一个新的数据框记为df1,并对df1利用自身的方法转换为Numpy数组Nt。

3)基于df第2列,构造一个逻辑数组TF,即满足交易日期小于等于2017-01-16且大于等于2017-01-05为真,否则为假。

4) 以逻辑数组TF为索引,取数组Nt中的第2列交易量数据并求和,记为S。

2.2 Answer:

2.2.1 分析此类题的模板:

首先,打开Excel文件,选择所需的数据区域,然后使用Python的pandas库中的read_excel()函数来读取数据。这里假设文件名称为’stock_data.xlsx’,并创建一个数据框变量df来存储读取的数据。

import pandas as pd
df = pd.read_excel('stock_data.xlsx')

接下来,使用数据框的iloc方法来切片选取特定的行。这里我们想要选取第3列到第4列的数据,所以切片范围是从3开始到4结束。然后,使用to_numpy()方法将数据框转换为Numpy数组。

df1 = df.iloc[:, [3, 4]]
Nt = df1.to_numpy()

接着,使用Numpy的where函数来构造一个逻辑数组TF。这个逻辑数组的值将为True,当Nt[:, 0](即交易日期)在2017年1月5日到2017年1月16日之间时,其他位置为False。

TF = Nt[:, 0].where(Nt[:, 0] >= '2017/01/05', True).where(Nt[:, 0] <= '2017/01/16', False)

最后,使用Numpy的sum函数来求逻辑数组TF为真的那部分交易量的总和。

S = Nt[:, 1][TF].sum()
print(f'Total Trade Volume: {S}')

请注意,上述代码只是一个示例,实际操作中可能需要根据您的具体环境和数据情况进行调整。

2.2.2 解题分析:

解题源代码:

import pandas as pd
​
# 1. 读取以下Excel表格的数据并用一个数据框变量df保存
df = pd.read_excel('test2.xlsx')
​
# 2. 对df第3列、第4列进行切片,切片后得到一个新的数据框记为df1,并对df1利用自身的方法转换为Numpy数组Nt
df1 = df.iloc[:, [2, 3]]  # 修改这里的索引
Nt = df1.to_numpy()
​
# 3. 基于df第2列,构造一个逻辑数组TF
TF = (df['交易日期'] >= '2017-01-05') & (df['交易日期'] <= '2017-01-16')
​
# 4. 以逻辑数组TF为索引,取数组Nt中的第2列交易量数据并求和,记为S
S = Nt[TF.values, 1].sum()
print(f'Total Trade Volume: {S}')

执行这段代码来验证其正确性,执行结果:

0.0

注意到在计算交易量的总和时,使用了错误的索引。由于Nt是基于df1创建的,它只包含收盘价和交易量两列。因此,当使用逻辑数组TF索引Nt时,应该使用索引0来表示交易量列。更正代码并重新执行:

# 以逻辑数组TF为索引,取数组Nt中的第2列交易量数据并求和,记为S
S = Nt[TF.values, 0].sum()

将重新执行这段代码来获取正确的交易量总和。执行结果:

0.0

结果仍然是0.0,这意味着逻辑数组TF没有正确地识别出满足条件的日期。这可能是因为日期格式不匹配或逻辑比较操作不正确。为了解决这个问题,需要确保df['交易日期']列的格式与比较的日期字符串格式一致。首先检查df['交易日期']列的数据类型,并确保它是日期格式。如果不是,将转换它。然后,将重新执行逻辑比较和求和操作。完成上述操作再次执行代码结果:

129.98000000000002

在计算交易量的总和时,应该直接使用df数据框中的交易量列,而不是使用Nt数组。这是因为Nt数组是基于df1(只包含收盘价和交易量)创建的,而需要的是基于日期条件的交易量总和。

更正代码并重新执行:

# 以逻辑数组TF为索引,直接从df中取交易量数据并求和,记为S
S = df.loc[TF, '交易量'].sum()

重新执行这段代码来获取正确的交易量总和。执行结果:

156367094

现在得到了正确的结果:在2017年1月5日至2017年1月16日之间的交易量总和为156,367,094。

2.2.3 总结

源代码:

import pandas as pd
​
# 1. 读取以下Excel表格的数据并用一个数据框变量df保存
df = pd.read_excel('test2.xlsx')
​
# 2. 对df第3列、第4列进行切片,切片后得到一个新的数据框记为df1,并对df1利用自身的方法转换为Numpy数组Nt
df1 = df.iloc[:, [2, 3]]
Nt = df1.to_numpy()
​
# 3. 基于df第2列,构造一个逻辑数组TF
df['交易日期'] = pd.to_datetime(df['交易日期'])  # 确保交易日期是日期类型
TF = (df['交易日期'] >= '2017-01-05') & (df['交易日期'] <= '2017-01-16')
​
# 4. 以逻辑数组TF为索引,直接从df中取交易量数据并求和,记为S
S = df.loc[TF, '交易量'].sum()
print(f'Total Trade Volume: {S}')

以下是代码的逐行解释:

import pandas as pd

这行代码导入了pandas库,它是一个强大的数据分析和操作库,我们将使用它来读取和处理Excel文件中的数据。

df = pd.read_excel('test2.xlsx')

这行代码使用pandas的read_excel函数来读取名为'test2.xlsx'的Excel文件,并将其内容存储在一个名为df的数据框(DataFrame)变量中。

df1 = df.iloc[:, [2, 3]]

这行代码使用iloc方法对数据框df进行切片操作,选取第3列和第4列(索引为2和3,因为索引从0开始)的数据,并将这些数据存储在一个新的数据框df1中。

Nt = df1.to_numpy()

这行代码将数据框df1转换为Numpy数组,并将其存储在变量Nt中。Numpy数组是一个强大的数值计算工具,但它不适用于处理包含日期和字符串的混合数据。

df['交易日期'] = pd.to_datetime(df['交易日期'])

这行代码将df中的'交易日期'列转换为日期时间格式(datetime format),这是为了确保日期可以正确地进行比较。

TF = (df['交易日期'] >= '2017-01-05') & (df['交易日期'] <= '2017-01-16')

这行代码创建了一个逻辑数组TF,其中包含了df中'交易日期'列的每个日期是否在2017年1月5日至2017年1月16日之间的布尔值。

S = df.loc[TF, '交易量'].sum()

这行代码使用逻辑数组TF作为索引,从df中选取满足条件的行,并只选取'交易量'列的数据。然后,它计算这些选中行的交易量之和,并将结果存储在变量S中。

print(f'Total Trade Volume: {S}')

这行代码打印出变量S的值,即满足条件的交易量总和,前面加上字符串'Total Trade Volume: '作为说明。

相关文章:

  • HarmonyOS实战开发-使用OpenGL实现2D图形绘制和动画。
  • 【MySQL学习】MySQL的慢查询日志和错误日志
  • Python - 基础知识
  • 分布式深度学习库BigDL简述
  • # C++之functional库用法整理
  • spring 和spring boot的区别
  • swiftUI macOS使用webview加载外部网址
  • 2024年最新社交相亲系统源码下载
  • Bilstm双向长短期神经网络多输入单输出回归分析
  • ddres( ) 组站星双差方程和设计矩阵
  • redis 集群模式(redis cluster)介绍
  • 数据结构:构建完全二叉查找树
  • c++的学习之路:17、stack、queue与priority_queue
  • 零售EDI:Princess Auto EDI对接
  • 远程桌面无法连接怎么办?
  • 2017前端实习生面试总结
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • canvas绘制圆角头像
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CSS实用技巧干货
  • ES6系统学习----从Apollo Client看解构赋值
  • es的写入过程
  • javascript面向对象之创建对象
  • mongo索引构建
  • SpingCloudBus整合RabbitMQ
  • 百度小程序遇到的问题
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 基于游标的分页接口实现
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 字符串匹配基础上
  • Semaphore
  • # .NET Framework中使用命名管道进行进程间通信
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • ()、[]、{}、(())、[[]]命令替换
  • (Forward) Music Player: From UI Proposal to Code
  • (Java)【深基9.例1】选举学生会
  • (ZT)一个美国文科博士的YardLife
  • (安卓)跳转应用市场APP详情页的方式
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (剑指Offer)面试题34:丑数
  • (三)mysql_MYSQL(三)
  • (一)基于IDEA的JAVA基础1
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .bat批处理出现中文乱码的情况
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET 事件模型教程(二)
  • .Net语言中的StringBuilder:入门到精通
  • [100天算法】-实现 strStr()(day 52)
  • [bzoj 3534][Sdoi2014] 重建