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

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代【CDA干貨】Power Query 中實現(xiàn)移動加權(quán)平均的詳細指南
【CDA干貨】Power Query 中實現(xiàn)移動加權(quán)平均的詳細指南
2025-06-24
收藏

Power Query 中實現(xiàn)移動加權(quán)平均的詳細指南?

在數(shù)據(jù)分析和處理中,移動加權(quán)平均是一種非常有用的計算方法,它能夠根據(jù)不同數(shù)據(jù)的權(quán)重,動態(tài)地計算平均值,幫助我們更準確地分析數(shù)據(jù)趨勢和特征。Power Query 作為 Excel 中強大的數(shù)據(jù)處理工具,為我們實現(xiàn)移動加權(quán)平均提供了便捷的途徑。下面將詳細介紹如何在 Power Query 中完成移動加權(quán)平均的計算。?

一、移動加權(quán)平均的概念?

移動加權(quán)平均,是指每次進貨的成本加上原有庫存存貨的成本,除以每次進貨數(shù)量加上原有庫存存貨的數(shù)量,據(jù)以計算加權(quán)平均單位成本,作為在下次進貨前計算各次發(fā)出存貨成本依據(jù)的一種方法。在 Power Query 的場景下,我們可以將其拓展應(yīng)用到各類數(shù)值型數(shù)據(jù)的分析中,通過設(shè)定合適的權(quán)重和移動窗口,動態(tài)計算數(shù)據(jù)的加權(quán)平均值,以便更好地觀察數(shù)據(jù)的變化趨勢,剔除隨機波動的影響。?

二、數(shù)據(jù)準備?

假設(shè)我們有一份銷售數(shù)據(jù),包含 “日期”“產(chǎn)品名稱”“銷售數(shù)量”“銷售單價” 等列,我們需要根據(jù)銷售數(shù)量作為權(quán)重,計算銷售單價的移動加權(quán)平均。首先,在 Excel 中打開 “數(shù)據(jù)” 選項卡,點擊 “獲取數(shù)據(jù)”,選擇數(shù)據(jù)的來源(如 CSV 文件、數(shù)據(jù)庫等),將數(shù)據(jù)導入到 Power Query 編輯器中。?

三、Power Query 操作步驟?

(一)分組排序?

在 Power Query 編輯器中,我們需要先對數(shù)據(jù)按照 “產(chǎn)品名稱” 和 “日期” 進行分組和排序。選中 “產(chǎn)品名稱” 和 “日期” 列,點擊 “開始” 選項卡中的 “分組依據(jù)” 按鈕。在彈出的 “分組依據(jù)” 對話框中,選擇 “添加聚合”,將 “銷售數(shù)量” 和 “銷售單價” 分別進行求和聚合,得到每個產(chǎn)品在不同日期的總銷售數(shù)量和總銷售金額。完成分組聚合后,確保數(shù)據(jù)按照 “產(chǎn)品名稱” 和 “日期” 的順序排列,以便后續(xù)計算移動加權(quán)平均。對應(yīng)的 M 代碼如下:?

let
    Source = Excel.CurrentWorkbook(){[Name="表1"]}[Content],?
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"日期", type date}, {"產(chǎn)品名稱", type text}, {"銷售數(shù)量", Int64.Type}, {"銷售單價", type number}}),?
    #"Grouped Rows" = Table.Group(#"Changed Type", {"產(chǎn)品名稱", "日期"}, {?
        {"總銷售數(shù)量", each List.Sum([銷售數(shù)量])},?
        {"總銷售金額", each List.Sum(List.Transform([銷售數(shù)量], each _ * [銷售單價]))}?
    }),?
    #"Sorted Rows" = Table.Sort(#"Grouped Rows",{{"產(chǎn)品名稱", Order.Ascending}, {"日期", Order.Ascending}})?
    in
    #"Sorted Rows"?

?

(二)計算移動加權(quán)平均?

接下來,我們使用自定義函數(shù)來計算移動加權(quán)平均。在 Power Query 編輯器的 “添加列” 選項卡中,點擊 “自定義列”。在彈出的 “自定義列” 對話框中,輸入以下 M 代碼來定義一個計算移動加權(quán)平均的函數(shù):

(rows, windowSize) =>
let
    filteredRows = Table.FirstN(rows, windowSize),?
    totalWeight = List.Sum(filteredRows[總銷售數(shù)量]),?
    weightedSum = List.Sum(List.Transform(filteredRows, each [總銷售金額] / [總銷售數(shù)量] * [總銷售數(shù)量]))
    in?
    weightedSum / totalWeight?

? 上述代碼定義了一個函數(shù),它接受兩個參數(shù):rows(表示一組數(shù)據(jù)行)和windowSize(表示移動窗口的大?。?。函數(shù)內(nèi)部首先篩選出指定窗口大小的數(shù)據(jù)行,然后計算這些數(shù)據(jù)行的總權(quán)重(總銷售數(shù)量之和)以及加權(quán)總和(銷售單價乘以銷售數(shù)量之和),最后返回移動加權(quán)平均值。? 定義好函數(shù)后,在 “自定義列” 對話框中,輸入調(diào)用該函數(shù)的表達式來計算移動加權(quán)平均列。假設(shè)我們的移動窗口大小為 3,表達式如下:?

= Table.AddColumn(#"Sorted Rows", "移動加權(quán)平均", each #"移動加權(quán)平均函數(shù)"([_], 3))?

? 其中"移動加權(quán)平均函數(shù)"是我們剛剛定義的函數(shù)名稱,3表示移動窗口大小,[_]表示當前行所在的分組數(shù)據(jù)。?

(三)數(shù)據(jù)整理與輸出?

完成移動加權(quán)平均列的計算后,我們可以根據(jù)需要對數(shù)據(jù)進行進一步的整理,如刪除不需要的列、更改數(shù)據(jù)類型等。最后,點擊 “開始” 選項卡中的 “關(guān)閉并上載” 按鈕,將處理好的數(shù)據(jù)加載回 Excel 工作表中,以便進行后續(xù)的分析和可視化操作。?

四、注意事項?

移動窗口大小的選擇:移動窗口大小的設(shè)置直接影響移動加權(quán)平均的結(jié)果。窗口過小,可能無法有效平滑數(shù)據(jù)波動;窗口過大,則可能導致數(shù)據(jù)滯后,無法及時反映數(shù)據(jù)的變化趨勢。需要根據(jù)具體的數(shù)據(jù)特點和分析目的來合理選擇窗口大小。?

數(shù)據(jù)完整性和準確性:在進行移動加權(quán)平均計算前,要確保數(shù)據(jù)的完整性和準確性。缺失值錯誤數(shù)據(jù)可能會導致計算結(jié)果出現(xiàn)偏差,影響分析結(jié)論。如果存在缺失值,可以使用 Power Query 的 “填充” 功能進行處理;對于錯誤數(shù)據(jù),需要進行修正或刪除。?

性能問題:當數(shù)據(jù)量較大時,移動加權(quán)平均的計算可能會消耗較多的系統(tǒng)資源和時間??梢钥紤]對數(shù)據(jù)進行適當?shù)暮Y選和聚合,減少不必要的計算量,提高計算效率。?

通過以上步驟,我們就可以在 Power Query 中實現(xiàn)移動加權(quán)平均的計算,利用這一強大的數(shù)據(jù)處理功能,更好地挖掘數(shù)據(jù)背后的信息,為數(shù)據(jù)分析和決策提供有力支持。如果你在實際操作過程中遇到其他問題或有進一步的需求,歡迎隨時交流。

推薦學習書籍 《CDA一級教材》適合CDA一級考生備考,也適合業(yè)務(wù)及數(shù)據(jù)分析崗位的從業(yè)者提升自我。完整電子版已上線CDA網(wǎng)校,累計已有10萬+在讀~ 免費加入閱讀:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

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