在過去的三年,開源社區(qū)和新技術(shù)的發(fā)展可謂日新月異,我希望試試?yán)米钚碌募夹g(shù)來幫助沒有數(shù)據(jù)科學(xué)背景的人也能夠輕松的進(jìn)行數(shù)據(jù)分析和預(yù)測,于是就有了dataplay3 。
架構(gòu)
老規(guī)矩,先上架構(gòu)圖:
為了構(gòu)建一個最簡單的開箱即用的數(shù)據(jù)分析平臺,我使用了如下的技術(shù)棧:
服務(wù)器端:
sanic 基于Python3的web服務(wù)器
pandas Python上最流行的數(shù)據(jù)分析庫
auto-sklearn 基于sklearn的自動機(jī)器學(xué)習(xí)庫
prophet 非死不可開源的時間序列分析庫
pandassql 能夠在Panda數(shù)據(jù)框上運(yùn)行SQL的庫
gunicorn 基于python的WSGI HTTP服務(wù)器
客戶端:
React 前端框架
Ant Design Pro 螞蟻開源的企業(yè)級應(yīng)用框架套裝
Ant Design
UmiJS
Dva
BizCharts 基于G2和React的可視化庫
G2 The Grammar of Graphics in JavaScript
功能
Dataplay3提供了數(shù)據(jù)分析的基本功能,希望盡可能的簡化用戶數(shù)據(jù)分析的復(fù)雜性。
基于Pandas的數(shù)據(jù)集管理
基于SQL和Pands的查詢
基于Grammar of Graphics的可視化
簡單的儀表盤
基于自動化機(jī)器學(xué)習(xí), 提供數(shù)值和分類數(shù)據(jù)的建模和預(yù)測
時間序列分析
這里上幾個功能截圖,具體功能請參考 https://gangtao.github.io/dataplay3/features
對架構(gòu)和功能的思考
前端
React毫無疑問非常流行,Vue同樣優(yōu)秀。我這里不想討論和比較。
對于React的前端棧而言,現(xiàn)在開發(fā)工具的過程都已經(jīng)非常成熟?;赗edux的狀態(tài)管理解決了前端狀態(tài)管理的大難題。但是即便如此,開發(fā)一個產(chǎn)品,無論是代碼量還是所花費(fèi)的時間來說,前端的工作都占據(jù)了開發(fā)的大頭。作為一個前端的開發(fā)人員,你需要了解:
最新的ES6的規(guī)范 推薦https://es6.ruanyifeng.com/
React和redux
使用webpack打包你的應(yīng)用
使用Less擴(kuò)充你的css
瀏覽器的知識
... ...
為了更容易上手,我選擇使用了螞蟻開源的 Ant Design Pro,用框架的好處是你不需要太多的設(shè)計(jì),基本的模式照著用就好了,缺點(diǎn)呢,就是有些功能框架包裝的太多,你想實(shí)現(xiàn)一些自己想要的功能呢就比計(jì)較困難。所以對于用不用框架,取決于你對于代碼希望掌控的程度。
Ant Design Pro構(gòu)建于:
UmiJS 中文可發(fā)音為烏米,是一個可插拔的企業(yè)級 react 應(yīng)用框架。umi 以路由為基礎(chǔ)的,支持類 next.js 的約定式路由,以及各種進(jìn)階的路由功能,并以此進(jìn)行功能擴(kuò)展,比如支持路由級的按需加載。然后配以完善的插件體系,覆蓋從源碼到構(gòu)建產(chǎn)物的每個生命周期,支持各種功能擴(kuò)展和業(yè)務(wù)需求,目前內(nèi)外部加起來已有 50 的插件。
Dva 基于 redux、redux-saga 和 react-router 的輕量級前端框架。
我個人比較喜歡的Ant Design Pro的功能是測試這一塊,通過mock服務(wù)器請求,前后端的開發(fā)可以分離,這個很方便。基于Rest API的前端開發(fā)的過程基本如下:
定義REST API
在前端實(shí)現(xiàn)REST API調(diào)用的異步請求,(利用Axios HTTP request)
實(shí)現(xiàn)前端的接口Mock
定義頁面對應(yīng)的模型Model,并實(shí)現(xiàn)狀態(tài)的管理
綁定模型到頁面,實(shí)現(xiàn)頁面功能
可視化
Dataplay2使用echart作為可視化庫,而Dataplay3使用了螞蟻的G2,在我的前一篇博文中我就提到:
Baidu的echart是非常優(yōu)秀的可視化庫,可是用于數(shù)據(jù)探索時,還不夠好。希望能有一套類似ggplot的前端可視化庫來使用。
令人高興的是,這個類似ggplot的前端可視化庫已經(jīng)有了,它就是螞蟻的G2。這里我要稱贊一下我的北郵校友林峰,他同時也是echart的作者。他領(lǐng)導(dǎo)的團(tuán)隊(duì)開發(fā)出了世界領(lǐng)先的可視化庫,G2是其中之一。我認(rèn)為G2已經(jīng)超越了echart,希望他們能夠越做越好!
作為語法驅(qū)動的圖形,對于用戶的使用是一個挑戰(zhàn),所以,在Dataplay3中同時提供了基于圖標(biāo)類型的可視化。
利用圖形語法,新的圖表類型可以用一個配置項(xiàng)來擴(kuò)展,例如,對于Area chart的配置如下:
現(xiàn)在Dataplay3支持的圖形種類還不多,后面,我可能會加入更多的類型。
后端
對于后端Python應(yīng)用來說,全面擁抱Python3是必然選擇。對于Web服務(wù),Sanic是一個不錯的選擇,它基本繼承了Flask的所有優(yōu)點(diǎn),但是提供了Async的支持,能夠提供能好的服務(wù)性能,當(dāng)然選擇一個新的框架必然有風(fēng)險(xiǎn)。參考這篇文章,Sanic 的若干吐槽
Dataplay3仍然使用REST API而沒有使用最新很流行的Graphql, 對于這個選擇,大家也可以根據(jù)自己的應(yīng)用來做決定??梢詤⒖糋raphQL vs. REST
機(jī)器學(xué)習(xí)
因?yàn)橄M@是一款小白也能使用的數(shù)據(jù)分析工具,我希望提供的預(yù)測功能越簡單越好,利用Auto-SKlearn,我們把機(jī)器學(xué)習(xí)的建模過程變得非常簡單。用戶只需要選擇用于建模的數(shù)據(jù),特征和目標(biāo)就好了。用戶不需要選擇應(yīng)用什么類型的算法,如果構(gòu)建數(shù)據(jù)流水線,如何預(yù)處理數(shù)據(jù),以及如果ensemb模型。唯一要考慮的是能夠付出多少資源(時間,CPU,內(nèi)存)來構(gòu)建模型。
Auto-Sklearn的主要功能是:
利用元學(xué)習(xí)來選擇算法的流水線
利用貝葉斯優(yōu)化來選擇參數(shù)
利用ensemble來構(gòu)建復(fù)合的模型。
對于另一種常見的數(shù)據(jù)分析類型的時間序列,我選擇了facebook開源的Prophet,(基于pystan構(gòu)建)
Dataplay3還沒有實(shí)現(xiàn)模型部署的功能,以后可能會考慮。
從全棧工程師到全生命周期工程師
因?yàn)楦嗟膽?yīng)用已經(jīng)遷移到云或者在遷移到云的過程中,對于軟件工程師而言,全棧已經(jīng)不足以滿足要求,現(xiàn)在需要的是全生命周期工程師,工程師不但要覆蓋前后端的代碼實(shí)現(xiàn)和測試,而且要參與軟件生命周期的每一個部分,尤其是DevOps。
以Dataplay3為例,我需要做的事包括:
思考我想要解決什么問題,面向什么用戶 -》 產(chǎn)品定義
設(shè)計(jì)軟件架構(gòu) -》架構(gòu)階段
前后端的代碼設(shè)計(jì),選型 -》 設(shè)計(jì)階段
前后端的實(shí)現(xiàn)和測試 -》 實(shí)現(xiàn)階段
持續(xù)集成和部署 -》 CICD
部署后的運(yùn)營和監(jiān)控 , 產(chǎn)品的市場宣傳 (例如我正在寫的這篇文章)-》 運(yùn)營階段
這里,我主要講一下CICD。DevOps和CICD在現(xiàn)在的軟件生命周期中已經(jīng)占據(jù)非常重要的地位。這篇文章提供了不少CICD的項(xiàng)目。
在Dataplay3中,我使用
CICD codeship
Automated code reviews & code analytics, codeacy
Automated code reviews & code analytics, ebert
CICD的服務(wù)不少,開源項(xiàng)目最為流行的可能是Travis CI。另外gitlab也即成了很好的CICD的功能。codeship因?yàn)閾碛泻芎玫娜萜鞯墓δ?,也是一個很不錯的選擇。現(xiàn)在的dataplay3的CI之使用了codeship的基本功能??梢岳胏odeship的pro的功能,構(gòu)建更為強(qiáng)大的CICD。codeship對于開源項(xiàng)目提供每月100次build的免費(fèi)服務(wù),對于一些開發(fā)密度不是很大的項(xiàng)目來說應(yīng)該足夠用了。
codacy和ebert都是自動化的代碼分析工具,你只需要創(chuàng)建一個項(xiàng)目,連接到你的github項(xiàng)目,就可以在提交代碼或者合并PR的時候進(jìn)行自動的代碼分析,這個一般是可以在CI中實(shí)現(xiàn)的,使用這些服務(wù)可以然你更容易的了解你的代碼的質(zhì)量變化。
總結(jié)
如果說dataplay只是一些很原始的想法,dataplay2最多算是一個原型,那么dataplay3應(yīng)該是一個還算勉強(qiáng)可用的工具了,當(dāng)然它現(xiàn)在還很簡單,可能有很多的bug和問題,我也希望能慢慢地改進(jìn)。
對于三年前的一些想法,Dataplay3也做出了回應(yīng)
可視化庫
Baidu的echart是非常優(yōu)秀的可視化庫,可是用于數(shù)據(jù)探索時,還不夠好。希望能有一套類似ggplot的前端可視化庫來使用。另外地圖功能和層級化的圖表也是數(shù)據(jù)分析常見的功能。
還需要加入圖表的選項(xiàng)
儀表盤功能
這個版本的dataplay沒有儀表盤功能,這個功能是數(shù)據(jù)分析軟件的標(biāo)配,必須有。pyxley似乎是個不錯的選擇,也和dataplay的架構(gòu)一致(python,reactjs),有時間可以嘗試一下
機(jī)器學(xué)習(xí)和預(yù)測
dataplay現(xiàn)在實(shí)現(xiàn)了最簡單的一些機(jī)器學(xué)習(xí)的算法,我覺得方向應(yīng)該是面向用戶,變得更簡單,用戶只給出簡單的選項(xiàng),例如要預(yù)測的目標(biāo)屬性,和用于預(yù)測的屬性,然后自動的選擇算法。另外需要更方便的對算法進(jìn)行擴(kuò)展。
這要感謝開源作者們的無私奉獻(xiàn)。另外的一些功能呢,因?yàn)楸救司τ邢?,只能抽空慢慢的?shí)現(xiàn),如果有對數(shù)據(jù)科學(xué),開源應(yīng)用有興趣的小伙伴,也歡迎給我提意見,提PR,報(bào)Bug。