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

  • 33
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yueqingll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值