1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        PowerBI 全網(wǎng)首發(fā)原生平滑曲線 - 通用模板及應用

        共 1610字,需瀏覽 4分鐘

         ·

        2021-01-30 23:41

        書接上回,我們研究了折線如何變成曲線,如下:

        并得到了最終的終極方案:

        它滿足了:

        • 足夠簡單

        • 連續(xù)光滑

        • 性能夠好

        那么問題來了:

        • 要單獨構建兩個輔助表

        • 是否可以讓 X 軸不顯示序號而是真實信息

        也就是通用化問題。

        答案是非??隙ǖ摹?/p>

        效果

        我們都知道,在給出年月計算新老客戶以及活躍用戶數(shù)是相對比較復雜的計算,我們來看看最終效果:

        這個效果完全滿足了需求。

        請觀察幾個點:

        • 2017年01月,活躍用戶由純新用戶供應49人,老用戶0人。

        • 2017年11月,活躍用戶50人,分別對應新用戶21人與老用戶29人。

        • 2019年05月,活躍用戶100人,分別對應新用戶13人與老用戶87人。

        • 2019年07月,活躍用戶35人,新用戶0人,完全由老用戶供應。

        整套曲線的顯示很完美。

        再觀賞坐標軸,圖例,曲線顏色,標簽,標簽背景顏色都完美配合。

        這的確實現(xiàn)了想要的一切,這套曲線是連續(xù)光滑的,避免了折線圖的生硬。

        如果是折線圖,會是這樣:

        不對比不知道,一對比,就看出平滑曲線的優(yōu)雅了。

        上文有伙伴留言:

        • Excel 里點一下就好了

        • Tableau 里點一下就好了

        沒有錯。

        這兩句話是用來懟BI佐羅好還是用來懟PowerBI產(chǎn)品組好呢?

        明明是 PowerBI 產(chǎn)品組應該做的事,偏偏不做,把時間用來研究 PowerBI 的logo不叫l(wèi)ogo叫Icon這種問題,而 BI佐羅 只能通過這么間接的方法來彌補了 PowerBI 的硬傷,反而撈不到什么好。一定要注意:這是 PowerBI 的問題。

        那么我們這么做有意義嗎?有的。

        處于學習 PowerBI 尤其是 DAX 的階段,這樣的問題的解決可以極度提升個人的 DAX 以及 PowerBI 能力,而不是曲線問題本身。

        很多人學習 PowerBI 以及學習 DAX,可以在這些問題中得以思考并實現(xiàn)是很有價值的。

        最重要的是,本文要從根本上給出通用方法。

        通用實現(xiàn)

        一個問題的解決,并不是最難的,最難的在于:

        • 通用化和可擴展化,適用于所有場景

        • 以更高的性能運行與折線圖不應該有任何性能差異

        這兩點居然被完美地解決了。

        首先,來看方法的通用化。

        如果我們的 X 軸是 0,1,2,...,N,那么,我們只需要這么做:

        將 X 軸演化為:0.01,0.02,....1.00,1.01,1.02,...,2.00,2.01,2.02,...,3.00,4.00,...,N.00 即可。這樣 X 軸就以10倍或者20倍拉伸除了更多的點。我們只要在這些點計算出值,并用純折線圖連接,由于點很多,看著就是平滑的曲線了。

        但是,如果我們的 X 軸是年,月,甚至是年,月的層級怎么辦?

        如果您學習過《BI真經(jīng)》就可以知道我們可以創(chuàng)建一個定制 X 軸,并保留年月層級同時做到擴大20倍,如下所示:

        可以看出:

        • 2017-01 的 X 是 0,而有 0.00 到 0.95 間隔 0.05 步長的 20 個點

        • X 和 X' 與該維度融合,無需另外制作

        將這兩個特定整合到一起真的太強大了,也就意味著:

        當且僅當需要為某個折線圖定制它的光滑曲線版本時,才進行僅一次維度定制即可。

        接著,維度定制的方法存在通用性嗎?

        答案是肯定的。其通用算法如下:

        Smooth.X.CRM.Date = 

        VAR _base =

        VAR _last = EOMONTH( [Start:Date.LastDate.All] , -1 )
        RETURN
        CALCULATETABLE(
        SUMMARIZE( 'Calendar' , [YearNumber] , [MonthNumber] ),
        'Calendar'[Date] <= _last
        )

        VAR _base_indexKey =
        ADDCOLUMNS(
        _base,
        "@IndexKey" , [YearNumber] * 100 + [MonthNumber]
        )

        // no need to change the DAX below:

        VAR _index_temp = SELECTCOLUMNS( _base_indexKey , "@IndexKey" , [@IndexKey] )

        VAR _base_index = SUBSTITUTEWITHINDEX( _base_indexKey , "X" , _index_temp , [@IndexKey] , ASC )

        VAR _table_ex =
        FILTER(
        GENERATEALL( _base_index , SELECTCOLUMNS( GENERATESERIES( 0 , 19 ) , "X'" , [x] + [Value] / 20 ) ) ,
        [X'] <= MAXX( _base_index , [X] )
        )

        RETURN _table_ex

        框架思路如下:

        • 準備基本維度

        • 將基本維度擴展出通用索引 X 以及 X'

        其中,第一步需要編寫,而第二步已經(jīng)被模板化,無需做任何修改。

        需要修改的 DAX 僅僅為:

        VAR _base = 

        VAR _last = EOMONTH( [Start:Date.LastDate.All] , -1 )
        RETURN
        CALCULATETABLE(
        SUMMARIZE( 'Calendar' , [YearNumber] , [MonthNumber] ),
        'Calendar'[Date] <= _last
        )

        VAR _base_indexKey =
        ADDCOLUMNS(
        _base,
        "@IndexKey" , [YearNumber] * 100 + [MonthNumber]
        )

        也就是構建了一個在合理時間范圍內(nèi)的 年 月 表而已,這也是本來就必須要做的。

        而將基本維度擴展出通用索引 X 以及 X' 的 DAX 無需做任何修改,已經(jīng)神奇地做了通用實現(xiàn)。

        沒有《BI真經(jīng)》作為基礎,看不懂是很正常的,請學習《BI真經(jīng)》。

        那么,現(xiàn)在維度已經(jīng)好了。

        再來看度量值如何做才能:

        • 通用化

        • 高性能

        這里我們借助《BI真經(jīng)》給出的通用視圖性能提升模式,給出通用化實現(xiàn),如下:

        CRM.User.New.Smooth = 

        VAR _x_curr = SELECTEDVALUE( 'Smooth.X.CRM.Date'[X] ) // 指定表
        VAR _dx = SELECTEDVALUE( 'Smooth.X.CRM.Date'[X'] ) - SELECTEDVALUE( 'Smooth.X.CRM.Date'[X] ) // 指定表
        VAR _view_table =

        CALCULATETABLE(

        ADDCOLUMNS(
        SUMMARIZE( 'Smooth.X.CRM.Date' , [X] , [YearNumber] , [MonthNumber] ) , // 新維度
        "Y" ,
        CALCULATE(
        [CRM.User.New] , // 原始度量值
        TREATAS(
        { ( [YearNumber] , [MonthNumber] ) } , // 新維度
        'Calendar'[YearNumber] , 'Calendar'[MonthNumber] // 原始維度
        )
        )
        )

        ,

        ALLSELECTED( )

        )

        // ------以下模板無需修改----------

        VAR _y_min = MAXX( FILTER( _view_table , [X] = MINX( _view_table , [X] ) ) , [Y] )
        VAR _y_max = MAXX( FILTER( _view_table , [X] = MAXX( _view_table , [X] ) ) , [Y] )

        VAR _y0 = COALESCE( MAXX( FILTER( _view_table , [X] = _x_curr - 1 ) , [Y] ) , _y_min )
        VAR _y1 = MAXX( FILTER( _view_table , [X] = _x_curr + 0 ) , [Y] )
        VAR _y2 = MAXX( FILTER( _view_table , [X] = _x_curr + 1 ) , [Y] )
        VAR _y3 = COALESCE( MAXX( FILTER( _view_table , [X] = _x_curr + 2 ) , [Y] ) , _y_max )

        RETURN

        VAR _u1 = _dx
        VAR _u2 = _dx * _dx
        VAR _a0 = -0.5 * _y0 + 1.5 * _y1 - 1.5 * _y2 + 0.5 * _y3
        VAR _a1 = _y0 - 2.5 * _y1 + 2 * _y2 - 0.5 * _y3
        VAR _a2 = -0.5 * _y0 + 0.5 * _y2
        VAR _a3 = _y1

        RETURN _a0 * _u1 * _u2 + _a1 * _u2 + _a2 * _u1 + _a3

        本來是復雜的度量值邏輯計算,在這里也做到了:

        • 高度通用化,僅僅格式化的修改幾個位置

        • 用了視圖層模式,以及對該問題的定制優(yōu)化,性能非???/p>

        這樣,就完美地解決了度量值計算的問題。

        理解視圖層通用模式需要學習《BI真經(jīng)》。

        總結

        本文給出了折線圖的平滑曲線版本的完美通用實現(xiàn)以及所有的 DAX 細節(jié)。需要《BI真經(jīng)》作為基礎方能領悟其中的各種妙處。

        從本文中不難看出在解決問題到通用化的過程中的通用模式,也就是模式的模式:

        • 問題到模板

        • 維度的通用化構建方法

          • 維度的可變部分,用套路改有限的參數(shù)

          • 維度的不變部分,模板化實現(xiàn),永不修改

        • 度量值的通用化頭肩方法

          • 度量值的可變部分,用套路改有限的參數(shù)

          • 度量值的不變部分,模板化實現(xiàn),永不修改

        如果你學習過《BI真經(jīng)》的《PBI高級》,你就可以看出,這里嚴格遵守了 OCP 原則(開放閉合原則)給出了穩(wěn)定需求和可變需求的分離,讓實現(xiàn)具備了通用性。

        在選擇10個點,20個點還是更多點作為插值元素方面以及索引從 0 開始而不是從 1 開始等很多細節(jié)都經(jīng)過了極為巧妙地推演,讀者可以自行研究,此處就不再贅述。

        再來回顧最終的結果:

        致敬:大學本科二年級《數(shù)學分析》第四章 - 函數(shù)的連續(xù),曲線的光滑。

        既然可以用于這個新老用戶訪問趨勢圖,本方案便可以用于任何曲線場景,完美通用實現(xiàn)。

        缺乏 DAX 基礎和數(shù)學基礎的伙伴認為本文比較復雜也很正常,但在實際應用層面,僅僅是改幾個參數(shù)的問題,已經(jīng)可以無腦復制,但問題是如果您沒有《BI真經(jīng)》的學習,無腦復制也是有難度的。

        最后,強烈建議有緣的你,如果正在學習 PowerBI 請學習《BI真經(jīng)》,它可以推演出所有在 PowerBI 中需要的內(nèi)容。

        在訂閱了BI佐羅講授的《BI真經(jīng)》之《BI進行時》課程區(qū),除了可以下載本文案例,還可以觀看視頻講解。

        在視頻講解中,會更加詳盡地介紹一些細節(jié),連前幾個視頻將于 2 月初統(tǒng)一更新。

        PowerBI 全網(wǎng)首發(fā)原生平滑曲線 - 原理及實現(xiàn)

        讓數(shù)據(jù)真正成為你的力量

        Create value?through?simple and?easy?with fun?by PowerBI

        Excel BI?|?DAX Pro?|?DAX?權威指南?|?線下VIP學習

        掃碼與PBI精英一起學習,驗證碼:data2021

        PowerBI MVP 帶你正確而高效地學習 PowerBI
        點擊“閱讀原文”,即刻開始

        瀏覽 81
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日韩高清A V | 一女两男三p吞精喝尿 | 亚洲AV成人无码一区二区三区 | 日韩精品一品 | 欧美黄色一级网站 | 国产精品网红系列 | 99热这里只有精品国产18 | 欧日韩不卡在线视频 | 秋霞成人无码免费A片果冻 | 国产精品久久久久网站 |