Как мы объединяем временные ряды в Excel? - PullRequest
1 голос
/ 07 октября 2019

Учитывая следующие временные ряды денежных потоков, как я могу объединить их в совокупный временной ряд денежных потоков в Excel, в идеале, используя только формулу массива и без макроса VBA?

В частности, мне дали это времясерия денежных потоков для каждой транзакции:

enter image description here

Учитывая данные (в столбце F) для количества транзакций в каждом периоде, я хотел бы бытьвозможность рассчитать агрегированные временные ряды общего денежного потока (в столбце G, выделено желтым цветом), в идеале с использованием только формулы массива и без макроса VBA?

enter image description here

Примечание. Столбец H - J предназначен только для иллюстрации, чтобы показать, как должен рассчитываться столбец G. Я не хочу, чтобы они были в моей окончательной электронной таблице.

Большое спасибо за вашу помощь!

Ответы [ 3 ]

2 голосов
/ 07 октября 2019

Я полагаю, что вы можете сделать это по формуле - проще всего обратить вспять денежные потоки и умножить на текущие и предыдущие 5 транзакций:

=SUMPRODUCT(INDEX(F:F,MAX(ROW()-5,3)):F16*INDEX(C:C,MAX(11-ROW(),3)):$C$8)

в G3.

Этообычная формула без массива.

enter image description here

1 голос
/ 08 октября 2019

Это также можно сделать в Power Query.

Пожалуйста, обратитесь к этой статье , чтобы узнать, как использовать Power Query в вашей версии Excel. Он доступен в Excel 2010 Professional Plus и более поздних версиях . Моя демонстрация использует Excel 2016 .

Шаги:

  1. Загрузите обе таблицы, являющиеся time series of cash-flow и вашим 2-column output table, в редактор мощных запросов,тогда вы должны иметь:

Tables

Для первой таблицы объединить столбец Period со столбцом Cashflow с точкой с запятой ; в качестве разделителя; Транспонировать столбец / таблицу, а затем объединить столбцыс запятой , в качестве разделителя; Добавьте пользовательский столбец, используйте эту формулу ="Connector", которая заполнит столбец словом Connector, тогда вы должны иметь:

Table 1 - Final

Для второй таблицы также добавьте пользовательский столбец, используя ту же формулу ="Connector", которая заполнит столбец словом Connector; Объедините вторую таблицу сВ первой таблице, используя столбец Custom в качестве соединения, затем разверните новый столбец, чтобы показать столбец Merged из первой таблицы, затем вы должны иметь:

Table 2 - merged

Удалите столбец Custom, затем разделите столбец Merged запятыми , и , поместите результаты в строки ; Снова разделите столбец Merged наразделитель точкой с запятой ; для отделения Period и Cashflow от первой таблицы; Добавление пользовательского столбца для вычисления New Period, являющегося =[Period]+[Merged.1]; Добавление другого пользовательскогоВ столбце для вычисления Cashflow, являющегося =[#"# Tran"]*[Merged.2], у вас должно быть что-то вроде следующего:

Table 2 - added columns

Группировать / суммировать столбец Cashflow по New Period.

Table 2 - Final

После этого вы можете Закрыть и загрузить результат на новый рабочий лист (по умолчанию). Если вы хотите отобразить столбец # Trans в окончательном выводе, вы можете сделать копию своей второй таблицы перед внесением каких-либо изменений, а затем объединить ее с окончательной выходной таблицей в столбце Period, чтобы отобразить соответствующее числотранзакции.

Вот коды мощности M запросов для первой таблицы:

let
    Source = Excel.CurrentWorkbook(){[Name="Tbl_CFS"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Period", Int64.Type}, {"Cashflow", Int64.Type}}),
    #"Merged Columns1" = Table.CombineColumns(Table.TransformColumnTypes(#"Changed Type", {{"Period", type text}, {"Cashflow", type text}}, "en-AU"),{"Period", "Cashflow"},Combiner.CombineTextByDelimiter(";", QuoteStyle.None),"Merged"),
    #"Transposed Table" = Table.Transpose(#"Merged Columns1"),
    #"Merged Columns" = Table.CombineColumns(Table.TransformColumnTypes(#"Transposed Table", {{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}}, "en-AU"),{"Column1", "Column2", "Column3", "Column4", "Column5", "Column6"},Combiner.CombineTextByDelimiter(",", QuoteStyle.None),"Merged"),
    #"Added Custom" = Table.AddColumn(#"Merged Columns", "Custom", each "Connector")
in
    #"Added Custom"

А вот коды для второй таблицы:

let
    Source = Excel.CurrentWorkbook(){[Name="Tbl_Total"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Period", Int64.Type}, {"# Tran", Int64.Type}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each "Connector"),
    #"Merged Queries" = Table.NestedJoin(#"Added Custom", {"Custom"}, Tbl_CFS, {"Custom"}, "Tbl_CFS", JoinKind.LeftOuter),
    #"Expanded Tbl_CFS" = Table.ExpandTableColumn(#"Merged Queries", "Tbl_CFS", {"Merged"}, {"Merged"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Tbl_CFS",{"Custom"}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Removed Columns", {{"Merged", Splitter.SplitTextByDelimiter(",", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Merged"),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Merged", type text}}),
    #"Split Column by Delimiter1" = Table.SplitColumn(#"Changed Type1", "Merged", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"Merged.1", "Merged.2"}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Split Column by Delimiter1",{{"Merged.1", Int64.Type}, {"Merged.2", Int64.Type}}),
    #"Added Custom1" = Table.AddColumn(#"Changed Type2", "New Period", each [Period]+[Merged.1]),
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "Cashflow", each [#"# Tran"]*[Merged.2]),
    #"Grouped Rows" = Table.Group(#"Added Custom2", {"New Period"}, {{"Sum", each List.Sum([Cashflow]), type number}})
in
    #"Grouped Rows"

Все шагииспользуют встроенные функции, поэтому должны быть простыми и простыми в исполнении. Дайте мне знать, если есть какие-либо вопросы. Ура :) 1111 *

1 голос
/ 07 октября 2019

OK Поместите эту формулу массива в G3:

=IFERROR(SUMPRODUCT(INDEX($B$2:$B$7,N(IF({1},MODE.MULT(IF(INDEX(F:F,MAX(ROW()-5,3)):F3>0,(ROW()-ROW(INDEX(F:F,MAX(ROW()-5,3)):F3)+1)*{1,1}))))),INDEX(INDEX(F:F,MAX(ROW()-5,3)):F3,N(IF({1},MODE.MULT(IF(INDEX(F:F,MAX(ROW()-5,3)):F3>0,(ROW(INDEX(F:F,MAX(ROW()-5,3)):F3)-MIN(ROW(INDEX(F:F,MAX(ROW()-5,3)):F3))+1)*{1,1})))))),0)

Будучи формулой массива, она должна быть подтверждена с помощью Ctrl-Shift-Enter вместо Enter при выходе из режима редактирования. Затем скопируйте вниз.

enter image description here


После того, как Microsoft выпустит FILTER и SEQUENCE, его можно сократить:

=IFERROR(SUMPRODUCT(INDEX($B$2:$B$7,FILTER(SEQUENCE(ROW()-MAX(ROW()-5,3)+1,,ROW()-MAX(ROW()-5,3)+1,-1),INDEX(F:F,MAX(ROW()-5,3)):F3>0)),FILTER(INDEX(F:F,MAX(ROW()-5,3)):F3,INDEX(F:F,MAX(ROW()-5,3)):F3>0)),0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...