使用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.
隨緣更新下一張,各位老鐵有緣再見
后續可以根據大家的意見修正一下這篇教程的問題,有緣更新下一章啦~
?
總結
以上是生活随笔為你收集整理的使用python进行数学建模系列1 读表格 +简单处理+ 画图简单入门 代码可直接运行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java从数据库映射实体类的代码
- 下一篇: websocket python爬虫_p