在 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
我有一些关于项目的数据,我想以一种更容易使用 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