- Python全棧數(shù)據(jù)工程師養(yǎng)成攻略(視頻講解版)
- 張宏倫
- 2425字
- 2019-09-04 09:59:38
第1章 寫在前面
1.1 數(shù)據(jù)工程和編程語言

數(shù)據(jù)工程和編程語言
近年來大數(shù)據(jù)(BigData)的概念火得不行,之前流行的互聯(lián)網(wǎng)+,換成大數(shù)據(jù)+后又成就了一大批創(chuàng)業(yè)公司。政府部門對(duì)大數(shù)據(jù)戰(zhàn)略部署同樣重視,各種大數(shù)據(jù)產(chǎn)業(yè)園和科技區(qū)如雨后春筍般火熱發(fā)展。很多不同行業(yè)的人言必稱大數(shù)據(jù),時(shí)常把大數(shù)據(jù)時(shí)代的4個(gè)V和3種思維掛在嘴邊,但他們心里所說的和實(shí)際所做的,大多只是大數(shù)據(jù)領(lǐng)域上層應(yīng)用中的一個(gè)子集,即基于數(shù)據(jù)做一些統(tǒng)計(jì)、分析和展示,甚至很多時(shí)候數(shù)據(jù)并不滿足“大”的特征。
當(dāng)然,這本書的目的并不是探討大數(shù)據(jù)的知識(shí)體系和技術(shù)架構(gòu),而是從個(gè)人角度出發(fā),介紹如何在時(shí)間有限(可能你并不是大數(shù)據(jù)領(lǐng)域的專業(yè)從事人員)和資源有限(可能你只有一臺(tái)筆記本電腦可以運(yùn)行程序)的條件下,實(shí)現(xiàn)一些個(gè)人能力足以完成的、簡(jiǎn)單而有趣的數(shù)據(jù)工程和數(shù)據(jù)應(yīng)用。這本書的讀者可能已經(jīng)具備一定的編程基礎(chǔ),也有可能之前未曾接觸過任何代碼,在經(jīng)過恰當(dāng)?shù)膶W(xué)習(xí)和足夠的練習(xí)之后,都可以拿出自己的筆記本電腦,獨(dú)立實(shí)現(xiàn)讓人驚艷的數(shù)據(jù)成果和作品。
1.1.1 如何玩轉(zhuǎn)數(shù)據(jù)
在進(jìn)行一項(xiàng)數(shù)據(jù)工程之前,首先需要考慮并解決一些問題,想清楚這些問題的答案比直接擼起袖子寫代碼更為重要。
1.獲取
我們的數(shù)據(jù)從何而來?巧婦難為無米之炊,如果希望做出有價(jià)值、有意義的成果,所用數(shù)據(jù)的數(shù)量和質(zhì)量都應(yīng)得到保證。理想情況下自然是別人準(zhǔn)備好數(shù)據(jù)提供給我們,但現(xiàn)實(shí)情況往往是需要我們自己去獲取。如果不具備大規(guī)模部署傳感器和海量用戶上傳數(shù)據(jù)等采集數(shù)據(jù)的能力,那么通過爬蟲從已有網(wǎng)站上獲取結(jié)構(gòu)化數(shù)據(jù)則是唯一的解決途徑。因此需要考慮并解決的問題包括以下幾點(diǎn),我需要哪方面的數(shù)據(jù)?哪些網(wǎng)站已經(jīng)具備了這些數(shù)據(jù)?我需要從這些網(wǎng)站分別采集哪些數(shù)據(jù)?多大的數(shù)據(jù)量才能滿足我的需求?數(shù)據(jù)是一次獲取即可,還是需要持續(xù)更新?如果需要持續(xù)更新,應(yīng)當(dāng)達(dá)到怎樣的更新頻率?
2.存儲(chǔ)
我們需要把獲取的數(shù)據(jù)存儲(chǔ)下來,以便進(jìn)一步使用。不同的數(shù)據(jù)量和數(shù)據(jù)類型,可能適合于不同的存儲(chǔ)方案。對(duì)于數(shù)據(jù)量較少、后續(xù)處理較簡(jiǎn)單的情況,可以將數(shù)據(jù)存儲(chǔ)到靜態(tài)文件中,如txt、csv、json等格式文件。這種方法讀寫都十分方便,并且易于數(shù)據(jù)的復(fù)制和共享。對(duì)于數(shù)據(jù)量較大、后續(xù)處理較復(fù)雜的情況,可以將數(shù)據(jù)存儲(chǔ)到一些通用而且成熟的開源數(shù)據(jù)庫中,如MySQL、PostgreSQL等關(guān)系型數(shù)據(jù)庫,以及MongoDB、Neo4j等非關(guān)系型數(shù)據(jù)庫(NoSQL)。這種方法更為穩(wěn)定且易于維護(hù),支持?jǐn)?shù)據(jù)的Create、Update、Read、Delete等后續(xù)操作。如果有部署Web網(wǎng)站應(yīng)用的需求,那么將數(shù)據(jù)庫作為后端數(shù)據(jù)存儲(chǔ)則是更好的選擇。因此需要考慮并解決的問題包括:我有多大數(shù)據(jù)量需要存儲(chǔ)?后續(xù)處理是否復(fù)雜?數(shù)據(jù)是否會(huì)持續(xù)更新?我應(yīng)該選擇哪種數(shù)據(jù)存儲(chǔ)方案?
3.分析
在經(jīng)過必要的清洗工作之后,我們希望從數(shù)據(jù)中挖掘出感興趣的價(jià)值和結(jié)論。一方面可以進(jìn)行一些簡(jiǎn)單的計(jì)算匯總工作,從不同維度聚合出對(duì)應(yīng)的結(jié)果;另一方面也可以從統(tǒng)計(jì)學(xué)或機(jī)器學(xué)習(xí)的角度出發(fā),分析數(shù)據(jù)不同字段之間的關(guān)聯(lián),同時(shí)訓(xùn)練一些分類或聚類的模型,用以解決實(shí)際應(yīng)用問題。不同類型的數(shù)據(jù),如文本、數(shù)值和類別值等,所涉及的數(shù)據(jù)分析方法可能完全不同。因此需要考慮并解決的問題包括:我的數(shù)據(jù)屬于何種類型?我希望從數(shù)據(jù)中挖掘出哪些價(jià)值?我希望通過數(shù)據(jù)完成哪些任務(wù)?我應(yīng)當(dāng)選擇哪些分析技術(shù)和算法模型?
4.可視化
用數(shù)據(jù)可視化的方法表達(dá)和展示所得結(jié)論。正所謂一圖勝千言,枯燥的數(shù)據(jù)和蒼白的語言也許并不足以承載數(shù)據(jù)的價(jià)值,而借助圖形、色彩、布局等視覺元素則能更生動(dòng)、更豐富、更全面地詮釋數(shù)據(jù)的靈魂。我們既可以使用散點(diǎn)圖、折線圖、柱狀圖等經(jīng)典圖形,也可以大開腦洞去嘗試一些天馬行空的表達(dá)形式,充分探索組織圖形、色彩和布局等內(nèi)容的可能性。因此需要考慮并解決的問題包括:我需要展示哪些數(shù)據(jù)和結(jié)論?哪種圖形和表現(xiàn)形式最能滿足我的需求?可視化是選擇靜態(tài)圖片、交互網(wǎng)站,還是動(dòng)態(tài)視頻?
如果以上4個(gè)步驟的問題都已經(jīng)想清楚,那么恭喜你,可以按照你的想法開始玩轉(zhuǎn)數(shù)據(jù)了。通過獲取、存儲(chǔ)、分析和可視化,將原始數(shù)據(jù)逐步提升為信息、知識(shí)和價(jià)值,這便是玩轉(zhuǎn)數(shù)據(jù)最大的魅力和樂趣所在。
1.1.2 關(guān)于編程語言
哪種編程語言最好,最適合做數(shù)據(jù)工程?如果真要討論起來,這將是一個(gè)永遠(yuǎn)沒有結(jié)論的哲學(xué)問題。既然無法給這個(gè)問題一個(gè)合適的答案,不如將單選題變?yōu)槎噙x題,畢竟只學(xué)習(xí)一門語言可能遠(yuǎn)遠(yuǎn)不夠。以全棧數(shù)據(jù)工程師為目標(biāo),我們應(yīng)當(dāng)各方面內(nèi)容都有所涉足,同時(shí)具備自己最為擅長(zhǎng)和習(xí)慣使用的一至兩門語言。
C++和Java這兩門語言最好熟悉其一,從而了解編程語法的基本內(nèi)容和面向?qū)ο蟮木幊趟枷搿J煜さ囊笫侵覆挥猛耆莆蘸途ǎ谛枰玫降臅r(shí)候查一查,能夠快速回想起相關(guān)內(nèi)容即可。很多人會(huì)發(fā)現(xiàn),掌握一門語言之后,再去學(xué)其他語言便能很快上手,因?yàn)椴煌Z言之間的編程思想都是基本相通的。
Python是一門簡(jiǎn)單好用而且功能強(qiáng)大的語言,也是筆者使用最多、最為熟悉的一門語言。Python的強(qiáng)大之處在于其具備極為豐富的功能包,從前端到后端,從軟件到硬件,從機(jī)器學(xué)習(xí)到自然語言理解,幾乎無所不包、全棧通吃。同時(shí)對(duì)語法的約束和限制也沒有C++、Java那樣嚴(yán)格,因此非常適合新手學(xué)習(xí)。有一句經(jīng)典的玩笑話,“Python大法好,除了炒菜別的都可以干”。
R是一門統(tǒng)計(jì)分析語言,和Python類似,具有數(shù)量眾多且功能強(qiáng)大的包,以及龐大而活躍的用戶社區(qū)。近年來R的學(xué)習(xí)門檻和成本都在不斷降低,可以用于進(jìn)行專業(yè)的統(tǒng)計(jì)分析和圖形繪制,極力推薦同時(shí)掌握Python和R。
除此之外,還有和Web網(wǎng)站開發(fā)相關(guān)的一些語言,如前端的HTML、CSS和JavaScript,后端的PHP、NodeJS等。在這些語言的基礎(chǔ)上還衍生出了豐富的封裝和框架,便于用戶更快、更好地進(jìn)行開發(fā)。就像Python的功能包難以全部掌握一樣,和Web網(wǎng)站開發(fā)相關(guān)的封裝和框架更是難以全部熟悉。
筆者個(gè)人習(xí)慣于使用Python獲取數(shù)據(jù)并寫入文件或數(shù)據(jù)庫中,結(jié)合Python和R進(jìn)行數(shù)據(jù)分析和挖掘。至于數(shù)據(jù)可視化部分,則使用R繪制靜態(tài)圖形,基于Web網(wǎng)站實(shí)現(xiàn)動(dòng)態(tài)交互可視化。
本書的后續(xù)章節(jié)將以Python為主,完整地介紹如何進(jìn)行數(shù)據(jù)的獲取、存儲(chǔ)、分析和可視化,以個(gè)人能力獨(dú)立完成一些有趣的事情。
- CockroachDB權(quán)威指南
- Koa開發(fā):入門、進(jìn)階與實(shí)戰(zhàn)
- 單片機(jī)應(yīng)用技術(shù)
- 面向?qū)ο蟪绦蛟O(shè)計(jì)(Java版)
- Android開發(fā)三劍客:UML、模式與測(cè)試
- 玩轉(zhuǎn).NET Micro Framework移植:基于STM32F10x處理器
- 分布式架構(gòu)原理與實(shí)踐
- OpenCV Android開發(fā)實(shí)戰(zhàn)
- 深度學(xué)習(xí)程序設(shè)計(jì)實(shí)戰(zhàn)
- Software-Defined Networking with OpenFlow(Second Edition)
- JavaScript Concurrency
- LabVIEW入門與實(shí)戰(zhàn)開發(fā)100例(第4版)
- jQuery基礎(chǔ)教程(第4版)
- Testing Practitioner Handbook
- Clojure High Performance Programming