下载软件的网站推荐,thinkphp和wordpress,嘉鱼网站建设,南阳做网站优化价格数据导入是所有数模编程的第一步#xff0c;比你想象的更重要。
先要学会一种未必最佳#xff0c;但是通用、安全、简单、好学的方法。
『Python小白的数学建模课 Youcans』 带你从数模小白成为国赛达人。 1. 数据导入是所有数模编程的第一步
编程求解一个数模问题#…
数据导入是所有数模编程的第一步比你想象的更重要。
先要学会一种未必最佳但是通用、安全、简单、好学的方法。
『Python小白的数学建模课 Youcans』 带你从数模小白成为国赛达人。 1. 数据导入是所有数模编程的第一步
编程求解一个数模问题问题总会涉及一些数据。
有些数据是在题目的文字描述中给出的有些数据是通过题目的附件文件下载或指定网址提供的还有些数据是需要自己搜集的。不论是哪种方式获得的数据也不论哪种类型的问题和算法首先都是要把这些数据以适当的方式和格式导入到程序中。
如果数据格式有问题轻则读取数据时发生错误要浪费时间去查找和解决在数模竞赛中就会让人非常焦躁。数据错误还是轻的吗对重则读取数据有错误程序却在继续运行得到了错误的结果这在数模竞赛中就更糟糕了。你可能都不知道发生了错误就算感觉有问题也不会把错误直接锁定到数据导入部分结果不停地去修改其它模块直到把正确的模块也搞错了最后无可救药。
因此确保数模编程第一步“数据导入”的顺利完成比原先的想象更重要。
Python 语言中数据导入的方法很多。对于数学建模问题编程来说选择什么方法最好呢答案是没有最好的只有最合适的。对于不同的问题不同的算法以及所调用工具包的不同实现方法对于数据就会有不同的要求。另外赛题所给数据文件中的数据组织方式不同也需要使用不同的方法来导入数据。
那么好了既然是要具体问题具体分析这不跟没说一样吗这正是本文希望回答的问题虽然针对不同问题的最佳的数据导入方法也不同但我们先要学会一种未必最佳但是通用、安全、简单、好学的方法。 欢迎关注『Python小白的数学建模课 Youcans』系列每周持续更新 Python小白的数学建模课-01.新手必读 Python小白的数学建模课-02.数据导入 Python小白的数学建模课-03.线性规划 Python小白的数学建模课-04.整数规划 Python小白的数学建模课-05.0-1规划 Python小白的数学建模课-06.固定费用问题 Python小白的数学建模课-07.选址问题 Python小白的数学建模课-09.微分方程模型 Python小白的数学建模课-10.微分方程边值问题 Python小白的数学建模课-12.非线性规划 Python小白的数学建模课-15.图论的基本概念 Python小白的数学建模课-16.最短路径算法 Python小白的数学建模课-17.条件最短路径算法 2. 在程序中直接向变量赋值
直接在程序中向变量赋值是虽然笨拙但最简单的方法也许还是最可靠的方法——如果你没有敲错键盘的话。
确实把直接赋值作为数据导入方法来介绍实在是不好意思说出口。但是对于数模竞赛这种特殊的需求直接赋值的方法还是十分常用的而且完全符合简单、实用、可靠的要求。
不过直接赋值也并非我们想的那么简单还是值得认真地谈一谈。
2.1 为什么直接赋值
绝大部分数学建模教材中的例程都是使用直接赋值的方法导入数据。很大比例的博客例程包括本系列的大多数案例也都是在程序中直接赋值的。
其原因在于一是为了保证程序的完整性复制粘贴回车就能得到运行结果不需要复制数据文件等操作就避免了由此引起的各种错误二是为了把读者的注意力聚焦在主要的知识点避免干扰三是使例程更加直观易懂便于理解例程的算法。
这些原因也都是直接赋值的优点。那么这些优点不也正是数模竞赛编程活动的痛点吗没错这就是直接赋值方法在数学建模培训和数模竞赛编程的实践中广泛流行的原因。
2.2 直接赋值的问题与注意事项
但是即使在数模竞赛编程中直接赋值也会有几个问题。
一是某些问题不能使用直接赋值方法。这主要是大数据的问题数据量或数据文件的数量极大已经不能使用直接赋值实现了。
二是一些问题虽然可以直接赋值但很容易出错。这主要是数据量很大或者数据结构、类型比较复杂的问题。
例如多元分析、时间序列、数据统计类的题目可能都有很大的数据量在附件中提供数据文件。这时如果在使用直接赋值导入数据不再是敲键盘了而是从文件中把数据复制粘贴到程序中。
这时要特别注意的问题是
文件中的数据分隔符是什么空格还是逗号与变量赋值的格式要求是否一致即使文件中的数据分隔符看上去是空格也需要检查到底是空格还是制表符是一个空格还是几个空格文件中的数据有没有错漏等异常这在读取文件中可以通过程序检查、识别和处理在复制粘贴时就要人工处理了。
三是数据量不大的问题完全可以用直接赋值导入数据但也会由于疏忽大意而出错。
这倒不是说敲错键盘了而是由于例程不一定是把数据赋值作为独立模块处理的而是分散在算法的过程中进行赋值。同学在使用和修改例程时时就很容易忘记修改算法过程中的变量赋值。这种情况屡见不鲜有时是因为对程序没有搞明白忽略了算法步骤中的某个变量更多时候是忙中出错在反复调试和更换数据时晕头转向只顾了修改开始的数据而疏忽了后面的数据。
养成数据导入模块化的习惯才能避免这一类的疏忽
将数据导入模块作为单独的函数。如果不愿意使用数据导入函数则要把数据导入部分集中写成一段放在程序的起始部分。不要把问题本身的数据导入与算法所需的参数赋值混淆分为两个独立的函数或段落。
例程 1将数据导入作为单独的函数
# 子程序定义优化问题的目标函数
def cal_Energy(X, nVar, mk): # m(k)惩罚因子p1 (max(0, 6*X[0]5*X[1]-320))**2p2 (max(0, 10*X[0]20*X[1]-7027)**2fx -(10*X[0]9*X[1])return fxmk*(p1p2)# 子程序模拟退火算法的参数设置
def ParameterSetting():tInitial 100.0 # 设定初始退火温度(initial temperature)tFinal 1 # 设定终止退火温度(stop temperature)alfa 0.98 # 设定降温参数T(k)alfa*T(k-1)nMarkov 100 # Markov链长度也即内循环运行次数youcans 0.5 # 定义搜索步长可以设为固定值或逐渐缩小return tInitial, tFinal, alfa, nMarkov, youcans例程 2将数据导入集中写成一段放在程序的起始部分
# 主程序
if __name__ __main__:# 模型数据导入p1 [6, 5, -320]p2 [10, 20, -7027]p3 [10, 9]print(p1,p2,p3)# 算法参数设置tInitial 100.0 # 设定初始退火温度(initial temperature)tFinal 1 # 设定终止退火温度(stop temperature)alfa 0.98 # 设定降温参数T(k)alfa*T(k-1)nMarkov 100 # Markov链长度也即内循环运行次数youcans 0.5 # 定义搜索步长可以设为固定值或逐渐缩小print(tInitial, tFinal, alfa, nMarkov, youcans)3. Pandas 导入数据
虽然很多数模竞赛的问题可以通过直接赋值获取数据但主流的数据导入方法还是读取数据文件。
数学建模中常用的数据文件格式有文本文件.txt、Excel 文件.xls, .xlsx和 csv 文件.csv。
在读取文本文件时会遇到逗号、空格、制表符等不同的数据分割符。读取 Excel 文件时首先 .xls 与 .xlsx 的格式不同其次要考虑数据表带不带标题行有时文件中还有多个工作表。读取文件时还会遇到数据缺失非法字符。对于小白来说特别在竞赛时处理这些问题时都会心神不宁。
**Python 中读取数据文件的方法也很多。本文非常不推荐使用 Python 自身的文件操作如打开open、关闭close、读写read、readline函数而是推荐使用 Pandas 读取数据文件。**原因在于 Pandas 提供了多种常用文件格式的读写函数以上各种情况都能一行代码搞定。Pandas 是基于 NumPy 构建的数据分析工具包便于进行数据整理与清洗操作方便灵活。Pandas 提供了与其它各种数据结构的转换工具使用简单灵活。很多数学建模算法的例程就是使用 Pandas 的 Series、DataFrame 数据结构无需进行转换。 3.1 Pandas 读取 Excel 文件
Pandas 使用 read_excel() 函数读取 Excel文件。 pd.read_excel(io, sheetname0,header0,index_colNone,namesNone) pd.read_excel() 的主要参数: io 文件路径包括文件名。 **header 指定作为列名的行。**默认为 0即首行为标题行。设置 headerNone表示无标题行首行就是数据行。 **sheetname指定工作表。**默认为 sheetname0。设置 sheetnameNone 返回全表 设置 sheetname[0,1] 返回多表 。 index_col 指定作为行索引的列编号或列名。 names指定列名 类型为 list。 pd.read_excel() 使用实例:
# sheetname 表示读取指定的工作表header0 表示首行为标题行headerNone 表示首行为数据行
df pd.read_excel(data/youcans1.xls, sheetnameSheet1, header0)3.2 Pandas 读取 csv 文件
**Pandas 使用 pandas.read_csv() 函数读取 Excel文件。 ** pd.read_csv( filepath ,sep‘,’, header‘infer’, namesNone, index_colNone) pd.read_csv() 的主要参数: filepath 文件路径包括文件名。 **sep指定分隔符。**默认为逗号 ‘,’可根据需要设置其它分隔符。 **header 指定作为列名的行。**如果文件没有列名则默认为 0表示首行就是数据行设置 headerNone表示无标题行首行就是数据行。 index_col 指定作为行索引的列编号或列名。 names指定列名 类型为 list。 pd.read_csv() 使用实例:
# sep,表示间隔符为逗号header0表示首行为标题行headerNone 表示首行为数据行
df pd.read_csv(data/youcans2.csv, header0, sep,) 3.3 Pandas 读取文本文件
**对于文本文件 .txt 和 .dat可以使用 pandas.read_table() 函数读取 。 ** pd.read_table( filepath ,sep‘\t’, header‘infer’, namesNone, index_colNone) pd.read_table() 的主要参数: filepath 文件路径包括文件名。 **sep指定分隔符。**默认为 tab 制表符可根据需要设置其它分隔符。 **header 指定作为列名的行。**如果文件没有列名则默认为 0表示首行就是数据行设置 headerNone表示无标题行首行就是数据行。 index_col 指定作为行索引的列编号或列名。 names指定列名 类型为 list。 pd.read_table() 使用实例:
# sep\t表示分隔符为制表符headerNone 表示无标题行第一行是数据
df pd.read_table(data/youcans3.dat, sep\t, headerNone)3.4 Pandas 读取其它文件格式
Pandas 还提供了读取多种文件格式的函数使用方法也都类似都是一行代码搞定。例如
pandas.read_sql读取 SQL 数据库pandas.read_html抓取网页中的表格数据pandas.read_json读取 JSON 数据文件pandas.read_clipboard读取剪贴板内容
由于这些文件格式中数模竞赛中很少用到本文就不进行详细介绍了。有需要的同学可以根据函数名通过搜索引擎搜索参考资料也可以查阅官方文档
Pandas 输入输出函数的说明文档 Input/output — pandas 1.2.4 documentation (pydata.org)https://pandas.pydata.org/pandas-docs/stable/reference/io.html
此外对于大数据类的问题所需处理的数据量可能非常大必要时需对文件进行拆分或合并也可以用 pandas 进行处理这将在后续文章结合具体问题进行讲解。 4. 数据导入例程
【重要说明】以上章节的内容虽然介绍了数据导入的基本方法但恐怕还是难以达到消化吸收为我所用。为了解决这个问题本文将相关内容整合为例程以便于读者学习收藏也便于使用修改。
例程01读取数据文件
# mathmodel01_v1.py
# Demo01 of mathematical modeling algorithm
# Read data files into DataFrame.
# Copyright 2021 Youcans, XUPT
# Crated2021-05-27import pandas as pd# 读取数据文件
def readDataFile(readPath): # readPath: 数据文件的地址和文件名# readPath ../data/youcansxupt.csv # 文件路径也可以直接在此输入try:if (readPath[-4:] .csv):dfFile pd.read_csv(readPath, header0, sep,) # 间隔符为逗号首行为标题行# dfFile pd.read_csv(filePath, headerNone, sep,) # sep: 间隔符无标题行elif (readPath[-4:] .xls) or (readPath[-5:] .xlsx): # sheet_name 默认为 0dfFile pd.read_excel(readPath, header0) # 首行为标题行# dfFile pd.read_excel(filePath, headerNone) # 无标题行elif (readPath[-4:] .dat): # sep: 间隔符header首行是否为标题行dfFile pd.read_table(readPath, sep , header0) # 间隔符为空格首行为标题行# dfFile pd.read_table(filePath,sep,,headerNone) # 间隔符为逗号无标题行else:print(不支持的文件格式。)except Exception as e:print(读取数据文件失败{}.format(str(e)))returnreturn dfFile# 主程序
def main():# 读取数据文件 # Youcans, XUPTreadPath ../data/toothpaste.csv # 数据文件的地址和文件名dfFile readDataFile(readPath) # 调用读取文件子程序print(type(dfFile)) # 查看 dfFile 数据类型print(dfFile.shape) # 查看 dfFile 形状行数列数print(dfFile.head()) # 显示 dfFile 前 5 行数据returnif __name__ __main__: # Youcans, XUPTmain()例程01 运行结果
class pandas.core.frame.DataFrame
(30, 6)period price average advertise difference sales
0 1 3.85 3.80 5.50 -0.05 7.38
1 2 3.75 4.00 6.75 0.25 8.51
2 3 3.70 4.30 7.25 0.60 9.52
3 4 3.70 3.70 5.50 0.00 7.50
4 5 3.60 3.85 7.00 0.25 9.33例程01 程序说明
本例程需要读取数据文件 “…/data/toothpaste.csv”该文件保存在 …/data/ 目录下。读者需要修改该数据文件的文件路径和文件名以便读取自己需要的本地文件。本例程可以根据文件名的后缀自动识别文件类型调用相应的函数读取文件。本例程中读取文件模块使用 try…except 语句进行简单的异常处理。如果读取失败可以根据抛出的异常类型查找错误。
【本节完】 版权说明
欢迎关注『Python小白的数学建模课 Youcans』 原创作品
原创作品转载必须标注原文链接(https://blog.csdn.net/youcans/article/details/117333479)
Copyright 2021 Youcans, XUPT
Crated2021-05-27 欢迎关注 『Python小白的数学建模课 Youcans』 系列持续更新 Python小白的数学建模课-01.新手必读 Python小白的数学建模课-02.数据导入 Python小白的数学建模课-03.线性规划 Python小白的数学建模课-04.整数规划 Python小白的数学建模课-05.0-1规划 Python小白的数学建模课-06.固定费用问题 Python小白的数学建模课-07.选址问题 Python小白的数学建模课-09.微分方程模型 Python小白的数学建模课-10.微分方程边值问题 Python小白的数学建模课-12.非线性规划 Python小白的数学建模课-15.图论的基本概念 Python小白的数学建模课-16.最短路径算法 Python小白的数学建模课-17.条件最短路径算法 Python小白的数学建模课-A1.国赛赛题类型分析 Python小白的数学建模课-A2.2021年数维杯C题探讨 Python小白的数学建模课-A3.12个新冠疫情数模竞赛赛题及短评 Python小白的数学建模课-B2. 新冠疫情 SI模型 Python小白的数学建模课-B3. 新冠疫情 SIS模型 Python小白的数学建模课-B4. 新冠疫情 SIR模型 Python小白的数学建模课-B5. 新冠疫情 SEIR模型 Python小白的数学建模课-B6. 新冠疫情 SEIR改进模型 Python数模笔记-PuLP库 Python数模笔记-StatsModels统计回归 Python数模笔记-Sklearn Python数模笔记-NetworkX Python数模笔记-模拟退火算法