在 Power Query for PowerBi 中使用 Python Pandas(或 M)转换数据

Transforming data using Python Pandas (or M) in Power Query for PowerBi

我有一些关于项目的数据,我想以一种更容易使用 PowerBi 进行分析的方式进行转换。

数据如下所示:

Project Number Project Name Planned Start Date SM1 SM2 SM3
10000 A Apr-21 10 20 30
10001 B Jun-21 40 50 60
10002 C Sep-22 70 80 90

所谓的 'SavingMonths' 是与项目绩效相对应的值,每个顺序列代表基于项目开始日期的下个月。

例如,项目 A 于 2021 年 4 月开始,因此 SavingsMonth1=April-21,SavingsMonth2=May-21... 依此类推。

我想以这种格式获取它:

这样,我现在可以按日期 filter/sum 'Savings' 列。

我不是程序员,但我知道 一些 Python 并且认为 Pandas 库可能会有所帮助,但我只是开始学习它。我根本不知道 M,但是我意识到我可以在 Power Query 中使用 Python 进行转换,这很好。

在 powerquery (M) 中,假设日期以文本列开始,此 (a) 逆透视 (b) 将文本转换为日期 (c) 根据原始列的数量向该日期添加 X 个月

let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Unpivoted Other Columns" = Table.UnpivotOtherColumns(Source, {"Project Number", "Project Name", "Planned Start Date"}, "Ignore", "Savings"),
#"Added Index" = Table.AddIndexColumn(#"Unpivoted Other Columns", "Index", 0, 1, Int64.Type),
#"Mod Index" = Table.TransformColumns(#"Added Index",{{"Index", each Number.Mod(_,List.Count(Table.ColumnNames(Source))-3), Int64.Type}}),
#"Split Column by Delimiter" = Table.SplitColumn(#"Mod Index", "Planned Start Date", Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv), {"Planned Start Date.1", "Planned Start Date.2"}),
#"Added Custom1" = Table.AddColumn(#"Split Column by Delimiter", "Custom", each Date.FromText("01 "& [Planned Start Date.1] & "20"&[Planned Start Date.2])),
#"Added Custom" = Table.AddColumn(#"Added Custom1", "Date2", each  Date.AddMonths([Custom],[Index])),
#"Added Custom2" = Table.AddColumn(#"Added Custom", "Date", each Date.ToText([Date2],"MMM-yy")),
#"Removed Other Columns" = Table.SelectColumns(#"Added Custom2",{"Project Number", "Project Name", "Savings", "Date"})
 in  #"Removed Other Columns"

您需要在 Power BI 中将 Excel.CurrentWorkbook 替换为 Excel.WorkBook

回答这个问题的人大多是正确的,它几乎是一个逆轴,除了递增的月份。我们可以使用 melt 逆透视,但是我们必须添加一些日期偏移量以使月份正确,然后将它们转换回原始格式。

import pandas as pd
df = pd.DataFrame({'Project Number':[10000,10001,10002],
                   'Project Name':['A','B','C'],
                  'Planned Start Date':['Apr-21','Jun-21','Sep-22'],
                  'SavingsMonth1':[10,40,70],
                  'SavingsMonth2':[20,50,80],
                  'SavingsMonth3':[30,60,90]})


df['Planned Start Date'] = pd.to_datetime('01-'+df['Planned Start Date'])

df.sort_values(by='Planned Start Date', inplace=True)

df = df.melt(id_vars=['Project Number','Project Name', 'Planned Start Date'], value_name='Savings')
df['offset'] = df['variable'].str.extract('(\d)').astype(int).sub(1)
df['Planned Start Date'] = (df['Planned Start Date'].dt.to_period('M') + df['offset']).dt.strftime('%b-%y')
df = df.sort_values(by='Project Number').drop(columns=['variable','offset'])


print(df)

输出

  Project Number Project Name Planned Start Date  Savings
0           10000            A             Apr-21       10
3           10000            A             May-21       20
6           10000            A             Jun-21       30
1           10001            B             Jun-21       40
4           10001            B             Jul-21       50
7           10001            B             Aug-21       60
2           10002            C             Sep-22       70
5           10002            C             Oct-22       80
8           10002            C             Nov-22       90