哈尔滨金融学院--实验指导:利用AI大模型辅助学生完成金融数据分析综合实践作业--基于智谱清言(ChatGLM)平台

senzhang10 / 2024-07-08 / 原文

实验指导:利用AI大模型辅助学生完成金融数据分析综合实践作业--基于智谱清言(ChatGLM)平台

1、实验目的

  • 掌握通过合适的提示词,和智谱清言进行交互的方法
  • 掌握在不同的编程任务场景下,让智谱清言辅助完成任务的方法

2、实验内容

为了让学生掌握如何利用AI大模型来辅助自己编写代码完成综合实践作业的课程表,本实验指导从数据分析任务中会遇到的常见的任务场景来展开,包括的场景如下:

  • (1) 让AI理解你的需求
  • (2) 让AI辅助你理解任务中需要的知识和原理
  • (3) 让AI辅助你理解老师给出的示例代码的作用
  • (4) 让AI辅助你检测代码中的语法错误代码并辅助你修改
  • (5) 让AI辅助你完成缺少代码的辅助补全
  • (6) 让AI辅助你自己判定代码写的对不对

本次作为背景内容的实验案例为《农村地区居民人均可支配收入水平综合评价》综合实践任务,实验给定一个表格(见附件7),表格文件名为: 农村居民人均可支配收入来源2016.xlsx ,表格的数据为2016年我国31个省、自治区和直辖市的农村地区居民的工资性收入、经营净收入、财产净收入、转移净收入,要求学生根据每个省份的这四个指标数据,使用主成分分析技术,对每个省份的居民人均可支配收入水平进行综合评价。开发语言为Python,编程工具为Anaconda。

本次实验的代码可以分为五个部分,分别为:

  • (1) 使用Pandas库读入Excel表格数据
  • (2) 对数据进行标准化
  • (3) 对数据进行主成分分析,对原始数据的四个特征按照0.95的贡献率进行降维
  • (4) 获取每个新维度的贡献率,并获取每个省份的总得分
  • (5) 根据每个省份的总得分进行降序排序

本次实验给出的指导代码并不完整,有的部分需要学生补全,有的部分需要学生完整编写。注意代码中的xxxxxxxx、xxxx1、yyyy1这些符号是需要补全的代码。代码的最后一部分是学生需要全部写出的。

指导代码如下:

# -*- coding: utf-8 -*-
# 第一部分:使用Pandas库读入Excel表格数据
import pandas as pd
Data=pd.read_excel('农村居民人均可支配收入来源2016.xlsx')
X=Data.iloc[:,1:]
R=X.corr()

# 第二部分:对数据进行标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X) 
X=scaler.transform(X)  

# 第三部分:对数据进行主成分分析,对原始数据的四个特征
# 按照0.95的贡献率进行降维
from sklearn.decomposition import PCA
pca=PCA(n_components=0.95) 
pca.fit(X)
Y=pca.transform(X)

# 第四部分: 
# 获取每个主成分的贡献率
# xxxxxxxx需要补全         
gxl=pca.xxxxxxxx 
# 综合得分=各个主成分*贡献率之和
# xxxx1、xxxx2、xxxx3和yyyy1、yyyy2、yyyy3需要补全
F=gxl[xxxx1]*Y[yyyy1]+gxl[xxxx2]*Y[yyyy1]+gxl[xxxx3]*Y[yyyy3] 

# 第五部分:对31个省市的综合得分进行排序输出
# 学生需自行完成

3、实验步骤

3.1 注册智谱清言

智谱清言为基于智谱 AI 公司于2023年训练的语言模型开发的AI大模型平台,它可以通过对对话的形式,针对用户的问题和要求提供适当的答复和支持。下面的内容中,使用单词ChatGLM来代表智谱清言的角色,使用单词Student来代表学生的角色。首先大家需要在官网上注册智谱清言。步骤如下:

    1. 访问 https://chatglm.cn/
    1. 使用手机号注册
    1. 现在就可以开始使用智谱清言了

恭喜你,完成了和AI大模型交互的第一步。接下来的实验会根据学生在完成《农村地区农村居民人均可支配收入水平综合评价》中会遇到的各种需要AI工具辅助助学的场景来展开的,建议同学按顺序进行完成。

3.2 场景一:让AI理解老师布置的任务

    1. 同智谱清言进行交互的基本工具——提示词

在AI大模型的场景中,用户和大模型最常见的交互模式就是用户给与大模型的提示词(Prompt)或者叫做指令词(可以简单理解为用户的输入),大模型根据提示词做出相应的回复。但AI大模型在处理不同的提示词时,大模型给出的输出结果是不同的。

根据目前的研究结果,在处理一个任务的时候,将提示词按照如下的模式来设计,通常会得到比较好的结果。

一条优秀的提示词=根据[参考消息]+完成[动作]+达成[目标]+满足[要求]

    1. 为智谱清言设定任务的背景,请在对话框内输入下面的文字

Student: 我是一名大三的学生,正在上《金融数据分析综合实践》的课程,老师布置了一个作业,要求我们使用Python语言,加Anaconda开发工具进行完成。请根据我下面的指令,辅助我完成这个作业。

ChatGLM: 当然可以,我很乐意帮助你完成作业。请告诉我具体的作业要求,以及你需要帮助的部分。

[ChatGLM回答完毕]

教师解读:恭喜你,完成了和AI大模型的第一次“亲密接触”。在上面的Student的输入中:

  • 我是一名大三的学生,正在上《金融数据分析综合实践》的课程可以看做是根据参考
  • 辅助我完成这个作业可以看做是达成目标
  • 要求我们使用Python语言,加Anaconda开发工具进行完成可以看做是满足要求

教师提示:请注意,ChatGLM在回复时,每次结果不一定一样

    1. 为智谱清言提供本次作业的内容,请在对话框内输入下面的文字

Student: 本次作业的题目为《农村地区居民人均可支配收入水平综合评价》,老师给了我们一个表格,表格数据为2016年我国31个省、自治区和直辖市的农村地区居民的工资性收入、经营净收入、财产净收入、转移净收入,要求我们根据每个省份的这四个指标数据,对每个省份的居民人均可支配收入水平进行综合评价,方法为主成分分析,老师给了部分代码,请结合以上内容,辅助我继续完成这个作业。

ChatGLM: 好的,首先我们需要导入所需的库,并加载数据。接下来,我们将使用主成分分析(PCA)对数据进行降维,以便对每个省份的居民人均可支配收入水平进行综合评价。

......

[ChatGLM回答完毕]

教师提示:这里的......代表省略的内容。此步骤ChatGLM还有很多内容的输出,同学们可以暂时不用管。下同

3.3 场景二:学习任务中用到的原理

看到上面ChatGLM的输出,同学们会想到在课堂上老师讲过了使用利用主成分分析进行特征降维,然后根据每个维度对若干个对象进行排序,从而完成综合评价的理论内容,但有一些知识点遗忘或不完全理解。因此,可以继续对智谱清言发问,来理清具体的知识点和原理。继续输入下面的文字。

Student: 我对主成分分析的原理不太理解,请简要帮我再介绍一下。
ChatGLM: 当然可以。主成分分析(Principal Component Analysis,PCA)是一种常用的数据降维方法,它通过线性变换将原始数据变换为一组各维度线性无关的表示,通常用于提取数据的主要特征分量。

在PCA中,我们希望找到一组新的坐标轴(即主成分),使得数据在这些坐标轴上的方差最大。这样,第一主成分解释了数据中的最大方差,第二主成分解释了数据中的次大方差,以此类推。这些主成分能够捕捉到数据的最重要信息,并且彼此之间是不相关的。

以下是PCA的基本步骤:

......

在你的作业中,PCA可以帮助你从四个收入指标中提取最重要的信息,并对每个省份的居民人均可支配收入水平进行综合评价。通过计算每个省份在前几个主成分上的得分,你可以得到一个综合得分,用来对省份进行排序和比较。

[ChatGLM回答完毕]

教师提示:如果上面的解释你仍不能理解,你可以继续构造合适的提示词,继续问ChatGLM

场景三:3.4 示例代码讲解

假定根据以上的对话,你已经初步懂得了主成分分析的数学原理,并明白如何利用主成分分析对农村居民人均可支配收入水平进行排序的基本过程。(如果你存在自己的具体问题,那请根据上面的参考步骤,结合你自己的问题,去和ChatGLM进行交互)

现在,你开始阅读实验指导中老师发布的第一部分代码,代码如下,

# 导入数据
import pandas as pd
Data=pd.read_excel('农村居民人均可支配收入来源2016.xlsx')
X=Data.iloc[:,1:]
R=X.corr()

但是最后一行代码你不懂,因此你可以使用下面的文字,继续向ChatGLM提问。

Student: 针对此次作业,老师给了一部分参考代码,代码如下。

# 导入数据
import pandas as pd
Data=pd.read_excel('农村居民人均可支配收入来源2016.xlsx')
X=Data.iloc[:,1:]
R=X.corr()

但是这段代码的最后一行 R=X.corr()我不明白,请结合本次作业,帮我解释一下。

ChatGLM: ......

在你这次作业的背景下,X 包含了四个收入指标(工资性收入、经营净收入、财产净收入、转移净收入),这些指标可能存在一定的相关性。例如,一个地区的工资性收入高,可能其他收入也会相对较高。通过计算相关系数,我们可以了解到这四个指标之间的相互关系,这有助于我们理解数据的特点,并在进行主成分分析之前有一个初步的认识。

相关系数矩阵R是一个方阵,其中行和列分别代表不同的收入指标。对角线上的元素都是1,因为一个变量与其自身的相关系数是1。非对角线上的元素表示不同变量之间的相关系数。

在你后续的主成分分析中,如果发现某些指标之间的高度相关性,PCA可以帮助识别这些指标背后的共同因素,并通过主成分来表示这些因素,从而实现降维和特征提取。

[ChatGLM回答完毕]

场景四:3.5 语法错误代码的智能检测和辅助修改

在完成了上面的代码的基础上,接下来我们要进行数据的标准化。你继续按照指导手册上输入代码,代码如下:

# 数据规范化处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X) 
X=scaler.transform(X)  

不出意外的,你在写代码的时候不小心敲错了一些单词,你的输入如下:

# 数据规范化处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScalar()
scaler.fit(X) 
X=scaler.transform(X) 

导致你的代码在运行的时候出现了语法错误。虽然经过你仔细查看,但你还是没有发现错误在哪里,我们使用下面的文字,把这段代码整体提交给ChatGLM,让ChatGLM帮助我们发现错误在那里,并帮助你改正。

Student: 现在,我的数据保存在变量X中,需要对数据进行标准化。我使用了下面这段代码,

# 数据规范化处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScalar()
scaler.fit(X) 
X=scaler.transform(X) 

但是代码运行不成功,请帮我检查代码在哪里出了问题,并帮助我修改正确。

ChatGLM:在您提供的代码中,有一个小错误:StandardScaler 的首字母应该是小写的 ‘s’,而不是大写的 ‘S’。正确的类名是 StandardScaler,而不是 StandardScalar。

以下是修改后的代码:

# 数据规范化处理
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()  # 修改这里:将 'Scalar' 改为 'Scaler'
scaler.fit(X) 
X = scaler.transform(X) 

......

[ChatGLM回答完毕]

教师提示:此处ChatGLM的回复基本上是正确的。它帮助我们发现了代码中的错误,正确的类名是 StandardScaler,而不是 StandardScalar,并在下面的修改代码中,正确地进行了修改。但是它的第一句输出,在您提供的代码中,有一个小错误:StandardScaler 的首字母应该是小写的 ‘s’,而不是大写的 ‘S’。 则是错误的,请同学注意,大模型的回复并不一定就是正确,请大家不要绝对的盲目相信。

场景五:3.6 缺少代码的辅助补全

完成数据标准化后,下面需要进行主成分分析,但是老师只给出了部分代码和它的注释,需要你根据注释,补全这些代码,你可以利用下面的文字让ChatGLM继续辅助你完成这个任务。

Student: 现在X已经是标准化之后的数据了,接下来使用主成分分析对X进行降维,老师给出的代码如下:

#主成分分析
from sklearn.decomposition import PCA
pca=PCA(n_components=0.95) 
pca.fit(X)
Y=pca.transform(X)

请先帮我解释上面每一行代码的作用。

ChatGLM:当然,让我们逐一解释上面代码的作用:

  1. from sklearn.decomposition import PCA
    这行代码从 sklearn 库的 decomposition 模块中导入 PCA 类。PCA 类是用于主成分分析的一个工具。
  2. pca = PCA(n_components=0.95)
    这行代码创建了一个 PCA 对象的实例,并设置了 n_components=0.95 参数。这个参数的含义是保留数据中 95% 的方差。这意味着 PCA 会自动选择足够多的主成分,以便这些主成分能够解释原始数据中 95% 的方差。如果你想要固定主成分的数量,可以将这个参数设置为一个整数(例如 n_components=2)。

......

[ChatGLM回答完毕]

Student: 剩余的代码,老师给了部分代码,代码并不完整,但给了注释,请结合代码和注释帮我补全。
注释为: 获取每个主成分的贡献率,保存在变量gxl中
代码为gxl=pca.xxxxxxxx,xxxxxxxx为需要我自己补全的部分,应该写什么呢?

ChatGLM:
根据注释,你需要获取每个主成分的贡献率并保存在变量 gxl 中。在 sklearnPCA 对象中,每个主成分的贡献率可以通过属性 explained_variance_ratio_ 来获取。这个属性返回一个数组,其中每个元素表示对应主成分解释的方差占总方差的比例。
因此,你可以将代码补全为:

gxl = pca.explained_variance_ratio_

这样,gxl 变量就会存储每个主成分的贡献率。

......

[ChatGLM回答完毕]

教师提示:如果你的ChatGLM给出的回复也是xxxxxxxx应该为explained_variance_ratio_,那么恭喜你,你的AI非常智能,它答对了)。请继续利用ChatGLM帮助你完成作业。

Student: 上面的答案我理解了,下面请接续辅助我完成代码。
注释为: 利用上面代码中的gxl变量,结合降维之后的变量Y,完成综合排序得分的计算,代码为

F=gxl[xxxx1]*Y[yyyy1]+gxl[xxxx2]*Y[yyyy1]+gxl[xxxx3]*Y[yyyy3]

,里面的xxxx1、xxxx2、xxxx3和yyyy1、yyyy2、yyyy3是需要补全的部分,应该写什么呢?

ChatGLM:
根据注释,你需要使用 gxl 变量(主成分贡献率)和降维后的数据 Y 来计算每个省份的综合排序得分。在这个上下文中,F 应该是一个新的数组,其中每个元素是每个省份的综合得分,计算方式是将每个主成分的得分乘以其对应的贡献率,然后将这些乘积相加。
假设你想要使用前三个主成分来计算综合得分,你可以这样补全代码:

F = gxl[0] * Y[:, 0] + gxl[1] * Y[:, 1] + gxl[2] * Y[:, 2]

这里的 gxl[0]gxl[1]gxl[2] 分别是前三个主成分的贡献率,而 Y[:, 0]Y[:, 1]Y[:, 2] 分别是降维后的数据 Y 中对应于这三个主成分的得分。Y[:, 0] 表示所有样本在第一个主成分上的得分,Y[:, 1] 表示所有样本在第二个主成分上的得分,以此类推。
这样,F 数组中的每个元素就是对应省份的综合排序得分。你可以根据这个得分对省份进行排序,以完成综合评价。

......

[ChatGLM回答完毕]

教师提示;如果你的ChatGLM也回复了类似的代码,再次恭喜你,你的AI继续保持了超高的智能水准

场景六:3.7 辅助自己判定代码写的对不对

恭喜你通过了前面的步骤,现在你觉得自己可以完全动手把代码的最后一部分:根据变量F中的值,对31个省市地区的农村居民人均收入水平进行排序,代码写好了,运行结果看起来似乎也不错,但你想再求证一下,你也可以让ChatGLM来帮助你检查一下。

Student:现在我需要利用F和Data对31个省市地区的农村居民人均收入水平进行排序,我写了下面的一段代码,请帮我检查是否能够完成该功能,如果能,请确认;如果不能,请帮助改正。代码如下:

#排序输出
dq=list(Data['地区'].values)  #提取地区
Rs=pd.Series(F,index=dq)           #以地区作为index,综合得分为值,构建序列
Rs=Rs.sort_values(ascending=False) #按综合得分降序进行排序

ChatGLM:你的代码基本上是正确的,但是有一个小问题。在你提取地区信息并创建 Rs 序列时,你需要确保 F 中的综合得分与 Data 中的地区信息是一一对应的。如果你的 F 是一个一维数组,那么你的代码应该是正确的。

......

[ChatGLM回答完毕]

4. 实验总结

  • (1) 请回答:在实验中你收获哪些AI技巧?
  • (2) 请回答:在实验中你解决了哪些问题?
  • (3) 请回答:在实验中你还存在哪些问题没有解决?

5.附件1:表格数据

地区 工资性收入 经营净收入 财产净收入 转移净收入
北京 16637.5 2061.9 1350.1 2260
天津 12048.1 5309.4 893.7 1824.4
河北 6263.2 3970 257.5 1428.6
山西 5204.4 2729.9 149 1999.1
内蒙古 2448.9 6215.7 452.6 2491.7
辽宁 5071.2 5635.5 257.6 1916.4
吉林 2363.1 7558.9 231.8 1969.1
黑龙江 2430.5 6425.9 572.7 2402.6
上海 18947.9 1387.9 859.6 4325
江苏 8731.7 5283.1 606 2984.8
浙江 14204.3 5621.9 661.8 2378.1
安徽 4291.4 4596.1 186.7 2646.2
福建 6785.2 5821.5 255.7 2136.9
江西 4954.7 4692.3 204.4 2286.4
山东 5569.1 6266.6 358.7 1759.7
河南 4228 4643.2 168 2657.6
湖北 4023 5534 158.6 3009.3
湖南 4946.2 4138.6 143.1 2702.5
广东 7255.3 3883.6 365.8 3007.5
广西 2848.1 4759.2 149.2 2603
海南 4764.9 5315.7 139.1 1623.1
重庆 3965.6 4150.1 295.8 3137.3
四川 3737.6 4525.2 268.5 2671.8
贵州 3211 3115.8 67.1 1696.3
云南 2553.9 5043.7 152.2 1270.1
西藏 2204.9 5237.9 148.7 1502.3
陕西 3916 3057.9 159 2263.6
甘肃 2125 3261.4 128.4 1942
青海 2464.3 3197 325.2 2677.8
宁夏 3906.1 3937.5 291.8 1716.3
新疆 2527.1 5642 222.8 1791.3

6.附件2: 完整代码答案

# 第一部分:使用Pandas库读入Excel表格数据
import pandas as pd
Data=pd.read_excel('农村居民人均可支配收入来源2016.xlsx')
X=Data.iloc[:,1:]
R=X.corr()

# 第二部分:对数据进行标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X) 
X=scaler.transform(X)  

# 第三部分:对数据进行主成分分析,对原始数据的四个特征
# 按照0.95的贡献率进行降维
from sklearn.decomposition import PCA
pca=PCA(n_components=0.95) 
pca.fit(X)
Y=pca.transform(X)  

# 第四部分: 
# 获取每个主成分的贡献率       
gxl=pca.explained_variance_ratio_ 
# 综合得分=各个主成分*贡献率之和
F=gxl[0]*Y[:,0]+gxl[1]*Y[:,1]+gxl[2]*Y[:,2] #综合得分=各个主成分*贡献率之和

# 第五部分:对31个省市的综合得分进行排序输出
dq=list(Data['地区'].values)  #提取地区
Rs=pd.Series(F,index=dq)           #以地区作为index,综合得分为值,构建序列
Rs=Rs.sort_values(ascending=False) #按综合得分降序进行排序

7.附件3 本课程知识体系中可使用的提示词样例

知识领域 提示词样例
数据清洗 请告诉我如何使用Python对金融数据进行清洗和预处理。
特征工程 我需要确定哪些金融特征对于预测目标最有价值。
模型选择 你能推荐一些适合时间序列预测的机器学习模型吗?
算法解释 请解释一下什么是随机森林算法。
编程帮助 我遇到了一个编程错误,你能帮我调试我的Python代码吗?
案例分析 有没有实际的金融数据分析案例,我可以学习如何应用理论到实践中?
市场动态 你能提供最新的金融市场动态和相关数据吗?
投资策略 我想讨论一些基于数据的投资策略,你能给我一些指导吗?
风险管理 请解释一下如何在金融数据分析中应用风险模型。
伦理合规 在处理金融数据时,有哪些伦理和合规方面的问题需要考虑?
技术趋势 目前金融科技领域有哪些新兴的技术趋势?
学习资源 你能推荐一些金融数据分析的综合实践学习资源吗?
练习问题 我想要一些练习题来测试我对金融数据分析的理解。
项目建议 我需要为课程项目提出一个想法,你能给我一些建议吗?