数学建模工具有很多种选择,有功能及其matlab,R语言,SPSS,Lingo等等,他们在不同领域各有擅场,但为什么极力推荐用python呢?
其实很简单,上边每个软件能做的,python都能做,而且做出来效果也不错. python有各种各样的包,可以很容易下载下来,有些包本身说是一个软件也不过分.通过几乎相同的python语法,可以流畅又高效的使用各种包. 也就是说,用明白了一个包,再用其它的包就很轻松了.
判断一个编程语言硬不硬核可以从三个方面看起: 是否容易入门, 是否有很多岗位招聘这个编程语言, 生态怎么样, 是不是有很多金主爸爸在这方面投钱. 很不错的是python这些都占了
与其说python是一门编程语言,不如说他是一种大家对调用程序的默契加上应用市场(硬核免费版).
最令人心动的是,python几乎能做所有事,不仅可以用于数学建模,也可以用来写软件,做网站,甚至是操作单片机. 建模的时候顺手学一下python,可以给以后的退休生活增添很多乐趣.
肢体识别,人脸识别,手势识别(有非常多成熟的API可以调用,效果蛮好),自己做一个远程手势控制刷抖音的应用,多是件美事啊~
网站开发,搭建自己的网站后台
游戏开发
硬件开发
使用python+micropython自己给自己组了一辆车(蓝牙远程遥控+机械臂+摄像头识别)
先挖个坑,后续有空会更新
好了,有这些理由在,数学建模的过程中顺便入门一个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了.
1. 使用pycharm新建一个工程
新建一个jupyter notebook文件,名字随便起
文件新建好了之后会看到这么个提示: jupyter没安装, 接下来,我们将要安装数学建模中常用的一些软件.
新建一个requirements.txt 文件,在requirements.txt 文件里,我们把需要用到的包名称写进去,这样, 后续分享给别人安装这个包就要快很多.
里边的内容如下(复制粘贴保存即可).
jupyter numpy scipy sklearn openpyxl pandas matplotlib seaborn xlrd
这里注意,打开终端之后如果没有这个(venv)
的提示,说明目前用的不是虚拟环境, 换句话说就是没完全按照前边的步骤来, 后边会有可能因为环境不一样出现各种奇奇怪怪的bug.
这里强烈推荐按照我前边推荐的来. 我在刚入门的时候还有入门的过程中踩过非常多的坑.每一个坑都让我花费了很多时间解决,在做这篇教程的时候,专门想了下如何避开这些坑. 我会尽量保证安装我的操作来可以流畅运行并看到预期的演示效果,而不是因为装环境卡住如何后边动不了.当时真的是痛苦极了,多希望有个人能在我旁边帮我一把,而不是卡住一个个搜一个个试.
按照我推荐的来可以帮您节省相当多的时间,并且基本属于比较快且方便的方式
打开终端,输入以下内容即可安装所需要的主流的python的包
pip install -r requirements.txt
虚拟环境中建立requirements文件是很好的习惯,他会让用了那些包更加清晰,后续再次复现这个环境只需pip install -r requirements.txt
一行就能实现, 可用性高.
如果您实在懒得建文件,您也可以一条条复制粘贴这些去安装.(及其不推荐)
pip install jupyter pip install numpy pip install scipy pip install sklearn pip install openpyxl pip install pandas pip install matplotlib pip install seaborn pip install xlrd
从下载到安装好这些包大概花费三分钟时间左右.
想当年,我最初接触数学建模比赛的时候还是校赛.当时是大一,由于学过C语言,对数据处理感觉信心十足.
然而,很难受的是当时只用devc++这类软件编程,平时指针都不明白,更别提读文件,把文件里的内容转为数组来操作了.
我们当时比赛就做了个第一问(也不算完全做出来),然后写了个论文交上,当时还拿了个学校的三等奖,非常的开心.
如果你们也是这样,那我估计你看完我这个前几个教程基本上大一参加建模混个,啊呸,至少能斩获一个三等奖.
当时困扰我最久的就是读文件, 对数据的操作有很多办法,但是读不出来数据就很难受,有种有力无处使的感觉.
所以,入门第一节,先读数据.
俗话说得好,手里有剑才能用剑.这数据在表格里就好像剑在商店里,我们不直接去造一把剑,我们从商店里免费买一把回来.
程序读出来数据就像是剑拿在手里,就方便进行后续的操作,剑不在手里,学剑谱多半对着空气比划,很难受的.
创建演示所需的表格,并简单展示一些功能
这一节的主要目的是为了生成我们后边演示需要的excel表格,由于是第一次接触,您无需理解程序的具体含义,只是复制粘贴后运行即可.
关于波士顿数据集的简介可以看这篇文章,本文中的对表头的翻译取自这篇文章.
(49条消息) Dataset之Boston:Boston波士顿房价数据集的简介、下载、使用方法之详细攻略一个处女座的程序猿的博客-CSDN博客boston数据集
通过以下简短几行代码,我们不仅加载了数据集,而且把它保存成了文本文件和表格,并且简单花了两张图,保存了一张图.
from sklearn import datasets
import pandas as pd
boston=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 matplotlib
from 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 matplotlib
from matplotlib import pyplot as plt
#配置matplotlib使其支持中文显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus']=False
import pandas as pd
# import numpy as np
boston_dataframe=pd.read_excel('boston.xlsx')
columns=boston.columns
x=boston_dataframe.index
print(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.
后续可以根据大家的意见修正一下这篇教程的问题,有缘更新下一章啦~