Страницы: 1
RSS
Перемножение таблиц в Power Query
 
Здравствуйте!
Подскажите пожалуйста, есть две таблицы (100х100). В каждой ячейке число. Как с помощью Power Query (именно его) сделать слияние в третью таблицу, чтобы все числа перемножились. Заранее спасибо!
 
Цитата
Дмитрий Дайрумов написал: чтобы все числа перемножились
Типа если бі не 100x100 а 2 на 2:
2 3
4 5
то результат желаемый 120?
По вопросам из тем форума, личку не читаю.
 
Нет, нужна третья таблица 100х100.
То есть, есть
1 2
2 4
и
3 2
3 5
Нужно получить: (перемножение)
34
6 20
 
Дмитрий Дайрумов, похоже на задание для собеседования :)
Код
let
  tbl1 = Excel.CurrentWorkbook(){[ Name = "numbersTbl1" ]}[Content], 
  tbl2 = Excel.CurrentWorkbook(){[ Name = "numbersTbl2" ]}[Content], 
  calculate = List.TransformMany (
    List.Zip ( { Table.ToColumns ( tbl1 ), Table.ToColumns ( tbl2 ) } ), 
    ( x ) => { List.Zip ( x ) }, 
    ( x, y ) => List.Transform ( y, ( z ) => List.Product ( z ) )
  ), 
  toTable = Table.FromColumns ( calculate )
in
  toTable
 
Спасибо! А подскажите пожалуйста, возможно ли это сделать через параметр и функцию?
И если заменять умножение сложением, как поменяется код? Заранее спасибо
 
Цитата
Дмитрий Дайрумов написал:
возможно ли это сделать через параметр и функцию?
в решении аж 3 функции :) Мало?
Можно так:
Код
let
  f_tableMultiply = ( table1 as table, table2 as table ) =>
    Table.FromColumns (
      List.TransformMany (
        List.Zip ( { Table.ToColumns ( table1 ), Table.ToColumns ( table2 ) } ), 
        ( x ) => { List.Zip ( x ) }, 
        ( x, y ) => List.Transform ( y, ( z ) => List.Product ( z ) )
      )
    ), 
    
  tbl1 = Excel.CurrentWorkbook(){[ Name = "numbersTbl1" ]}[Content], 
  tbl2 = Excel.CurrentWorkbook(){[ Name = "numbersTbl2" ]}[Content], 
  result = f_tableMultiply ( tbl1, tbl2 )
in
  result

Цитата
Дмитрий Дайрумов написал:
если заменять умножение сложением
Вы вообще код не понимаете? :) С этим не должно быть сложностей.
 
Цитата
Дмитрий Дайрумов написал:
сделать через параметр и функцию
Функций вам нарисовали аж три. Куда больше то? А что именно нужно передавать через параметр?
Цитата
surkenny написал:
задание для собеседования
Это не собеседование, это домашка. Тут уже были студиозусы, у которых преподы являются адептами параметров и функций.  :D А еще ваше решение наверняка не прокатит. Мое с интервальным поиском в прошлый раз у этого препода не прокатило. ;)  Я даже не знаю, гордиться мне или плакать?
Вот горшок пустой, он предмет простой...
 
Не сочтите за наглость, но подскажите, в какой корректно строки кода определяется действие, будь то умножение, сложение, деление...
Заранее спасибо!
 
Цитата
surkenny написал:
С этим не должно быть сложностей.
Шутку понял.  :D
Тут я то сразу не догоняю. Не люблю я этот ...Many
Вот горшок пустой, он предмет простой...
 
Цитата
написал:
Вы вообще код не понимаете?  С этим не должно быть сложностей.
Понимаю всё кроме того, где определяется действие. Буду вам очень благодарен, если расскажете "как для особо одаренных")
 
Цитата
PooHkrd написал:
А еще ваше решение наверняка не прокатит.
А как нужно?) через List.Accumulate? Чего там преподы-то хотят? :)
Цитата
PooHkrd написал:
Не люблю я этот ...Many
Я сам никогда не использовал на реальных данных :) Чисто для "практики" и использовал. И добираться до списка в списке в списке так поудобнее ;)
Цитата
Дмитрий Дайрумов написал:
в какой корректно строки кода определяется действие
Ладно уж: List.Product ( z )
 
Цитата
Дмитрий Дайрумов написал:
Понимаю всё кроме того, где определяется действие.
Смешно
 
С кодом вообще почти не работал, с Power Query все делал в основном через банальные выборы, "руками", настраиваемый столбец, группировки и тд

Я так понимаю, что для сложения можно использовать List.Sum ?  с вычитанием и делением уже так не получится ?
Огромное вам спасибо за содействие, правда!
 
Дмитрий Дайрумов, третьим параметром можно указывать действие (*,/,+,-):
Код
let
  f_tableMultiply = ( table1 as table, table2 as table, sign as text ) =>
    Table.FromColumns (
      List.TransformMany (
        List.Zip ( { Table.ToColumns ( table1 ), Table.ToColumns ( table2 ) } ),
        ( x ) => { List.Zip ( x ) },
        ( x, y ) => List.Transform ( y, ( z ) => Expression.Evaluate ( Text.From ( z{0} ) & sign & Text.From ( z{1} ) ) )
      )
    ),
  tbl1 = Excel.CurrentWorkbook(){[ Name = "numbersTbl1" ]}[Content],
  tbl2 = Excel.CurrentWorkbook(){[ Name = "numbersTbl2" ]}[Content],
  result = f_tableMultiply ( tbl1, tbl2, "/" )
in
  result
 
surkenny, знак передавать в виде параметра? Забавно!
Вот горшок пустой, он предмет простой...
 
PooHkrd, можно и функцией (имеющейся или свою написать), но мне кажется, знаком удобненько :)
Код
let
  f_tableOperation = ( table1 as table, table2 as table, operation as function ) =>
    Table.FromColumns (
      List.TransformMany (
        List.Zip ( { Table.ToColumns ( table1 ), Table.ToColumns ( table2 ) } ),
        ( x ) => { List.Zip ( x ) },
        ( x, y ) => List.Transform ( y, ( z ) => operation ( z{0}, z{1} ) )
      )
    ),
  tbl1 = Excel.CurrentWorkbook(){[ Name = "numbersTbl1" ]}[Content],
  tbl2 = Excel.CurrentWorkbook(){[ Name = "numbersTbl2" ]}[Content],
  result = f_tableOperation ( tbl1, tbl2, Value.Divide )
in
  result
Изменено: surkenny - 09.12.2021 20:47:02
 
Цитата
surkenny написал:
знаком удобненько
Оно удобненько, не спорю, но реализация через Expression.Evaluate, будет слишком медленной. Для образовательных целей сойдет, конечно, но на прод я б такое не принял, сказал бы переделать на выбор функции по списку, т.е. проверять, если пришел "+", то делаем одно, иначе другое и т.д. Через List.ReplaceMatchingItems или Record.FieldOrDefault. И параметр тогда можно организовать как список значений и из выпадающей менюшки его выбирать.
Функцией тоже можно, но как параметр мышкоклацательным способом вы ее не передадите, это надо лезть в расширенный редактор и там писать. Толку с такого параметра мало - геморно, и не для начинающего.
Изменено: PooHkrd - 10.12.2021 06:52:51
Вот горшок пустой, он предмет простой...
Страницы: 1
Наверх