PyWebIO,讓 Pandas 原地起飛的神器!
我想很多人用 Python 就是用 pandas 進(jìn)行數(shù)據(jù)分析,并且你大概率每天就用到 pandas 那幾個函數(shù)處理結(jié)構(gòu)大致相似的數(shù)據(jù)。
每天重復(fù)寫著同樣的代碼,很辛苦,于是就會有人想到用 Pyinstaller 進(jìn)行打包,但是打包的痛苦,尤其是各種亂七八糟的報錯只能說試過的都懂。
但你有想過將要打包的功能,做到網(wǎng)頁上去嗎?這樣只要有個公網(wǎng)ip就能隨時隨地、不限設(shè)備的去訪問。你可能會想過,但是當(dāng)你嘗試去實(shí)現(xiàn),發(fā)現(xiàn) Python 開發(fā)頁面動不動就是 Django/flask 這樣的大家伙,很容易勸退。
本文我就將基于之前介紹過的 PyWebIO 庫,講一下如何不寫一行前端代碼,僅用一個不到100行的py腳本制作下面的頁面
上傳數(shù)據(jù)
首先是數(shù)據(jù)的加載,在 PyWebIO 中實(shí)現(xiàn)這個操作非常簡單,只需要一行代碼即可在頁面添加一個上傳文件的部件
file?=?file_upload('請選擇需要加載的數(shù)據(jù)')

當(dāng)然有上傳就有讀取的操作,雖然后臺已經(jīng)將數(shù)據(jù)文件讀取了,但默認(rèn)不是用 pandas 讀取的很難操作,所以我們可以用下面的代碼將文件名字讀取出來之后,再用 pandas 進(jìn)行讀取。
df?=?read_file(file['filename'])
讀取之后呢,就會進(jìn)入到下面的頁面,我們繼續(xù)講解該其他功能的實(shí)現(xiàn)
添加按鈕與事件
有關(guān)標(biāo)題和文字部分的講解見該系列第一篇文章,本文不再贅述。
現(xiàn)在來重點(diǎn)講解一下,如何添加一個按鈕,簡單來說就是如何實(shí)現(xiàn)像下圖一樣,點(diǎn)擊按鈕實(shí)現(xiàn)對應(yīng)功能
這就分為兩個操作,添加按鈕和綁定對應(yīng)按鈕的事件,在 PyWebIO 中,我們可以使用 put_buttons 添加一個按鈕,并使用 onclick 綁定該按鈕對應(yīng)的事件
put_buttons(['關(guān)閉'],?onclick=lambda?_:?close_popup())
例如上面代碼就添加了一個關(guān)閉的按鈕,點(diǎn)擊就會關(guān)閉彈窗,到我們的頁面來,我們有一排按鈕,怎么實(shí)現(xiàn)?
答案是用一個 list,然后將每個按鈕對應(yīng)的事件也用一個list傳給后臺即可
put_buttons(['檢查重復(fù)值','刪除重復(fù)值','檢查缺失值','刪除缺失值','檢查異常值','刪除異常值'],?onclick=[lambda:?chongfu(df,res_table),
lambda:?chongfuchuli(
????????????df,
????????????res_table),
lambda:?other(),
lambda:?other(),
lambda:?other(),
lambda:?other()])
按鈕設(shè)置好了之后,就是該按鈕對應(yīng)操作函數(shù)的開發(fā)了,例如查找重復(fù)值,這對于刷了 pandas300題 的同學(xué)來說,完全不是問題
df1?=?df[df.國家奧委會.duplicated()?==?True]
但是這只是用 pandas 將重復(fù)值查找出來了,怎樣讓網(wǎng)頁顯示出來,這又是下一個問題。
顯示數(shù)據(jù)
在上面,我們搞定了點(diǎn)擊按鈕就將重復(fù)值篩選出來,但是如何讓前端展示表格。
在 PyWebIO 中展示表格一般像下面一樣,將數(shù)據(jù)轉(zhuǎn)換為多級列表,再用過markdown渲染出來
但是如果再寫一個轉(zhuǎn)換函數(shù),就略顯麻煩,幸運(yùn)的是 pandas 可以直接輸出html,所以我們可以將數(shù)據(jù)先轉(zhuǎn)化為 html 再嵌入頁面中,就像前端的 iframe 一樣,這部分代碼如下
put_scrollable(res_table,horizon_scroll=True,height=450)
res_table.reset(put_html(df1.to_html(border=0)))
通過循環(huán)這樣的操作,我們給每一個按鈕都添加一個功能函數(shù),函數(shù)內(nèi)寫入 pandas 操作部分與前端顯示部分就能完成第一部分?jǐn)?shù)據(jù)處理的操作。
pin - 持續(xù)性輸入
下面一個功能是數(shù)據(jù)篩選,即給定關(guān)鍵詞,輸出包含該關(guān)鍵詞的行。
看起來很簡單,但這卻是 PyWebIO 中最難的部分,因?yàn)?PyWebIO 默認(rèn)是同步的代碼,也就是如果一個輸入框沒有輸入內(nèi)容,那么后面的全部代碼都不會展示。
這也是為什么,在第一個頁面,沒有上傳文件,后面的頁面代碼都沒有輸出,顯然如果這里還用同樣的方法是不可以的。
這就用到 pin 方法,可以簡單的按照異步的思路去理解,也就是說我們先創(chuàng)建一個輸入框和一個提交按鈕,再用回調(diào)函數(shù)進(jìn)行綁定
put_markdown('##?數(shù)據(jù)查詢')
pin.put_input('res',?label='請?jiān)谙路捷斎肟蛞樵兊年P(guān)鍵字',?type=TEXT)
put_buttons(['提交查詢'],?lambda?_:?chaxun(res_table,df,pin.pin['res']))
就像上面一樣,先使用 pin.put_input 創(chuàng)建輸入框,再使用 put_buttons 添加一個按鈕并綁定對應(yīng)操作,這里看起來代碼不長,但是實(shí)際寫代碼時是需要花費(fèi)一定時間思考的!
到這里,至此我們的頁面主要邏輯就介紹完畢,至于一些細(xì)節(jié)性的修改例如文字、標(biāo)題等大家可以自行研究源碼學(xué)習(xí)!
小結(jié)
通過上面的講解,我們可以發(fā)現(xiàn),沒有寫一行前端,就完成了一個簡單的數(shù)據(jù)查詢與處理頁面的開發(fā),這就是 PyWebIO 魅力所在!
當(dāng)然弊端也是有的,就是它最大的優(yōu)點(diǎn)也是它最大的缺點(diǎn),不寫前端代碼可以不用關(guān)注樣式,從而導(dǎo)致頁面過于簡單。所以你應(yīng)該合理評估自己對頁面樣式的評估來選擇是否使用它!
但不論如何,我都會在后續(xù)的文章中,分享如何用 PyWebIO 開發(fā)更多的頁面!喜歡這個系列的話可以給本文點(diǎn)贊、留言、在看!
注:本文的完整代碼,可以在后臺回復(fù) 1105 獲取!

