Как добавить производный столбец в сводную таблицу с помощью Excel PowerQuery, ссылаясь на положение столбца - PullRequest
1 голос
/ 17 мая 2019

Я создаю регулярный отчет с помощью PowerQuery в Excel, который поворачивает данные.Сводная таблица содержит последние четыре квартала в качестве имен столбцов в порядке дат (например, 30/09/2018, 31/12/2018, 31/03/2019, 30/06/2019).Значения в каждом столбце даты являются числовыми.Каждый раз, когда запускается отчет, имена столбцов будут меняться, потому что ... новые даты!

Строки представляют разные объекты (например, Банк Мамы, Банк Папы, Банк Дедушки).Мне нужно создать несколько производных столбцов, которые рассчитывают разницу между столбцами последнего квартала (последний столбец) и столбцами предыдущего квартала (например, движение за 3 месяца, движение за 6 месяцев).Вот некоторые примерные данные:

Вот как будут выглядеть данные перед сводкой:

Entity_Name       Quarter Date    Value
Bank of Dad       30/09/2018      4
Bank of Dad       31/12/2018      2
Bank of Dad       31/03/2019      3
Bank of Dad       30/06/2019      3
Bank of Grandpa   30/09/2018      4
Bank of Grandpa   31/12/2018      6
Bank of Grandpa   31/03/2019      1
Bank of Grandpa   30/06/2019      2
Bank of Mum       30/09/2018      5
Bank of Mum       31/12/2018      5
Bank of Mum       31/03/2019      4
Bank of Mum       30/06/2019      4

И после сводки:

Entity_Name       30/09/2018     31/12/2018     31/03/2019     30/06/2019
Bank of Grandpa   4              6              1              2
Bank of Mum       5              5              4              4
Bank of Dad       4              2              3              3

И воткуда бы я хотел попасть (последний квартал минус три месяца назад и шесть месяцев назад):

Entity_Name       Movement (3 months)   Movement (6 months)
Bank of Grandpa   1                     -4
Bank of Mum       0                     -1
Bank of Dad       0                      1

Я хорошо поохотился в Интернете и нашел похожие, но не совсем там примеры (обычно для переименования столбцов или фильтрации значений из столбцов).Моя проблема на самом деле намного проще, чем то, что я обнаружил, поэтому я чувствую, что это должно быть относительно просто, и я просто упускаю что-то очевидное, что никто не должен был задавать вопросы.Я - девушка-панда / питон, работающая в PowerQuery впервые (мне нужно передать ее клиенту для регулярного запуска, поэтому мне нужен отчет, чтобы «говорить» на их языке - то есть в Excel). PowerQuery действительно делает некоторые вещихорошо (присоединяется и группируется в Excel? - Круто!).Другие вещи немного драки - вот так!

Я смотрел на эту проблему двумя способами - во-первых, попробуйте сделать это до разворота, чтобы я не боролся с изменением имен столбцов.Это кудрявый.Возможно, было бы проще, если бы существовала только одна сущность, но несколько сущностей усложняют ее.Мой предпочтительный подход, согласующийся с тем, как этот отчет был ранее написан (в Excel, не используя мощный запрос), состоит в том, чтобы извлекать столбцы из сводных данных.Чтобы сделать это, мне нужно будет ссылаться на столбцы по позициям при добавлении новых столбцов.

Если я смогу решить проблему получения возвращаемого столбца, который содержит значения другого столбца через позиционную ссылку, то яНа 99% пути, поэтому я ищу помощь для решения этой конкретной части проблемы.

то есть, чтобы добраться до этой точки, используя позиционную ссылку для столбца (а не явное имя столбца):

Entity_Name        30/09/2018    ...    Values_in_col_1   
Bank of Dad        4             ...    4
Bank of Grandpa    4             ...    4
Bank of Mum        5             ...    5

Вот что я попробовал:

let
     Source = Excel.CurrentWorkbook(){[Name="Table14"]}[Content],
     #"Changed Type" = Table.TransformColumnTypes(Source,{{"Entity name", type text}, {"Quarter date", type date}, {"Value", Int64.Type}}),
      #"Sorted Rows" = Table.Sort(#"Changed Type",{{"Entity name", Order.Ascending}, {"Quarter date", Order.Ascending}}),
     #"PrevTable" = Table.Pivot(Table.TransformColumnTypes(#"Sorted Rows", {{"Quarter date", type text}}, "en-NZ"), List.Distinct(Table.TransformColumnTypes(#"Sorted Rows", {{"Quarter date", type text}}, "en-NZ")[#"Quarter date"]), "Quarter date", "Value", List.Sum),
     #"Column names" = Table.ColumnNames(#"PrevTable"),
     #"Test 1" = Table.AddColumn(#"PrevTable", "Test1", each #"Column names"{1}),
     #"Test 2" = Table.AddColumn(#"Test 1", "Test2", each Table.SelectRows(#"PrevTable", each(Record.Field(_,Table.ColumnNames(#"PrevTable"){1}))))
in
     #"Test 2"

Тест 1: Мне удалось добраться до точки, где я могу создать список имен столбцов и ссылаться на них по индексу- но возвращается возвращаемый столбец значений, которые являются именем столбца, а не фактическими значениями!Ха-ха.

Тест 2: я также попробовал эту другую вещь, чтобы посмотреть, могу ли я получить значения строк (пытаясь переделать код, который я обнаружил, который также должен был фильтровать), но который возвращает таблицу без столбцов вЭто.

Вот таблица, которую я получаю из этого кода:

Entity_Name        30/09/2018    ...    Test1        Test2   
Bank of Dad        4             ...    30/09/2018   [Table]
Bank of Grandpa    4             ...    30/09/2018   [Table]
Bank of Mum        5             ...    30/09/2018   [Table]

И если я нажму на значения 'Table', я получу ответ этого типа:

Expression.Error: Мы не можем преобразовать значение 4 в тип Logical.

Любая помощь будет принята с благодарностью - так много инструментов для изучения, так мало мозгов!

1 Ответ

0 голосов
/ 17 мая 2019

Все, что понадобилось, это 3 часа гуглить и писать действительно длинный вопрос, и каким-то чудесным образом я нашел ключ к ответу здесь .

Вот как я создал(один из) моих производных столбцов:

#"Quarterly movement" = Table.AddColumn(#"PrevTable", "Quarterly change", each (Record.Field(_, Table.ColumnNames(#"PrevTable"){4}) - Record.Field(_, Table.ColumnNames(#"PrevTable"){3})))

И если бы я просто хотел создать столбец, который бы отражал значения другого, используя позиционную ссылку (суть проблемы):

#"Test" = Table.AddColumn(PrevTable, "Test", each (Record.Field(_, Table.ColumnNames(#"PrevTable"){1})))

...