如何在Power Query中计算5年与10年移动平均线
在Power BI Power Query中实现分月份的5年/10年移动平均计算
原始数据表格
| Date.MonthName | Calendar_Year | Total Number | Moving Average 5 Year | Moving Average 10 Year |
|---|---|---|---|---|
| April | 2000 | 135 | ||
| April | 2001 | 76 | ||
| April | 2002 | 33 | ||
| April | 2003 | 31 | ||
| April | 2004 | 228 | ||
| April | 2005 | 200 | 101 | |
| April | 2006 | 350 | 114 | |
| April | 2007 | 126 | 168 | |
| April | 2008 | 102 | 187 | |
| April | 2009 | 126 | 201 | |
| April | 2010 | 333 | 181 | 141 |
| April | 2011 | 137 | 207 | 161 |
| April | 2012 | 121 | 165 | 167 |
| April | 2013 | 36 | 164 | 175 |
| April | 2014 | 79 | 151 | 176 |
| April | 2015 | 272 | 141 | 161 |
| April | 2016 | 282 | 129 | 168 |
| April | 2017 | 96 | 158 | 161 |
| April | 2018 | 93 | 153 | 158 |
| April | 2019 | 181 | 164 | 158 |
| April | 2020 | 64 | 185 | 163 |
| April | 2021 | 144 | 143 | 136 |
| April | 2022 | 126 | 116 | 137 |
| April | 2023 | 236 | 122 | 137 |
| August | 2000 | 66 | ||
| August | 2001 | 83 | ||
| August | 2002 | 118 | ||
| August | 2003 | 236 | ||
| August | 2004 | 117 | ||
| August | 2005 | 84 | 124 | |
| August | 2006 | 151 | 128 | |
| August | 2007 | 157 | 141 | |
| August | 2008 | 221 | 149 | |
| August | 2009 | 178 | 146 | |
| August | 2010 | 171 | 158 | 141 |
| August | 2011 | 154 | 176 | 152 |
| August | 2012 | 267 | 176 | 159 |
| August | 2013 | 164 | 198 | 174 |
| August | 2014 | 249 | 187 | 166 |
| August | 2015 | 149 | 201 | 180 |
| August | 2016 | 122 | 197 | 186 |
| August | 2017 | 247 | 190 | 183 |
| August | 2018 | 160 | 186 | 192 |
| August | 2019 | 73 | 185 | 186 |
| August | 2020 | 176 | 150 | 176 |
| August | 2021 | 164 | 156 | 176 |
| August | 2022 | 275 | 164 | 177 |
| August | 2023 | 52 | 170 | 178 |
计算逻辑说明
- 5年移动平均:针对同月份,取当前年份往前推5年的所有数据平均值(如April 2005取2000-2004年的April数据),数据不足5年时留空。
- 10年移动平均:针对同月份,取当前年份往前推10年的所有数据平均值(如August 2010取2000-2009年的August数据),数据不足10年时留空。
Power Query实现步骤
- 将数据导入Power Query,确保列名正确:
Date.MonthName、Calendar_Year、Total Number。 - 按
Date.MonthName分组,对每个分组内的年份按升序排序。 - 添加自定义列计算5年移动平均:
注:将= let currentMonth = [Date.MonthName], currentYear = [Calendar_Year], filteredRows = Table.SelectRows(#"排序后的表", each [Date.MonthName] = currentMonth and [Calendar_Year] >= currentYear - 4 and [Calendar_Year] < currentYear), countRows = Table.RowCount(filteredRows) in if countRows = 5 then Number.Round(List.Average(filteredRows[Total Number]), 0) else null#"排序后的表"替换为实际排序步骤的名称。 - 添加自定义列计算10年移动平均:
= let currentMonth = [Date.MonthName], currentYear = [Calendar_Year], filteredRows = Table.SelectRows(#"排序后的表", each [Date.MonthName] = currentMonth and [Calendar_Year] >= currentYear - 9 and [Calendar_Year] < currentYear), countRows = Table.RowCount(filteredRows) in if countRows = 10 then Number.Round(List.Average(filteredRows[Total Number]), 0) else null - 调整列顺序匹配原始表格结构,最后加载数据到Power BI。
关键说明
- 代码通过
currentYear - 4和currentYear < currentYear筛选前5年数据(如2005年对应2000-2004年),仅当数据量刚好为5条时计算平均值,否则返回null对应空单元格。 Number.Round函数用于将平均值取整,匹配原始表格的整数结果。
内容的提问来源于stack exchange,提问作者SJG
相关产品推荐
相关产品推荐

