Python小白的数学建模课-02.数据导入
數據導入是所有數模編程的第一步,比你想象的更重要。
先要學會一種未必最佳,但是通用、安全、簡單、好學的方法。
『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 fx+mk*(p1+p2)# 子程序:模擬退火算法的參數設置 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:將數據導入集中寫成一段,放在程序的起始部分
# 主程序 def 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 讀取數據文件。**原因在于:
3.1 Pandas 讀取 Excel 文件
Pandas 使用 read_excel() 函數讀取 Excel文件。
pd.read_excel(io, sheetname=0,header=0,index_col=None,names=None)
pd.read_excel() 的主要參數:
io : 文件路徑(包括文件名)。
**header :指定作為列名的行。**默認為 0,即首行為標題行。設置 header=None,表示無標題行,首行就是數據行。
**sheetname:指定工作表。**默認為 sheetname=0。設置 sheetname=None 返回全表, 設置 sheetname=[0,1] 返回多表 。
index_col :指定作為行索引的列編號或列名。
names:指定列名, 類型為 list。
pd.read_excel() 使用實例:
# sheetname 表示讀取指定的工作表,header=0 表示首行為標題行,header=None 表示首行為數據行 df = pd.read_excel("data/youcans1.xls", sheetname='Sheet1', header=0)3.2 Pandas 讀取 csv 文件
**Pandas 使用 pandas.read_csv() 函數讀取 Excel文件。 **
pd.read_csv( filepath ,sep=’,’, header=‘infer’, names=None, index_col=None)
pd.read_csv() 的主要參數:
filepath : 文件路徑(包括文件名)。
**sep:指定分隔符。**默認為逗號 ‘,’,可根據需要設置其它分隔符。
**header :指定作為列名的行。**如果文件沒有列名則默認為 0,表示首行就是數據行;設置 header=None,表示無標題行,首行就是數據行。
index_col :指定作為行索引的列編號或列名。
names:指定列名, 類型為 list。
pd.read_csv() 使用實例:
# sep=','表示間隔符為逗號,header=0表示首行為標題行,header=None 表示首行為數據行 df = pd.read_csv("data/youcans2.csv", header=0, sep=',')3.3 Pandas 讀取文本文件
**對于文本文件 .txt 和 .dat,可以使用 pandas.read_table() 函數讀取 。 **
pd.read_table( filepath ,sep=’\t’, header=‘infer’, names=None, index_col=None)
pd.read_table() 的主要參數:
filepath : 文件路徑(包括文件名)。
**sep:指定分隔符。**默認為 tab 制表符,可根據需要設置其它分隔符。
**header :指定作為列名的行。**如果文件沒有列名則默認為 0,表示首行就是數據行;設置 header=None,表示無標題行,首行就是數據行。
index_col :指定作為行索引的列編號或列名。
names:指定列名, 類型為 list。
pd.read_table() 使用實例:
# sep='\t'表示分隔符為制表符,header=None 表示無標題行,第一行是數據 df = pd.read_table("data/youcans3.dat", sep="\t", header=None)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 # Crated:2021-05-27import pandas as pd# 讀取數據文件 def readDataFile(readPath): # readPath: 數據文件的地址和文件名# readPath = "../data/youcansxupt.csv" # 文件路徑也可以直接在此輸入try:if (readPath[-4:] == ".csv"):dfFile = pd.read_csv(readPath, header=0, sep=",") # 間隔符為逗號,首行為標題行# dfFile = pd.read_csv(filePath, header=None, sep=",") # sep: 間隔符,無標題行elif (readPath[-4:] == ".xls") or (readPath[-5:] == ".xlsx"): # sheet_name 默認為 0dfFile = pd.read_excel(readPath, header=0) # 首行為標題行# dfFile = pd.read_excel(filePath, header=None) # 無標題行elif (readPath[-4:] == ".dat"): # sep: 間隔符,header:首行是否為標題行dfFile = pd.read_table(readPath, sep=" ", header=0) # 間隔符為空格,首行為標題行# dfFile = pd.read_table(filePath,sep=",",header=None) # 間隔符為逗號,無標題行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 程序說明:
【本節完】
版權說明:
歡迎關注『Python小白的數學建模課 @ Youcans』 原創作品
原創作品,轉載必須標注原文鏈接:(https://blog.csdn.net/youcans/article/details/117333479)
Copyright 2021 Youcans, XUPT
Crated:2021-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數模筆記-模擬退火算法
總結
以上是生活随笔為你收集整理的Python小白的数学建模课-02.数据导入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四川大学计算机学硕分数线,川大计算机考研
- 下一篇: java udp 心跳,udp简略通讯示