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

熱線電話:13121318867

登錄
首頁精彩閱讀用SQL思考VS用Python思考
用SQL思考VS用Python思考
2017-06-23
收藏

SQL思考VS用Python思考

多年來,我已經(jīng)使用過各種語言和工具來分析數(shù)據(jù),當(dāng)我回想起我使用每一個(gè)工具的時(shí)候,我逐漸意識到為了解決分析問題,每一個(gè)工具鼓勵(lì)使用不同的思路框架。意識到這些框架對性能的提升和掌握一門新的語言或工具的技術(shù)特征同樣重要。

我第一次接觸到數(shù)據(jù)分析大約十年前作為一名大學(xué)生(盡管我的時(shí)間都花在了研究棒球票的背面)在學(xué)校里,以及后來作為一個(gè)經(jīng)濟(jì)學(xué)研究員,我曾幾乎只用兩個(gè)工具,Excel和R就能良好運(yùn)行來自政府?dāng)?shù)據(jù)門戶或?qū)W術(shù)來源下載的CSV或Excel文件。

但我開始專注于商業(yè)分析的新工作時(shí),我被扔到一個(gè)全新的世界。我需要的絕大多數(shù)數(shù)據(jù)存儲在數(shù)據(jù)庫中。SQL成了一個(gè)必要的接入點(diǎn)。

首先,采用了新的工具,是具有挑戰(zhàn)性的。不僅有一個(gè)學(xué)習(xí)曲線要與之抗衡,也覺得SQL有限制。我習(xí)慣了R的簡便統(tǒng)計(jì)測試,可訪問的繪圖庫和靈活的數(shù)據(jù)結(jié)構(gòu)。在SQL中,即便是畫一個(gè)柱狀圖這樣簡單的事,也需要一個(gè)完整的博客帖子來學(xué)習(xí)。

有一段時(shí)間,我通過修補(bǔ)工具保持這種靈活,并把查詢結(jié)果導(dǎo)入RStudio。

從我SQL客戶端跳轉(zhuǎn)到R客戶端,使得所有工作整合到一起變得困難。下載查詢結(jié)果,并將其重新導(dǎo)入到R的痛苦使我的工作變成線性的-從SQL轉(zhuǎn)換為R, 并且不會再轉(zhuǎn)化回來。如果我想添加一個(gè)分析,我第一想法通常是,“也許我能找到一種方法處理而且僅僅依賴我已經(jīng)有的數(shù)據(jù)。”知道這是從前在R中我的感受,我會在一個(gè)查詢中加入很多我一開始不需要的數(shù)據(jù)。我找到答案很慢,而且往往留下未發(fā)掘的有問題的行。

隨著時(shí)間的推移,當(dāng)我對SQL越熟練  ,我開始體會到它的好處。它的嚴(yán)格有力推動(dòng)一致性,這對標(biāo)準(zhǔn)化的業(yè)務(wù)指標(biāo)是有價(jià)值的。計(jì)數(shù)和簡單的聚合,是SQL所擅長的,影響商業(yè)決策往往是足夠了。最后,我發(fā)現(xiàn)自己在我的工作流程中放棄了R??紤]到SQL到-R的工作流程是如何支離破碎的,R的靈活性是抵消不了SQL到R的轉(zhuǎn)換代價(jià)。而當(dāng)我真的錯(cuò)過了一些東西在R,我經(jīng)常會找到一個(gè)繁瑣的解決方法,通常能使任務(wù)完成。

當(dāng)模式團(tuán)隊(duì)開始工作整合Python Notebooks和我們的SQL編輯器時(shí),我被拉回使用腳本語言來分析。不過這一次,切換工具的痛苦得到減輕—操作情況是把SQL結(jié)果傳遞給Python沒有任何導(dǎo)入或輸出。突然感覺就像另一個(gè)世界再次打開。

但隨之而來的,仍然是另一種思考方法和一種新的思維框架要學(xué)習(xí)。而這個(gè)新的工作流程的好處是,這在很大程度上為我SQL至R工作流程轉(zhuǎn)換提供了沒有代價(jià)的好處,使這種轉(zhuǎn)換顯然是值得的,還有我以前知道的一些事會變得容易得多。

不用知道SQL所有的知識是可以的

SQL是一個(gè)相當(dāng)有限的語言。查詢幾乎只使用一些組合聯(lián)接,聚合函數(shù),子查詢和窗口功能。

這就像建造的東西需要一組基本的積木塊。我可以創(chuàng)造驚人的,復(fù)雜的,和原創(chuàng)的東西,但我很少發(fā)現(xiàn)有些積木塊, 我有, 但是我我從來不知道。

Python,相比之下,就像是一個(gè)專門的積木塊組的集合。每個(gè)庫都有自己定制的塊為建設(shè)某事非常專門化:Seaborn負(fù)責(zé)視覺效果,pandas進(jìn)行分析,scikit-learn用于機(jī)器學(xué)習(xí),等等。

這些庫添加了非常多的功能。幾十行的SQL(或者一點(diǎn)都不能),現(xiàn)在只需要一個(gè)Python的方法。但是,這個(gè)方法做了什么我就不完全清楚了。通過SQL,如果我沿某種路徑操作失靈,我可能發(fā)現(xiàn)一個(gè)更好的方式來重新安排我正在做的。在Python,相比于修改我調(diào)用的方法, 我更可能是去尋找一個(gè)新的方法.

去谷歌上查詢

“ Python社區(qū) ”,是一個(gè)龐大而蓬勃發(fā)展的群體, 這個(gè)群體產(chǎn)生了這些專門的塊。而“ SQL社區(qū)”是......微軟和甲骨文的SEO素材。造成這種情況的原因尚有爭議,但效果是明顯的,在網(wǎng)上找到真正支持Python的資源相對更容易。

或許更重要的是,Python中的結(jié)構(gòu)適合在該SQL斗爭方式發(fā)現(xiàn)答案。因?yàn)镻ython有更多的塊,從它工作的數(shù)據(jù)來看,它傾向于更抽象。人們可以輕松地共享庫和腳本塊。有人分享了如何創(chuàng)建一個(gè)箱線圖例子并可以提供的代碼,并說:“在這里傳入你的數(shù)據(jù)?!蔽铱梢杂蔑w行數(shù)據(jù)集,應(yīng)用pandas.boxplot()方法去學(xué)習(xí)如何創(chuàng)建箱線圖,然后轉(zhuǎn)身使用.boxplot()為其他應(yīng)用程序的用戶數(shù)據(jù)畫箱線圖。

SQL查詢,在另一方面,緊密與數(shù)據(jù)聯(lián)系在一起。我必須知道表和列名稱對查詢可以產(chǎn)生任何意義。這往往會使共享例子更難。向一個(gè)人展示如何做一個(gè)箱線圖用SQL需要共享數(shù)據(jù)才會有意義,這有可能使人們更不愿意分享自己的工作。

包容黑盒子

給我足夠的時(shí)間,我可以理解一個(gè)SQL查詢在做什么。因?yàn)樗械膲K通常是熟悉的,因?yàn)椴樵兪亲园膶?shí)體不能把工作外包給外部庫,我可以把全范圍查詢最終拼湊在一起和“獲取”它。

創(chuàng)建或查看一個(gè)Python notebook的時(shí)候,有時(shí)我必須承認(rèn),我永遠(yuǎn)也不會完全知道發(fā)生了什么。要了解一個(gè)SciPy的功能,例如,我必須仔細(xì)查閱一大堆文件或多層源代碼。實(shí)際上,我根本不會這樣做。相反,我更經(jīng)常發(fā)現(xiàn)操作像試一試,插入,看看他們返回結(jié)果是否符合我的要求。

不足之處是有如此大量的社區(qū)資源和庫。對Python沒有什么必然不妥的(并且它不像任何人,真正的,充分理解地球上分組依據(jù)什么),但對Python,我常常發(fā)現(xiàn)自己更傾向于相信結(jié)果是對的,尤其是在技術(shù)文檔比代碼本身更難理解的情況下。

創(chuàng)建分析網(wǎng)

SQL工作時(shí),查詢常常呈線性發(fā)展。我主要使用SQL從大型數(shù)據(jù)集進(jìn)行數(shù)據(jù)的聚合和聯(lián)接設(shè)置這樣一個(gè)流程:

1.把一堆表格聯(lián)接一起。

2.把數(shù)據(jù)聚合成更小。

3.加入更多的表。

4.再次聚合。

5.依此類推,直到我能得到一個(gè)產(chǎn)生12行數(shù)據(jù)的巨型查詢。

雖然這些查詢可能會很長,他們往往在心里并不難模仿—數(shù)據(jù)通過子查詢線性移動(dòng)。數(shù)據(jù)就像一個(gè)雪球往下坡滾,隨著它的運(yùn)行,它運(yùn)行收集和壓縮更多的表,它一直滾動(dòng),直到它轉(zhuǎn)變成成一個(gè)完美的雪球(或產(chǎn)生災(zāi)難性的雪崩)。

Python進(jìn)展更加流暢。我經(jīng)常采用一個(gè)初始數(shù)據(jù)集,并將其分解成許多較小的數(shù)據(jù)集,并且每個(gè)成為分析的線程。我可以把這些線程結(jié)合一起,并且以不同的方式將它們拆開。

這要求我在心里模仿我的分析像一個(gè)分析網(wǎng)一樣,這是很難的事情。我不能再想,“我最左邊表格是什么?我該怎么聯(lián)接它?“相反,我不得不思考,”什么是分割成許多視圖的最好表?我怎樣才能把這些視圖融合到有用的某事中?“與Python的“塊”的例子相對應(yīng),“網(wǎng)”的思考方式提供比SQL更寬松的框架,它可能讓習(xí)慣了嚴(yán)格思維的人感到一點(diǎn)不適。

急速改變

SQL的線性性質(zhì)意味著,如果我想將一些透視圖添加到我的分析,最好在一開始引進(jìn),不然我不得不備份我的查詢,然后總是放棄傳遞的結(jié)果。這是麻煩的,即使它是通過幾層子查詢來添加列一樣簡單。

在其他情況下,從一個(gè)基礎(chǔ)的查詢出發(fā)計(jì)算多個(gè)目標(biāo)時(shí), 需要?jiǎng)?chuàng)建一個(gè)多個(gè)目標(biāo)的核心查詢。這些獨(dú)立的查詢以后會變得難以合并,這使得一些通用的修改我必須盡早進(jìn)行,否則后期我就要在每一個(gè)查詢中都修改一遍。

Python的Web-based的工作流的好處是,我可以更輕松地快速改變,迭代更快。東西在不同點(diǎn)可以添加和刪除,當(dāng)它們出現(xiàn)在相同的工作流程,能讓我去探究問題。由于每個(gè)分析探索可以指向相同的核心,它更自然地在不同的分析點(diǎn)之間移動(dòng)。

此外,通常情況下,它只是運(yùn)算速度更快。沒有什么事比只寫一個(gè)長時(shí)間運(yùn)行的SQL查詢僅僅為了找到我想要把一個(gè)附加列添加到最外面的查詢更令人沮喪了。Python允許我直接把這個(gè)改變應(yīng)用到最后一步,而不必通過每次重新運(yùn)行整個(gè)操作。

歡迎改變

最終,我在此過渡期間面臨的最大障礙是慣性。SQL是我的安全默認(rèn)值。即使SQL查詢比同等的Python腳本慢十倍,我已經(jīng)理解的方式,感覺更容易做到這一點(diǎn)。學(xué)習(xí)是比打字困難。

但是堅(jiān)持你知道什么是小事精明,大事糊涂。學(xué)習(xí)一門新的語言,不僅提供了新的工具,同時(shí)也開辟了在精神上來思考數(shù)據(jù)和分析模型新穎的方式。這可能會導(dǎo)致你提出和回答你從來沒有考慮過的問題。


數(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(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) 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){ //倒計(jì)時(shí)完成 $(".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); }