数学建模工具有很多种选择,有功能及其matlab,R语言,SPSS,Lingo等等,他们在不同领域各有擅场,但为什么极力推荐用python呢?
其实很简单,上边每个软件能做的,python都能做,而且做出来效果也不错. python有各种各样的包,可以很容易下载下来,有些包本身说是一个软件也不过分.通过几乎相同的python语法,可以流畅又高效的使用各种包. 也就是说,用明白了一个包,再用其它的包就很轻松了.
判断一个编程语言硬不硬核可以从三个方面看起: 是否容易入门, 是否有很多岗位招聘这个编程语言, 生态怎么样, 是不是有很多金主爸爸在这方面投钱. 很不错的是python这些都占了
与其说python是一门编程语言,不如说他是一种大家对调用程序的默契加上应用市场(硬核免费版).
最令人心动的是,python几乎能做所有事,不仅可以用于数学建模,也可以用来写软件,做网站,甚至是操作单片机. 建模的时候顺手学一下python,可以给以后的退休生活增添很多乐趣.
-
肢体识别,人脸识别,手势识别(有非常多成熟的API可以调用,效果蛮好),自己做一个远程手势控制刷抖音的应用,多是件美事啊~
-
网站开发,搭建自己的网站后台
-
游戏开发
-
硬件开发
使用python+micropython自己给自己组了一辆车(蓝牙远程遥控+机械臂+摄像头识别)
先挖个坑,后续有空会更新
好了,有这些理由在,数学建模的过程中顺便入门一个python,绝对是值了
入门: python怎么用与读写数据
关于使用python的心态(可直接跳过)
python这门语言,一直以接近自然语言易于使用著称. 使用python,有点像是使用电脑或者是电脑软件,比如说使用word,一般用的时候可以自己摸索,遇到不会的再上网查询,相比各位老铁学习word的时候应该不会先买一本word使用大全开始从头来看吧.
使用python,关键在用,不会用就查,基本上用个不到一年半载,就大概悟了.
当然,对于对编程完全是零基础的老铁来说,使用python或许并不是那么容易,这个时候遇到问题如果直接看教程,教程好的话,大概能明白教程里的东西,并且会做差不多的类推. 如果上过一些程序设计课程的老铁,大概明白整个程序的流程,看过一些教程会融汇贯通,自己总结出更适合自己的用法.
我个人推荐是先学一点程序设计基础,然后不断的去用,用起来了后边才更好明白原理之类的.
就数学建模而言,队伍里大概至少有一个人要会编程,一般是分为建模,写作,编程,然后各司其职.
对于编程的同学,大概分为两个部分,一个是画图,一个是把模型代码化,求解模型,输出评估的参数,画图展示等等.
使用python有个好处,只要建模的同学用的模型是学来的(不是自己造的),基本上就都能找到相应的包来求解模型的各个部分. 一般情况下,使用现有的包,尽可能多传一些参数进去,是能解决目前的问题的.
数学建模,重点在于找到合适的模型,修改使其适合的求解. 重点在于数学, 而不是自己手写算法求解. 数学建模一共三天,自己很难手写出模型的求解,而且很多库底层是C写的,调用起来相当快,自己拿python写一遍,速度慢不说,还容易出错要调试.
环境准备
-
python3.9+
都2022年了,python版本最新的到3.10,很老很老的python真的没必要坚持用了
-
pycharm专业版
python和它大部分的包都免费,但是编辑器有收费的也有免费的,pycharm专业版就是收费的,但它对学生老师免费(需要去官网用学信网或者是学校给的个人邮箱认证).
对于第一次用的人,有三十天的免费体验,过期后收费.
其实随便一个带python代码提示功能的编辑器都行,用pycharm主要是因为它里边的jupyter note book有代码提示,创建虚拟环境方便,安装包也很方便,还是很舒服的.一个很小的bug可能会让一个新手卡一天(比如说我),所以,我极力推荐用一个功能强大稳定的运行环境.
-
把python所在的目录加入到环境变量里
如果已经有了pycharm专业版的环境,可以暂时忽略这条
下载好pycharm专业版第一次进去后会提示是否要把pycharm本地化,点击switch and localized 后等待重启即可. 重启后看到的pycharm就是经过汉化的pycharm了.
使用pycharm新建一个工程
新建一个jupyter notebook文件,名字随便起
文件新建好了之后会看到这么个提示: jupyter没安装, 接下来,我们将要安装数学建模中常用的一些软件.
新建一个requirements.txt 文件,在requirements.txt 文件里,我们把需要用到的包名称写进去,这样, 后续分享给别人安装这个包就要快很多.
里边的内容如下(复制粘贴保存即可).
jupyternumpyscipysklearnopenpyxlpandasmatplotlibseabornxlrd
这里注意,打开终端之后如果没有这个(venv)
的提示,说明目前用的不是虚拟环境, 换句话说就是没完全按照前边的步骤来, 后边会有可能因为环境不一样出现各种奇奇怪怪的bug.
这里强烈推荐按照我前边推荐的来. 我在刚入门的时候还有入门的过程中踩过非常多的坑.每一个坑都让我花费了很多时间解决,在做这篇教程的时候,专门想了下如何避开这些坑. 我会尽量保证安装我的操作来可以流畅运行并看到预期的演示效果,而不是因为装环境卡住如何后边动不了.当时真的是痛苦极了,多希望有个人能在我旁边帮我一把,而不是卡住一个个搜一个个试.
按照我推荐的来可以帮您节省相当多的时间,并且基本属于比较快且方便的方式
打开终端,输入以下内容即可安装所需要的主流的python的包
pip install -r requirements.txt
虚拟环境中建立requirements文件是很好的习惯,他会让用了那些包更加清晰,后续再次复现这个环境只需pip install -r requirements.txt
一行就能实现, 可用性高.
如果您实在懒得建文件,您也可以一条条复制粘贴这些去安装.(及其不推荐)
pip install jupyterpip install numpypip install scipypip install sklearnpip install openpyxlpip install pandaspip install matplotlibpip install seabornpip install xlrd
从下载到安装好这些包大概花费三分钟时间左右.
入门第一节:读写数据并简单画图
想当年,我最初接触数学建模比赛的时候还是校赛.当时是大一,由于学过C语言,对数据处理感觉信心十足.
然而,很难受的是当时只用devc++这类软件编程,平时指针都不明白,更别提读文件,把文件里的内容转为数组来操作了.
我们当时比赛就做了个第一问(也不算完全做出来),然后写了个论文交上,当时还拿了个学校的三等奖,非常的开心.
如果你们也是这样,那我估计你看完我这个前几个教程基本上大一参加建模混个,啊呸,至少能斩获一个三等奖.
当时困扰我最久的就是读文件, 对数据的操作有很多办法,但是读不出来数据就很难受,有种有力无处使的感觉.
所以,入门第一节,先读数据.
俗话说得好,手里有剑才能用剑.这数据在表格里就好像剑在商店里,我们不直接去造一把剑,我们从商店里免费买一把回来.
程序读出来数据就像是剑拿在手里,就方便进行后续的操作,剑不在手里,学剑谱多半对着空气比划,很难受的.
创建演示所需的表格,并简单展示一些功能
这一节的主要目的是为了生成我们后边演示需要的excel表格,由于是第一次接触,您无需理解程序的具体含义,只是复制粘贴后运行即可.
关于波士顿数据集的简介可以看这篇文章,本文中的对表头的翻译取自这篇文章.
(49条消息) Dataset之Boston:Boston波士顿房价数据集的简介、下载、使用方法之详细攻略一个处女座的程序猿的博客-CSDN博客boston数据集
通过以下简短几行代码,我们不仅加载了数据集,而且把它保存成了文本文件和表格,并且简单花了两张图,保存了一张图.
from sklearn import datasetsimport pandas as pdboston=datasets.load_boston()#读到的数据集保存到文件里,您可以在文件中查看数据集一开始的样子,您也可以从后边输出的表格中看到数据集的样子with open('boston.txt','w',encoding='utf-8') as f: f.write(boston.__str__()) f.close()#为了方便看懂,表头替换为翻译好的中文header=["城镇人均犯罪率","住宅用地所占比例","城镇中非商业用地占比例","查尔斯河虚拟变量,用于回归分析","环保指标","每栋住宅房间数","1940年以前建造的自住单位比例 ","与波士顿的五个就业中心加权距离","距离高速公路的便利指数","每一万美元的不动产税率","城镇中教师学生比例","城镇中黑人比例","房东属于低等收入阶层比例",# "自住房屋房价中位数",]#将波士顿数据集转化成易于操作的pandas.DataFrame类型boston=pd.DataFrame(data=boston.data, columns=boston.feature_names)#为了直观的看一下效果,将列的索引(表头)换成中文的boston.columns=header'''虽然很多编辑器带代码提示,但是输入在中英文直接频繁切换也不太舒服,而且有时候中文太长了,这里可以用列表来代替'''print(f"列表中的第 0 个元素是: '{header[0]}'")boston[header[0]]boston.to_excel('boston.xlsx',index=False)import matplotlibfrom matplotlib import pyplot as plt#配置matplotlib使其支持中文显示matplotlib.rcParams['font.sans-serif'] = ['SimHei']matplotlib.rcParams['axes.unicode_minus']=False#把第一列单独拿出来画个图h0=pd.DataFrame(boston[header[0]])h0.plot()#保存图片到当前目录下plt.savefig('./犯罪率.png')#展示图片plt.show()boston.plot()plt.show()''''''
运行上述的代码之后,我们得到了一个表格的数据,还顺手画了两个图并且保存了一个图.
画图的代码也是非常简单,只有下边的几行,您就可以简单的绘图和保存图片了.
怎么样,比起找个漫长的课程第一次先打印helloworld, 这第一次给的体验是不是爽的飞起~
如果您只是想看看python适不适合做数学建模,想必到了这里您应该已经有了自己的答案.
从表格中读取数据
我们对数据的操作用到一个非常舒服的库:pandas
在使用之前,我们需要对pandas的数据类型有个大致了了解,以方便后续对数据进行操作.
换句话说,这里有一套绝世剑法,只有三招就有程咬金三板斧的威力,会了这三招,可以融会贯通演变出更多招式.
所以说我们先快速看一下会哪些基本操作和概念之后才能融会贯通.
基本概念(有基础的老铁可以自行跳过)
-
jupyter notebook
不同于py脚本, 一般python脚本是一下顺序执行完了,然后就没了.
这个时候,比如说我有一个变量,我想看看它,结果执行完了,程序结束了,我需要加一个打印这个对象的代码,或者是点开调试去看,很不方便.
如果这是一个很耗时的操作,执行一次需要30分钟,而我一开始不能保证我能一下子执行出我想要的效果. 这时,如果有个什么东西,可以把我执行过的变量啥的,都保存起来,我每次不需要在重新执行,只需要输入变量就能查看了就好了.
jupyter就是干这个的,所有执行过的代码块的变量,都会保存起来,后边可以不再次执行,而是直接查看变量,同时,它还支持插入markdown模块,支持查看函数帮助等等,在数据科学领域,jupyter可以看作是python plus .
当然,受限于作者的水平,描述可能不太准确详细,感兴趣的老铁可以自行搜索.
-
面向对象
关于面向对象有很多教程,去看那些可能会花费很多时间,但使用起来大致体现为这样:
举个简易的例子:
你有一个grilfried,你可以把她看成一个对象,她有身高,体重,三围等等,这些你可以把他们看成对象的属性.
grilfriend会吃饭,会打游戏,会撒娇,这些可以看作是对象的方法,或者是函数.
同理,这里有一个'String'对象,我们叫他a,给他赋值为"666",(String是字符串的意思),它有一个'___len__()'方法,我们使用 a.__len__()方法,得到它的长度是3.
对象.属性对象.函数()
使用起来主要是
.
这个操作主要是用来调用各种包,一般包里边会预先封装一些方法,我们调用的时候可以直接拿来使用.这一点对于使用英文多的人很舒服,因为函数名称都是英文的,一般一看就知道是干啥的.
-
列表
-
函数(方法)
-
参数
说实话,这些基础的东西至少是需要一些程序设计基础的,受限于作者水平,很难用很短的时间讲明白,于是我假设大家正在或者至少上过一些程序设计基础的课程.
pandas的数据类型
什么是数据类型
我们可以通过type
函数来查看对象的数据类型.
一整个表的数据就是一个dataframe
类型(至少有一列),单独一列的是一个Series
类型.
这些数据类型和C语言中的数组有一定的相似,但是在python中,他们都是一些经过层层封装的对象. 换言之,使用他们会比使用java或者C语言或者是matlab语言中的对象或者数组要简单的多. 这就像是造车和开车还有玩赛车游戏, C语言在造车的层面, java上可造车下可开车, 而python一般在玩赛车游戏的层面, 但是实际上赛车游戏中的操作,经过映射最后还是反映到实际的车上去. 在玩赛车游戏的时候,我们不需要纠结太多,只需要看着说明让车动起来就好了. 所有的操作以游戏厂商提供的为准. 使用pandas的dataframe对象就是这个道理, 我们不需要过多纠结底层是怎么实现的, 基本上常用的功能pandas官方都进行了封装, 绝大部分的操作只要搜索一下就能找到对应的用法,非常方便上手.
Series是序列的意思,大致可以理解为索引更加方便的一维数组(列表).
DataFrame的索引方式
对于一个DataFrame
对象,就是如果调用pandas读表格的函数,得到的结果,就是一个DataFrame
对象.
既然是从一个表格里得出来的,就会有行索引和列索引.
在表格中比如excel,可以通过行号和列号来定位到一个元素;
该元素在表格中的位置正是A17;
也可也通过选定一个列来定位到一整列元素:
DataFrame也具有这种思想,它提供一个行索引和列索引
通过列索引可以获得一整个列的数据,通过行索引和列索引可以定位到具体一个的数据.
怎么用,这个和在excel中选择一整列数据是不是很相似.
我们使用行列所以获得单独的数据
得到想得到的数据
通过以下调用方法就可以得到上边说的DataFrame
对象,
boston=pd.read_excel('boston.xlsx',header=0,sheet_name='Sheet1')
调用这个函数,第一个一般放文件的位置,如果是在同一级目录下,可以只写文件名
指定表头为第0行,指定表格为Sheet1(一般只有这一张表可以不指定,但我猜如果您正在看这里说不定此时您的表格恰好有很多张表,为了节省您再次搜索阅读的时间,这里多加一句)
拿到数据后我们可以看一下数据量的大小,这里发现是506行*13列大小
boston=boston.dropna()
可以使用上述方法删除空值.这里有一点要注意,删除空值后,行的索引一般不会跟着变,比如说行号原来为30的行,第29行删除了,我们默认为行号为30开始的行都会向前平移一位,其实不是这样的,如果您希望行的索引也随之变化,您需要手动修改它.
这里因为数据集是经过筛选校对的数据集,里边一般不会有空值.
还可以指定条件删除行,方法也很简单,这里删除了所有城镇人均犯罪率大于0.2的行,看到,删除完了之后确实少了很多行.
boston=boston.drop(index=boston[boston['城镇人均犯罪率']>0.2].index)boston.shape
下边三个例子分别为删除空值,删除行,删除列的方式.
我是怎么知道这些的呢? 其实很简单,按住ctrl,点击函数名称,就能查看源码了,在源码中有一部分的示例和介绍. 一般把介绍翻译一下,看看示例就差不多.也可也去官网查看详细的介绍.也可也直接上网搜,也很快.这里搜索推荐用国内版的必应或者谷歌,用duckduckgo搜索也不错.某度某狗适合搜一些明星绯闻,搜技术问题基本上是不太妙.
画图初探(画些很简单的图)
接上回,画图其实最最简单的方法就是使用DataFrame
对象自带的画图,它会把整个DataFrame
画出来.
也可也单独提取出一列来,像这样:
cr=pd.DataFrame(boston['城镇人均犯罪率'])cr.plot()
jupyter的骚操作
jupyter可以直接在框框内输入变量,然后打印出来
当一个函数忘了咋用,或者是不知道是啥,可以输入函数名然后后边跟两个问号,这里一般会返回一个帮助文档(这个功能直接运行.py
脚本是不太好操作的)
有一点难受的是翻译出来的是英文, 英语不是很6的老铁可以下载一个DEEPL, 按两下Ctrl+c+c翻译, 这个翻译亲测靠谱,目前还是免费免登录,就是国内网速可能比较慢.
画图必备的两个包
matplotlib
matplotlib官方提供一些快速开始的教程,原理上很简单, 就是给一个x,y坐标,就能画一张图
Getting started — Matplotlib 3.5.3 documentation
seaborn
seaborn基于matplotlib做了更加上层的封装,通常它提供一些非常漂亮的主题,使用它可以少些很多代码画出看起来很漂亮的图, 作为我这样的懒人,我简直是爱死seaborn了.
seaborn基本上完全兼容matplotlib的语法. 一般入门学matplotlib,画图用seaborn,然后可以用matplotlib的接口对画出来的图进行修改.
User guide and tutorial — seaborn 0.11.2 documentation (pydata.org)
第一张图
OK,废话不多说,我们通过之前加载的波士顿数据集感受一下:
再次之前,请确保您已经运行过第一段代码,因为它会在同级目录下生产一个表格文件,用来作为我们读表格和画图的数据来源. 基于这个代码片段,您可以稍作修改画出自己想要的同类型的图.
第一段是引入需要的包, 在引入matplotlib时候要配置一下字体,要不然中文放不出来.
第二段是读表格,提取出第1列和默认的索引来画图,
最后一段是画图,然后简单保存了一下.
import matplotlibfrom matplotlib import pyplot as plt#配置matplotlib使其支持中文显示matplotlib.rcParams['font.sans-serif'] = ['SimHei']matplotlib.rcParams['axes.unicode_minus']=Falseimport pandas as pd# import numpy as npboston_dataframe=pd.read_excel('boston.xlsx')columns=boston.columnsx=boston_dataframe.indexprint(f'索引默认是0到最后一行的长度,这里是 : {x}')print(f'这里取第一列画一个图,这里是 : {x}')y=boston_dataframe[columns[0]]plt.plot(x,y)plt.legend((columns[0],))plt.ylabel(columns[0])plt.savefig('第一张图.png')plt.show()
没错,就这么简单就完成了读数据画图,多用两次之后会发现其实这个比用软件用鼠标点画图要快的.
当然,同类型的图也可也一个循环搞完,如果您有这方面的需要的话
for i in range(len(columns)): plt.plot(x,boston_dataframe[columns[i]]) plt.legend((columns[i],)) plt.ylabel(columns[i]) # plt.savefig('第一张图.png') plt.show()
这5行代码实际上画了13张图,篇幅原因,这就不放在这里了(懒得复制)
到这里我们直观的感受了一下画图,并亲手体验了画图的基本操作,相比各位老铁对画图也有了一定的了解. 这个时候,再想要画出更好的图或者是其它类型的图,相比稍作搜索就能找得到了.
这里再次推荐一下搜索引擎的使用: 如果不是看病或者搜明星绯闻啥的, 咱技术问题一般用必应,或者Google.
随缘更新下一张,各位老铁有缘再见
后续可以根据大家的意见修正一下这篇教程的问题,有缘更新下一章啦~
来源地址:https://blog.csdn.net/m0_62579137/article/details/126487961