使用 Plotly 的 Dash 、 RAPIDS 和 Data shader ,用戶可以構(gòu)建 viz 儀表板,既可以呈現(xiàn) 3 億多行的數(shù)據(jù)集,又可以保持高度的交互性,而無需預(yù)先計算聚合。
使用 RAPIDS cuDF 和 Plotly Dash 在 GPU 上進(jìn)行實時交互式可視化分析
Dash 是來自 Plotly 的一個開源框架,用于使用 Python 構(gòu)建基于 web 應(yīng)用程序的交互式儀表板。此外,開放源碼軟件( OSS )庫的 RAPIDS 套件提供了完全在 GPU 上執(zhí)行端到端數(shù)據(jù)科學(xué)和分析管道的自由。將這兩個項目結(jié)合起來,即使在單個 GPU 上,也可以實現(xiàn)對數(shù)千兆字節(jié)數(shù)據(jù)集的實時、交互式可視化分析。
此人口普查可視化使用 dashapi 生成圖表及其回調(diào)函數(shù)。相反, RAPIDS cuDF 被用來加速這些回調(diào),以實現(xiàn)實時聚合和查詢操作。
使用 2010 年人口普查數(shù)據(jù)的修改版本,結(jié)合 2006-2010 年美國社區(qū)調(diào)查數(shù)據(jù)(獲得了 fantastic IPUMS.org 的許可),我們將 美國的每一個人 映射到位于相當(dāng)于一個城市街區(qū)的單個點(隨機(jī))。因此,每個人都有與之相關(guān)聯(lián)的獨特的人口統(tǒng)計屬性,這些屬性支持以前不可能的細(xì)粒度過濾和數(shù)據(jù)發(fā)現(xiàn)。我們的 GitHub 上公開了代碼、安裝細(xì)節(jié)和數(shù)據(jù)警告。
第 1 部分:可視化的數(shù)據(jù)準(zhǔn)備
雖然不是最新的數(shù)據(jù)集,但我們選擇使用 2010 年人口普查,因為它具有高地理空間分辨率、大尺寸和可用性。經(jīng)過一些修改, 3.08 億行× 7 列( int8 型) 的最終數(shù)據(jù)集足夠大,足以說明 GPU 加速的好處。
Census 2010 SF1 +形狀文件數(shù)據(jù)
我們決定把重點放在人口普查數(shù)據(jù)集上;最明顯的選擇是搜索 census.gov 網(wǎng)站,其中包括許多表格文件供下載。最適用的概要文件 1 有一個人口計數(shù)部分,其屬性包括性別、年齡、種族等。但是,該數(shù)據(jù)集是按 普查區(qū)水平 列表的,而不是按單個級別(出于各種隱私原因)。結(jié)果是 只有 211267 排, 每個街區(qū)一個,包括性別、年齡、種族。
我們選擇使用人口普查塊邊界形狀文件來擴(kuò)展行計數(shù),以使所有塊的人口計數(shù)相等。然后,在邊界內(nèi)隨機(jī)分配一個 lat long ,并為每個人創(chuàng)建一個唯一的行。為每個狀態(tài)執(zhí)行此操作的腳本可以在 Plotly-dash-rapids-census-demo 中找到。切換到由 IPUMS NHGIS 站點上的 數(shù)據(jù)查找工具 提供的更為用戶友好的數(shù)據(jù)集文件( SF1 和 tiger 邊界文件)可以加快這個過程。
在整個數(shù)據(jù)挖掘過程中,除了重復(fù)檢查每個匹配塊的聚合外,我們還使用我們自己的 cuxfilter 進(jìn)行快速原型制作和視覺精度檢查。在本例中,為 3.08 億行創(chuàng)建一個交互式地理散點圖非常簡單:
import cuxfilter
import cudf
df = cudf.read_parquet(‘。/data/census_data.parquet/*’)
#create cuxfilter dataframe
cux_df = cuxfilter.DataFrame.from_dataframe(df)
chart0 = cuxfilter.charts.scatter_geo(x=‘x’, y=‘y’)
chart1 = cuxfilter.charts.bar(‘a(chǎn)ge’)
chart2 = cuxfilter.charts.bar(‘sex’)
d = cux_df.dashboard([chart0, chart1, chart2], layout=cuxfilter.layouts.feature_and_double_base
)
d.show()

圖 1 : Cuxfilter census dashboard ver 。 1
ACS 2006 – 2010 數(shù)據(jù)
出于好奇,我們是否可以結(jié)合其他有趣的屬性進(jìn)行交叉篩選,例如收入、教育程度和工人階級,我們添加了 5 年的 2006-2010 年美國社區(qū)調(diào)查( ACS )數(shù)據(jù)集。該數(shù)據(jù)集在普查區(qū)塊組上聚合(比普查區(qū)塊大一級)。因此,我們決定在塊組上進(jìn)行聚合,并將其任意分布到每個個體上,同時仍保持塊組級別的聚合值。修改后的數(shù)據(jù)集包括:
按年齡劃分的性別。
按教育程度分列的 25 歲及以上人口的性別。
16 歲及以上人口過去 12 個月收入(按 2010 年通貨膨脹調(diào)整后的美元計算)的性別。
按工人階級分列的 16 歲及以上平民就業(yè)人口的性別。
公共列是 Sex ,用于合并所有數(shù)據(jù)集。然而,雖然這種方法提供了其他有趣的屬性來進(jìn)行過濾,但結(jié)果有幾個注意事項:
在地理位置或單個列上進(jìn)行交叉過濾將為所有其他列生成準(zhǔn)確的計數(shù)。
同時交叉過濾多個非地理列不一定會產(chǎn)生真實的計數(shù)。
與個人相關(guān)的屬性只是統(tǒng)計性的,不能反映真實的人。但是,當(dāng)匯總到人口普查區(qū)塊組級別或更高級別時,它們是準(zhǔn)確的。
執(zhí)行該過程的筆記本可以在 plotly-dash-rapids-census-demo 上找到。最終的數(shù)據(jù)集如下所示:

圖 2 :最終普查數(shù)據(jù)集的 Dataframe 視圖。
下面是一個用于驗證數(shù)據(jù)集值的快速 cuxfilter 儀表板:
import cuxfilter
import cudf
df = cudf.read_parquet(‘。/data/census_data.parquet/*’)
#create cuxfilter dataframe
cux_df = cuxfilter.DataFrame.from_dataframe(df)
#declare charts
chart0 = cuxfilter.charts.scatter_geo(x=‘x’, y=‘y’)
chart1 = cuxfilter.charts.bar(‘a(chǎn)ge’)
chart2 = cuxfilter.charts.bar(‘sex’)
chart3 = cuxfilter.charts.bar(‘cow’)
chart4 = cuxfilter.charts.bar(‘income’)
chart5 = cuxfilter.charts.bar(‘education’)
d = cux_df.dashboard(
[chart0, chart1, chart2, chart3, chart4, chart5],
layout=cuxfilter.layouts.feature_and_five_edge,
)
d.show()

圖 3 : Cuxfilter census dashboard ver 。 2 。
資源鏈接:
最終修改數(shù)據(jù)集 (~ 2 。 9 GB 焦油拼花文件)
所有數(shù)據(jù)準(zhǔn)備代碼 ( GitHub )
第 2 部分:使用 Plotly Dash 構(gòu)建交互式儀表板
Dash 支持在儀表板中添加單獨的 Plotly chart 對象,以及使用 Python 為每個對象圖形、選擇和布局單獨回調(diào)。例如,儀表板中基于上述數(shù)據(jù)集的圖表如下:
Scattermapbox :個體的種群分布
此圖表由兩層組成:
Scattermapbox 層。
Datashader 在上面生成了一個輸出圖像。
‘data’: [{
‘type’: ‘scattermapbox’,
‘lat’: lat, ‘lon’: lon,
}],
‘layout’: {
‘mapbox’: {
…
‘layers‘: [{
“sourcetype”: “image”,
“source”: datashader_output_img,
}],
}

圖 4 :美國人口的破折號數(shù)據(jù)陰影+地圖框聚集人口過剩計數(shù)。
圖表更新回調(diào)在以下位置觸發(fā):
“重新布局?jǐn)?shù)據(jù)”(向內(nèi)滾動、向外滾動、鼠標(biāo)平移)根據(jù)縮放級別重新渲染數(shù)據(jù)陰影圖像,以便分辨率保持不變。
下拉選擇“顏色依據(jù)”。
教育、收入、工人階級和年齡圖表的方框選擇。
地圖上的方框選擇。
條形圖:教育程度、收入、工人階級、年齡
‘data’: [
{‘type’: bar, ‘x’: Education, ‘y’: Count},
{‘type’: bar, ‘x’: Education, ‘y’: Count},
{‘type’: bar, ‘x’: Education, ‘y’: Count},
{‘type’: bar, ‘x’: Education, ‘y’: Count}
]

圖 5 :教育、收入、工人階級和年齡直方圖。
圖表更新回調(diào)在以下位置觸發(fā):
教育、收入、工人階級和年齡圖表的方框選擇。
地圖上的方框選擇。
下拉選擇“顏色依據(jù)”。
GPU 的適用范圍和幫助方式:
此儀表板中的每個圖表都從 GPU 加速到 cuDF :使用 GPU – 加速模式,在 24GB NVIDIA Titan NVIDIA RTX 上進(jìn)行過濾或縮放交互通常需要 0.2 – 2 秒。在高端 CPU 和 64GB 系統(tǒng)內(nèi)存上運行,相同的交互通常需要 10-80 秒。通常, cuDF GPU 模式比 pandas CPU 模式快 20 倍以上 根據(jù)圖表。 20 倍的不同之處在于將報表儀表板轉(zhuǎn)換為交互式可視分析應(yīng)用程序。
數(shù)據(jù)可視化是一個迭代設(shè)計過程
盡管像人口普查中這樣一個記錄良好且可用的數(shù)據(jù)集,但了解這些數(shù)據(jù)并制定一個 viz 來有效地與之交互似乎總是比對數(shù)據(jù)集 MIG 的任何初步研究都要花費更長的時間。
與所有數(shù)據(jù)可視化一樣,最終結(jié)果通常取決于在可用的數(shù)據(jù)和圖表、您試圖傳達(dá)的故事以及您正在通過的媒介(和硬件)之間找到適當(dāng)?shù)钠胶?。例如,我們對列格式進(jìn)行了多次迭代,以確保 GPU 的使用可靠地保持在 24GB 單個 GPU 限制之下,同時仍然允許多個圖表之間的平滑交互。
處理數(shù)據(jù)是復(fù)雜的,而處理大型數(shù)據(jù)集則更為復(fù)雜,但通過將 Plotly Dash 與 RAPIDS 相結(jié)合,我們可以提高分析師和數(shù)據(jù)科學(xué)家的能力。這些庫允許用戶在熟悉的環(huán)境中工作,并生成更大、更快、更具交互性的可視化應(yīng)用程序,為開箱即用的生產(chǎn)做好準(zhǔn)備—將傳統(tǒng)可視化分析的邊界推向高性能計算領(lǐng)域。
關(guān)于作者
Ajay Thorve 是 NVIDIA 的軟件工程師, RAPIDS 組織的可視化團(tuán)隊的一部分。 Ajay 的背景是全棧開發(fā)和數(shù)據(jù)科學(xué),主要興趣包括 JavaScript / TypeScript 和 Python 。目前, Ajay 在 RAPIDS viz 團(tuán)隊的工作主要集中在為 cuXfilter 和 node- RAPIDS 項目做出貢獻(xiàn)。
審核編輯:郭婷
-
python
+關(guān)注
關(guān)注
58文章
4889瀏覽量
90328 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1240瀏覽量
26262
發(fā)布評論請先 登錄
S32K系列引導(dǎo)加載程序應(yīng)用程序跨不同定制電路板設(shè)計的跳轉(zhuǎn)問題求解
構(gòu)建示例應(yīng)用程序MCSPTR2AK396的問題求解
如何構(gòu)建藍(lán)牙應(yīng)用程序?
Python運行本地Web服務(wù)并實現(xiàn)遠(yuǎn)程訪問
思必馳助力智元精靈G2重新定義工業(yè)級交互式具身作業(yè)機(jī)器人
AMD Alveo MA35D加速器:開啟大規(guī)模交互式流媒體新時代
【EASY EAI Nano-TB(RV1126B)開發(fā)板試用】命令行功能測試-紅綠燈按鈕項目-Python實現(xiàn)簡單的Web服務(wù)器
河南移動攜手華為完成交互式UE Logo全球首呼
Nuvoton ChipCorder在汽車儀表板中的應(yīng)用
如何使用 CyCloneTCP 和 FreeRTOS 在 NuMaker IoT 板上構(gòu)建 Web 服務(wù)器?
如何使用 Mbed OS 在 NuMaker IoT 板上構(gòu)建 Web 服務(wù)器?
如何使用 SEGGER emWin AppWizard 工具為儀表板界面設(shè)計圖形用戶界面?
OBOO鷗柏丨AI室外觸摸屏查詢一體機(jī)戶外交互式觸控終端信息發(fā)布大屏招投標(biāo)標(biāo)底參數(shù)要求
使用Python構(gòu)建基于web應(yīng)用程序的交互式儀表板
評論