使用python进行数学建模系列1 读表格 +简单处理+ 画图简单入门 代码可直接运行

为啥要用python呢?             –没人能逃过真香定律

数学建模工具有很多种选择,有功能及其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了.

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.

随缘更新下一张,各位老铁有缘再见

后续可以根据大家的意见修正一下这篇教程的问题,有缘更新下一章啦~

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年4月22日
下一篇 2023年4月22日

相关推荐