99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀如何在網(wǎng)頁中執(zhí)行一段 pandas 代碼?(CDA官網(wǎng)干貨內(nèi)容分享)
如何在網(wǎng)頁中執(zhí)行一段 pandas 代碼?(CDA官網(wǎng)干貨內(nèi)容分享)
2022-01-11
收藏

作者:劉早起

來源:早起Python

如何在線執(zhí)行 pandas 代碼感興趣,今天就簡單來說一下我探索這一功能的過程。

首先在設計這一功能時,需要先明確大致需求:

  • ???用戶可以在當前頁面執(zhí)行
  • 不同用戶之間獨立運行
  • 不需要加載額外代碼或操作

其中最重要的一點就是用戶可以在當前網(wǎng)站、當前單元格執(zhí)行代碼,其次盡可能的減少其他操作。

其實為了實現(xiàn)這個功能,我探索了大半個月,不斷修改方案,刪掉了幾個寫了很久但是不能完美實現(xiàn)的代碼,幾度放棄,最后還是磕磕碰碰的做出來,下面是我的一些經(jīng)驗,僅供參考。

方案1

首先最簡單的思路就是用自己的服務器,前端寫一個輸入框,然后將用戶提交的代碼到后臺,執(zhí)行后再返回前端,就像這樣

如何在網(wǎng)頁中執(zhí)行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

但是思索了一番還是放棄了,除了要防止惡意用戶執(zhí)行sudo rm - rf /*之類的代碼,為了滿足第二個需求就要給每個用戶分配一定的空間,這就很吃服務器的配置,例如前天最高100+用戶同時運行,我的 4c8g 服務器肯定是帶不動的。

并且如果采取這個的方案,理論上可以實現(xiàn),但除了升級服務器要錢,我也沒有開發(fā)類似產(chǎn)品的經(jīng)驗,時間成本不好預估,遂放棄。

方案2

之后又是一番面向 stackoverflow 編程,我了解到很多可以在線執(zhí)行代碼的網(wǎng)站,就像這樣

如何在網(wǎng)頁中執(zhí)行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

確實可以在線執(zhí)行一段代碼,但是除去我是否能做出來,如何控制權(quán)限等問題,這樣的網(wǎng)站主要是以執(zhí)行代碼為主,無法完成 pandas 教程的任務。

并且代碼不能預設置,只能進入頁面后手動輸入,本地數(shù)據(jù)也不好加載,而且執(zhí)行一次就要跳轉(zhuǎn)到一個新的頁面,十分繁瑣(寫一個爬蟲接口也是一個辦法,但是就太依賴對方網(wǎng)站),于是很快放棄了這條思路。

Jupyterhub

繼續(xù)一番搜索后,我發(fā)現(xiàn)了一個神器 —— Jupyterhub

如何在網(wǎng)頁中執(zhí)行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

如上圖架構(gòu)展示的一樣,使用Jupyterhub 可以給每個用戶分配一個獨立的Jupyter Notebook,并且無需考慮權(quán)限等問題,我也可以提前將代碼和數(shù)據(jù)進行預設。

但問題在于采取此方案無法滿足教程需求,因為全部內(nèi)容都需要放在 Jupyter Notebook中,整體上就是將 pandas300題做成了在線版,而我想要的是一個網(wǎng)站。

并且使用Jupyterhub不可避免的要進行一些 docker 或 k8s 操作,這也不是我熟悉的領(lǐng)域,雖熱在這條思路上走了一段時間,但還是放棄了。

JupyterBook

之后又是一番檢索,但無非都是上面幾種方案,在我感覺要放棄做這個網(wǎng)站時,無意中發(fā)現(xiàn)一個項目JupyterBook

如何在網(wǎng)頁中執(zhí)行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

簡單來說,他可以將你的 Jupyter Notebook 轉(zhuǎn)換為 html 頁面(基于 sphinx),并且一個很重要的特點就是可以在線、交互式執(zhí)行代碼。

如何在網(wǎng)頁中執(zhí)行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

具體怎么實現(xiàn)的呢?首先需要將你的項目上傳到一個公共資源平臺binder,這個網(wǎng)站會為你的項目創(chuàng)建一個鏡像,這樣可以方便給不同用戶使用

如何在網(wǎng)頁中執(zhí)行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

簡單來說,可以理解為將你的 Jupyter Notebook 掛在這個網(wǎng)站,別人就能去在線執(zhí)行,但是很明顯,我們都需要跳轉(zhuǎn)到這個頁面去使用,而我希望在當前頁面執(zhí)行代碼。

這時就需要在使用另一個項目(Thebe

如何在網(wǎng)頁中執(zhí)行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

它使用JupyterLab API,通過加載一段JS代碼,再指定一個執(zhí)行后端(上面提到的binder),就可以在當前頁面執(zhí)行代碼。

聽起來很復雜,但是實現(xiàn)起來很簡單,上面我們說到,JupyterBook 是基于 Sphinx制作頁面的,所以只需要提前在配置 Sphinx時加載 sphinx_thebe插件即可,

如何在網(wǎng)頁中執(zhí)行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

至此,開頭我需求中的1、2就完美實現(xiàn)了,還剩最后一個問題就是如何讓用戶更少的執(zhí)行代碼?

如果你體驗過我的網(wǎng)站,你會發(fā)現(xiàn)執(zhí)行一個 pandas 操作連 import pandas as pd和讀取數(shù)據(jù)的操作都不用!

其實這些代碼在啟動jupyter notebook時就預先加載了,只需要在對應單元格上加上 thebe-init的 tag 即可。

當然,使用 JupyterBook 還是有很多坑,消耗我最多的時間就是在修改樣式上,默認的樣式如下,可能英文狀態(tài)下表現(xiàn)還行,但是到中文并不是很適配

如何在網(wǎng)頁中執(zhí)行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

為了大家不僅用的爽,我對網(wǎng)站顏值的要求也很高,于是爆改了幾千行的 css 和 js 代碼,甚至組件的位置都調(diào)整到小數(shù)點后兩位才讓我滿意,磕磕碰碰一個多月終于將整個網(wǎng)站做出來

最后,本文僅是對在線執(zhí)行代碼做了一個快速、不完整的總結(jié)。由于篇幅限制,還有很多搭建、部署網(wǎng)站細節(jié)的內(nèi)容沒有涉及到,如果你覺得不錯,歡迎點贊、轉(zhuǎn)發(fā)。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }