初學(xué)python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入(小白篇)_第1頁
初學(xué)python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入(小白篇)_第2頁
初學(xué)python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入(小白篇)_第3頁
初學(xué)python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入(小白篇)_第4頁
初學(xué)python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入(小白篇)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第初學(xué)python數(shù)學(xué)建模之?dāng)?shù)據(jù)導(dǎo)入(小白篇)目錄1.數(shù)據(jù)導(dǎo)入是所有數(shù)模編程的第一步2.在程序中直接向變量賦值2.1為什么直接賦值?2.2直接賦值的問題與注意事項(xiàng)例程1:將數(shù)據(jù)導(dǎo)入作為單獨(dú)的函數(shù)例程2:將數(shù)據(jù)導(dǎo)入集中寫成一段,放在程序的起始部分3.Pandas導(dǎo)入數(shù)據(jù)3.1Pandas讀取Excel文件pd.read_excel()的主要參數(shù):pd.read_excel()使用實(shí)例:3.2Pandas讀取csv文件Pandas使用pandas.read_csv()函數(shù)讀取Excel文件。3.3Pandas讀取文本文件對(duì)于文本文件.txt和.dat,可以使用pandas.read_table()函數(shù)讀取。3.4Pandas讀取其它文件格式Pandas還提供了讀取多種文件格式的函數(shù)4.數(shù)據(jù)導(dǎo)入例程例程01:讀取數(shù)據(jù)文件例程01運(yùn)行結(jié)果:

1.數(shù)據(jù)導(dǎo)入是所有數(shù)模編程的第一步

編程求解一個(gè)數(shù)模問題,問題總會(huì)涉及一些數(shù)據(jù)。

有些數(shù)據(jù)是在題目的文字描述中給出的,有些數(shù)據(jù)是通過題目的附件文件下載或指定網(wǎng)址提供的,還有些數(shù)據(jù)是需要自己搜集的。不論是哪種方式獲得的數(shù)據(jù),也不論哪種類型的問題和算法,首先都是要把這些數(shù)據(jù)以適當(dāng)?shù)姆绞胶透袷綄?dǎo)入到程序中。

如果數(shù)據(jù)格式有問題

輕則讀取數(shù)據(jù)時(shí)發(fā)生錯(cuò)誤,要浪費(fèi)時(shí)間去查找和解決,在數(shù)模競(jìng)賽中就會(huì)讓人非常焦躁。

數(shù)據(jù)錯(cuò)誤還是輕的嗎?對(duì),重則讀取數(shù)據(jù)有錯(cuò)誤,程序卻在繼續(xù)運(yùn)行,得到了錯(cuò)誤的結(jié)果,這在數(shù)模競(jìng)賽中就更糟糕了。

你可能都不知道發(fā)生了錯(cuò)誤,就算感覺有問題也不會(huì)把錯(cuò)誤直接鎖定到數(shù)據(jù)導(dǎo)入部分。

結(jié)果不停地去修改其它模塊,直到把正確的模塊也搞錯(cuò)了,最后無可救藥。

因此,確保數(shù)模編程第一步“數(shù)據(jù)導(dǎo)入”的順利完成,遠(yuǎn)遠(yuǎn)比你想象的更重要。

Python語言中數(shù)據(jù)導(dǎo)入的方法很多

對(duì)于數(shù)學(xué)建模問題編程來說,選擇什么方法最好呢?答案是:沒有最好的,只有最合適的。

對(duì)于不同的問題,不同的算法,以及所調(diào)用工具包的不同實(shí)現(xiàn)方法,對(duì)于數(shù)據(jù)就會(huì)有不同的要求。

另外,賽題所給數(shù)據(jù)文件中的數(shù)據(jù)組織方式不同,也需要使用不同的方法來導(dǎo)入數(shù)據(jù)。

那么好了,既然是要具體問題具體分析,這不跟沒說一樣嗎?這正是本文希望回答的問題,雖然針對(duì)不同問題的最佳的數(shù)據(jù)導(dǎo)入方法也不同,但我們先要學(xué)會(huì)一種未必最佳,但是通用、安全、簡(jiǎn)單、好學(xué)的方法。

2.在程序中直接向變量賦值

直接在程序中向變量賦值,是雖然笨拙但最簡(jiǎn)單的方法,也許還是最可靠的方法——如果你沒有敲錯(cuò)鍵盤的話。

確實(shí),把直接賦值作為數(shù)據(jù)導(dǎo)入方法來介紹,實(shí)在是不好意思說出口。

但是,對(duì)于數(shù)模競(jìng)賽這種特殊的需求,直接賦值的方法還是十分常用的,而且完全符合簡(jiǎn)單、實(shí)用、可靠的要求。

不過,直接賦值也并非我們想的那么簡(jiǎn)單,還是值得認(rèn)真地談一談。

2.1為什么直接賦值?

絕大部分?jǐn)?shù)學(xué)建模教材中的例程,都是使用直接賦值的方法導(dǎo)入數(shù)據(jù)。

很大比例的博客例程,包括本系列的大多數(shù)案例,也都是在程序中直接賦值的。

其原因在于

一是為了保證程序的完整性,復(fù)制粘貼回車就能得到運(yùn)行結(jié)果,不需要復(fù)制數(shù)據(jù)文件等操作,就避免了由此引起的各種錯(cuò)誤;

二是為了把讀者的注意力聚焦在主要的知識(shí)點(diǎn),避免干擾;

三是使例程更加直觀易懂,便于理解例程的算法。

這些原因也都是直接賦值的優(yōu)點(diǎn)。那么,這些優(yōu)點(diǎn)不也正是數(shù)模競(jìng)賽編程活動(dòng)的痛點(diǎn)嗎?

沒錯(cuò),這就是直接賦值方法在數(shù)學(xué)建模培訓(xùn)和數(shù)模競(jìng)賽編程的實(shí)踐中廣泛流行的原因。

2.2直接賦值的問題與注意事項(xiàng)

但是,即使在數(shù)模競(jìng)賽編程中,直接賦值也會(huì)有幾個(gè)問題。

一是某些問題不能使用直接賦值方法。這主要是大數(shù)據(jù)的問題,數(shù)據(jù)量或數(shù)據(jù)文件的數(shù)量極大,已經(jīng)不能使用直接賦值實(shí)現(xiàn)了。

二是一些問題雖然可以直接賦值,但很容易出錯(cuò)。這主要是數(shù)據(jù)量很大,或者數(shù)據(jù)結(jié)構(gòu)、類型比較復(fù)雜的問題。例如,多元分析、時(shí)間序列、數(shù)據(jù)統(tǒng)計(jì)類的題目可能都有很大的數(shù)據(jù)量,在附件中提供數(shù)據(jù)文件。

這時(shí)如果在使用直接賦值導(dǎo)入數(shù)據(jù),不再是敲鍵盤了,而是從文件中把數(shù)據(jù)復(fù)制粘貼到程序中。這時(shí)要特別注意的問題是:文件中的數(shù)據(jù)分隔符是什么,空格還是逗號(hào),與變量賦值的格式要求是否一致?

即使文件中的數(shù)據(jù)分隔符看上去是空格,也需要檢查到底是空格還是制表符,是一個(gè)空格還是幾個(gè)空格?

文件中的數(shù)據(jù)有沒有錯(cuò)漏等異常?

這在讀取文件中可以通過程序檢查、識(shí)別和處理,在復(fù)制粘貼時(shí)就要人工處理了。

三是數(shù)據(jù)量不大的問題,完全可以用直接賦值導(dǎo)入數(shù)據(jù),但也會(huì)由于疏忽大意而出錯(cuò)。這倒不是說敲錯(cuò)鍵盤了,而是由于例程不一定是把數(shù)據(jù)賦值作為獨(dú)立模塊處理的,而是分散在算法的過程中進(jìn)行賦值。

同學(xué)在使用和修改例程時(shí)時(shí),就很容易忘記修改算法過程中的變量賦值。

這種情況屢見不鮮,有時(shí)是因?yàn)閷?duì)程序沒有搞明白,忽略了算法步驟中的某個(gè)變量;

更多時(shí)候是忙中出錯(cuò),在反復(fù)調(diào)試和更換數(shù)據(jù)時(shí)暈頭轉(zhuǎn)向,只顧了修改開始的數(shù)據(jù)而疏忽了后面的數(shù)據(jù)。

養(yǎng)成數(shù)據(jù)導(dǎo)入模塊化的習(xí)慣,才能避免這一類的疏忽:

將數(shù)據(jù)導(dǎo)入模塊作為單獨(dú)的函數(shù)。

如果不愿意使用數(shù)據(jù)導(dǎo)入函數(shù),則要把數(shù)據(jù)導(dǎo)入部分集中寫成一段,放在程序的起始部分。

不要把問題本身的數(shù)據(jù)導(dǎo)入與算法所需的參數(shù)賦值混淆,分為兩個(gè)獨(dú)立的函數(shù)或段落。

例程1:將數(shù)據(jù)導(dǎo)入作為單獨(dú)的函數(shù)

#子程序:定義優(yōu)化問題的目標(biāo)函數(shù)

defcal_Energy(X,nVar,mk):#m(k):懲罰因子

p1=(max(0,6*X[0]+5*X[1]-320))**2

p2=(max(0,10*X[0]+20*X[1]-7027)**2

fx=-(10*X[0]+9*X[1])

returnfx+mk*(p1+p2)

#子程序:模擬退火算法的參數(shù)設(shè)置

defParameterSetting():

tInitial=100.0#設(shè)定初始退火溫度(initialtemperature)

tFinal=1#設(shè)定終止退火溫度(stoptemperature)

alfa=0.98#設(shè)定降溫參數(shù),T(k)=alfa*T(k-1)

nMarkov=100#Markov鏈長(zhǎng)度,也即內(nèi)循環(huán)運(yùn)行次數(shù)

youcans=0.5#定義搜索步長(zhǎng),可以設(shè)為固定值或逐漸縮小

returntInitial,tFinal,alfa,nMarkov,youcans

例程2:將數(shù)據(jù)導(dǎo)入集中寫成一段,放在程序的起始部分

#主程序

defmain():

#模型數(shù)據(jù)導(dǎo)入

p1=[6,5,-320]

p2=[10,20,-7027]

p3=[10,9]

print(p1,p2,p3)

#算法參數(shù)設(shè)置

tInitial=100.0#設(shè)定初始退火溫度(initialtemperature)

tFinal=1#設(shè)定終止退火溫度(stoptemperature)

alfa=0.98#設(shè)定降溫參數(shù),T(k)=alfa*T(k-1)

nMarkov=100#Markov鏈長(zhǎng)度,也即內(nèi)循環(huán)運(yùn)行次數(shù)

youcans=0.5#定義搜索步長(zhǎng),可以設(shè)為固定值或逐漸縮小

print(tInitial,tFinal,alfa,nMarkov,youcans)

3.Pandas導(dǎo)入數(shù)據(jù)

雖然很多數(shù)模競(jìng)賽的問題可以通過直接賦值獲取數(shù)據(jù),但主流的數(shù)據(jù)導(dǎo)入方法還是讀取數(shù)據(jù)文件。

數(shù)學(xué)建模中常用的數(shù)據(jù)文件格式有文本文件(.txt)、Excel文件(.xls,.xlsx)和csv文件(.csv)。

在讀取文本文件時(shí),會(huì)遇到逗號(hào)、空格、制表符等不同的數(shù)據(jù)分割符。

讀取Excel文件時(shí),首先.xls與.xlsx的格式不同,其次要考慮數(shù)據(jù)表帶不帶標(biāo)題行,有時(shí)文件中還有多個(gè)工作表。

讀取文件時(shí)還會(huì)遇到數(shù)據(jù)缺失,非法字符。

對(duì)于小白來說,特別在競(jìng)賽時(shí),處理這些問題時(shí)都會(huì)心神不寧。

Python中讀取數(shù)據(jù)文件的方法也很多。本文非常不推薦使用Python自身的文件操作如打開(open)、關(guān)閉(close)、讀寫(read、readline)函數(shù),而是推薦使用Pandas讀取數(shù)據(jù)文件。

原因在于:

Pandas提供了多種常用文件格式的讀寫函數(shù),以上各種情況都能一行代碼搞定。

Pandas是基于NumPy構(gòu)建的數(shù)據(jù)分析工具包,便于進(jìn)行數(shù)據(jù)整理與清洗,操作方便靈活。

Pandas提供了與其它各種數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換工具,使用簡(jiǎn)單靈活。

很多數(shù)學(xué)建模算法的例程就是使用Pandas的Series、DataFrame數(shù)據(jù)結(jié)構(gòu),無需進(jìn)行轉(zhuǎn)換。

3.1Pandas讀取Excel文件

Pandas使用read_excel()函數(shù)讀取Excel文件。

pd.read_excel(io,sheetname=0,header=0,index_col=None,names=None)

pd.read_excel()的主要參數(shù):

io:文件路徑(包括文件名)。

header:指定作為列名的行。默認(rèn)為0,即首行為標(biāo)題行。設(shè)置header=None,表示無標(biāo)題行,首行就是數(shù)據(jù)行。

sheetname:指定工作表。默認(rèn)為sheetname=0。設(shè)置sheetname=None返回全表,設(shè)置sheetname=[0,1]返回多表。

index_col:指定作為行索引的列編號(hào)或列名。

names:指定列名,類型為list。

pd.read_excel()使用實(shí)例:

#sheetname表示讀取指定的工作表,header=0表示首行為標(biāo)題行,header=None表示首行為數(shù)據(jù)行

df=pd.read_excel("data/youcans1.xls",sheetname='Sheet1',header=0)

3.2Pandas讀取csv文件

Pandas使用pandas.read_csv()函數(shù)讀取Excel文件。

pd.read_csv(filepath,sep=',',header=‘infer',names=None,index_col=None)

pd.read_csv()的主要參數(shù):

filepath:文件路徑(包括文件名)。

sep:指定分隔符。默認(rèn)為逗號(hào)‘,',可根據(jù)需要設(shè)置其它分隔符。

header:指定作為列名的行。**如果文件沒有列名則默認(rèn)為0,表示首行就是數(shù)據(jù)行;設(shè)置header=None,表示無標(biāo)題行,首行就是數(shù)據(jù)行。

index_col:指定作為行索引的列編號(hào)或列名。

names:指定列名,類型為list。

pd.read_csv()使用實(shí)例:

#sep=','表示間隔符為逗號(hào),header=0表示首行為標(biāo)題行,header=None表示首行為數(shù)據(jù)行

df=pd.read_csv("data/youcans2.csv",header=0,sep=',')

3.3Pandas讀取文本文件

對(duì)于文本文件.txt和.dat,可以使用pandas.read_table()函數(shù)讀取。

pd.read_table(filepath,sep='\t',header=‘infer',names=None,index_col=None)

pd.read_table()的主要參數(shù):

filepath:文件路徑(包括文件名)。

sep:指定分隔符。默認(rèn)為tab制表符,可根據(jù)需要設(shè)置其它分隔符。

header:指定作為列名的行。**如果文件沒有列名則默認(rèn)為0,表示首行就是數(shù)據(jù)行;設(shè)置header=None,表示無標(biāo)題行,首行就是數(shù)據(jù)行。

index_col:指定作為行索引的列編號(hào)或列名。

names:指定列名,類型為list

pd.read_table()使用實(shí)例:

#sep='\t'表示分隔符為制表符,header=None表示無標(biāo)題行,第一行是數(shù)據(jù)

df=pd.read_table("data/youcans3.dat",sep="\t",header=None)

3.4Pandas讀取其它文件格式

Pandas還提供了讀取多種文件格式的函數(shù)

使用方法也都類似,都是一行代碼搞定。例如:

pandas.read_sql,讀取SQL數(shù)據(jù)庫(kù)

pandas.read_html,抓取網(wǎng)頁中的表格數(shù)據(jù)

pandas.read_json,讀取JSON數(shù)據(jù)文件

pandas.read_clipboard,讀取剪貼板內(nèi)容

由于這些文件格式中數(shù)模競(jìng)賽中很少用到,本文就不進(jìn)行詳細(xì)介紹了。有需要的同學(xué)可以根據(jù)函數(shù)名通過搜索引擎搜索參考資料,也可以查閱官方文檔:

Pandas輸入輸出函數(shù)的說明文檔/pandas-docs/stable/reference/io.html

/pandas-docs/stable/reference/io.html

此外,對(duì)于大數(shù)據(jù)類的問題,所需處理的數(shù)據(jù)量可能非常大,必要時(shí)需對(duì)文件進(jìn)行拆分或合并,也可以用pandas進(jìn)行處理,這將在后續(xù)文章結(jié)合具體問題進(jìn)行講解。

4.數(shù)據(jù)導(dǎo)入例程

【重要說明】以上章節(jié)的內(nèi)容雖然介紹了數(shù)據(jù)導(dǎo)入的基本方法,但恐怕還是難以達(dá)到消化吸收,為我所用。

為了解決這個(gè)問題,本文將相關(guān)內(nèi)容整合為例程,以便于讀者學(xué)習(xí)收藏,也便于使用修改。

例程01:讀取數(shù)據(jù)文件

#mathmodel01_v1.py

#Demo01ofmathematicalmodelingalgorithm

#ReaddatafilesintoDataFrame.

#Copyright2025Youcans,XUPT

#Crated:2025-05-27

importpandasaspd

#讀取數(shù)據(jù)文件

defreadDataFile(readPath):#readPath:數(shù)據(jù)文件的地址和文件名

#readPath="../data/youcansxupt.csv"#文件路徑也可以直接在此輸入

try:

if(readPath[-4:]==".csv"):

dfFile=pd.read_csv(readPath,header=0,sep=",")#間隔符為逗號(hào),首行為標(biāo)題行

#dfFile=pd.read_csv(filePath,header=None,sep=",")#sep:間隔符,無標(biāo)題行

elif(readPath[-4:]==".xls")or(readPath[-5:]==".xlsx"):#sheet_name默認(rèn)為0

dfFile=pd.read_excel(readPath,header=0)#首行為標(biāo)題行

#dfFile=pd.read_excel(filePath,header=None)#無標(biāo)題行

elif(readPath[-4:]==".dat"):#sep:間隔符,header:首行是否為標(biāo)題行

dfFile=pd.read_table(readPath,sep="",header=0)#間隔符為空格,首行為標(biāo)題行

#dfFile=pd.read_table(filePath,sep=",",header=None)#間隔符為逗號(hào),無標(biāo)題行

else:

print("不支持的文件格式。")

exceptExceptionase:

print("讀取數(shù)據(jù)文件失敗:{}".format(str(e)))

return

returndfFile

#主程序

defmain():

#讀取數(shù)據(jù)文件#Youcans,XUPT

readPath="../data/toothpaste.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論