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: '作为说明。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-09 16:38:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-09 16:38:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-09 16:38:03       82 阅读
  4. Python语言-面向对象

    2024-04-09 16:38:03       91 阅读

热门阅读

  1. Leetcode 459. 重复的子字符串

    2024-04-09 16:38:03       32 阅读
  2. Qt状态机

    2024-04-09 16:38:03       35 阅读
  3. 文心一言 vs. GPT-4: 全面比较

    2024-04-09 16:38:03       38 阅读
  4. gcc/g++:编译阶段翻译成优化的平台汇编代码

    2024-04-09 16:38:03       41 阅读
  5. 背包问题四种类型

    2024-04-09 16:38:03       33 阅读
  6. Vue.js中如何使用Vue Router处理浏览器返回键的功能

    2024-04-09 16:38:03       31 阅读
  7. 设计模式概述

    2024-04-09 16:38:03       34 阅读
  8. 状态机编程的常用框架和方法

    2024-04-09 16:38:03       30 阅读
  9. loopvar 改动不同版本的影响-defer,closures

    2024-04-09 16:38:03       37 阅读
  10. 李沐20_卷积层里的填充和步幅——自学笔记

    2024-04-09 16:38:03       32 阅读
  11. macOS MySQL环境配置

    2024-04-09 16:38:03       37 阅读
  12. C语言-翁恺-PTA-81-120课后练习题-03

    2024-04-09 16:38:03       38 阅读