Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Power Query. Ускорение процесса объединения текста предыдущей, текущей и последующей строк одного столбца, В Power Query создал запрос, объединяющий текст из предыдущей, текущей и последующей строк одного столбца. Все работает. НО... очень долго. Всего то около 10 тысяч строк. Подскажите, как ускорить обработку. Пример приложен.
 
Цитата
написал:
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20      let         Источник = Excel.CurrentWorkbook(){[Name=  "Табл1"  ]}[Content],         #  "Добавлен пользовательский объект"   = Table.AddColumn(Источник,   "Заголовки"  , each if [Номер наряда] <>null then   "Заголовок"   else   "Детали"  ),         AddIndex = Table.AddIndexColumn(#  "Добавлен пользовательский объект"  ,   "Index"  , 1, 1, Int64.Type),         max = Table.RowCount(AddIndex),         zago = List.Buffer(AddIndex[Заголовки]),         Combine =Table.AddColumn(AddIndex,   "Combine"  , each             if [Index]=1 then                [Заголовки]              else                if [Index]=max  then                  [Заголовки] &   " "   &   "Last"                 else                   zago{[Index]-2} &   ";"   &                   [Заголовки] &   ";"   &                   zago{[Index]}),         #  "Заполнение вниз"   = Table.FillDown(Combine,{  "Номер наряда"  ,   "Операция"  }),         #  "Строки с примененным фильтром"   = Table.SelectRows(#  "Заполнение вниз"  , each ([Combine] <>   "Детали;Заголовок;Детали"   and [Combine] <>   "Заголовок"   and [Combine] <>   "Заголовок;Заголовок;Детали"  ))    in          #  "Строки с примененным фильтром"   
 
Спасибо за код. Я его прописал, но это, к сожалению, не сильно ускоряет процесс. Создал функцию, которая  создает список значений  столбца "Заголовок", потом список индексов строк. Далее объединяет текст из трех строк функцие List.Transform и создает соответствующий столбец.  Потом проверяет соответсвие строк заданным условиям. Ускорение ощутимо, но все еще  долго, на мой взгляд: где-то около часа на загрузку 10К строк на лист Excel.
Сейчас я буду пробовать в Power BI предложение Chat GPT по распараллеливанию вычислений. По факту поделюсь как это реально работает.
P.S. Ноутбук с ОЗУ 8Гб, доступно 6Гб. Тактовая 4,1 ГГц. Кроме Excel и системных программ ничего в момент загрузки не используется.
Изменено: AzatKukanov - 20.04.2023 09:07:53 (Представлены данные о компьютере)
Power Query. Ускорение процесса объединения текста предыдущей, текущей и последующей строк одного столбца, В Power Query создал запрос, объединяющий текст из предыдущей, текущей и последующей строк одного столбца. Все работает. НО... очень долго. Всего то около 10 тысяч строк. Подскажите, как ускорить обработку. Пример приложен.
 
Еще от ChatGPT по метаданным столбца:

Вот полный код, который использует метаданные столбца для улучшения производительности и уменьшения повторных обращений к данным:

let

   // Получаем таблицу

   Source = ...,

   

   // Получаем метаданные столбца ИД_Заголовок

   ColumnMetadata = Value.Metadata(Table.Column(Source, "ИД_Заголовок")),

   // Создаем функцию для объединения строк через разделитель

   CombineRows = (prevValue, currentValue, nextValue) =>

       if currentValue = "Заголовок" and prevValue = "Заголовок" and nextValue = "Заголовок" then

           "Заголовок;Заголовок;Заголовок"

       else if (currentValue = "ЗаголовокLast" and nextValue = null) then

           "ЗаголовокLast"

       else if currentValue = "Наряд" and prevValue = "Наряд" and nextValue = "Наряд" then

           "Наряд;Наряд;Наряд"

      else if (currentValue = "Наряд" and prevValue = "Наряд" and nextValue = "Заголовок") or

               (currentValue = "Наряд" and prevValue = "Заголовок" and nextValue = "Заголовок") or

               (currentValue = "Заголовок" and prevValue = "Наряд" and nextValue = "Наряд") then  "Наряд;Заголовок;Заголовок"

       else

           Text.Combine({prevValue, currentValue, nextValue}, ";"),

   // Добавляем новый столбец, используя метаданные столбца ИД_Заголовок

   AddCombinedColumn = Table.AddColumn(Source, "Combined", each List.Accumulate(

       Table.Range(ColumnMetadata, [Index] - 1, 3),  "",

       (state, current) => CombineRows(state, current{0}, current{1})

   ), type text, ColumnMetadata),

  // Проверяем значение столбца Combined и удаляем строки, для которых checkValue = 0

   RemoveRows = Table.SelectRows(AddCombinedColumn, each [Combined] <> null and [checkValue] = 1),

   // Удаляем столбец с метаданными

   RemoveMetadataColumn = Table.RemoveColumns(RemoveRows, "ИД_Заголовок.Metadata")

in

   RemoveMetadataColumn

В этом коде мы получаем метаданные столбца ИД_Заголовок с помощью функции Value.Metadata(), затем используем эти метаданные для определения типа данных и других характеристик столбца при добавлении нового столбца Combined. Это позволяет избежать повторных обращений к данным при выполнении последующих преобразований. Далее мы используем этот столбец для проверки условий и удаления строк, для которых checkValue равен 0.

Power Query. Ускорение процесса объединения текста предыдущей, текущей и последующей строк одного столбца, В Power Query создал запрос, объединяющий текст из предыдущей, текущей и последующей строк одного столбца. Все работает. НО... очень долго. Всего то около 10 тысяч строк. Подскажите, как ускорить обработку. Пример приложен.
 

Вот что пишет по этому поводу Chat GPT.

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

В Power Query метаданные могут быть получены из источника данных при подключении или в процессе выполнения запроса через вызов специальных функций, таких как Table.Schema(), которая возвращает схему таблицы, или Value.Metadata(), которая возвращает метаданные значения в столбце. Эти метаданные могут быть использованы для оптимизации последующих преобразований и сведения к минимуму повторных обращений к данным.

Прилагаю файл с различными кодами решения моей задачи. Вариант с использованием  List.Parallelize(rowIndexes, processRow) у меня не пошел, так как мой Excel из Office365 его не знает. Сейчас пытаюсь определить какой из них все же лучше.

Power Query. Ускорение процесса объединения текста предыдущей, текущей и последующей строк одного столбца, В Power Query создал запрос, объединяющий текст из предыдущей, текущей и последующей строк одного столбца. Все работает. НО... очень долго. Всего то около 10 тысяч строк. Подскажите, как ускорить обработку. Пример приложен.
 
Цитата
написал:
AzatKukanov, ну возможно. Код то попробовали применить на практике?
Если вернуться к вашему коду (к проблемной его части)
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7  8  9  10  11      = Table.AddColumn(          AddIndex,          "Combine"  ,          each            if [Index] = 0 then [Заголовки]            else if [Index] = Table.RowCount(AddIndex) - 1 then [Заголовки] &   " "   &   "Last"            else if [Index] > 0 then              Table.Column(AddIndex,   "Заголовки"  ){[Index] - 1} &   ";"   & [Заголовки] &   ";"   & Table.Column(AddIndex,   "Заголовки"  ){[Index] + 1}            else              null        )   
 
то вот проблемные места:
- else if [Index] > 0 then - это лишнее. Индекс же всегда >= 0 (вы его так определили), а на ноль вы его уже проверили выше.
- Table.Column(AddIndex, "Заголовки") : надо было предварительно присвоить какой-то переменной значение выражения List.Buffer(AddIndex[Заголовки]) и в шаге ссылаться на эту переменную.
- Table.RowCount(AddIndex): то же самое. Предварительно ("снаружи") посчитали это число 1 раз , присвоили значение какой-то переменной и потом ссылаетесь на эту переменную в запросе.
В первой и последней строках в этом случае будет ошибка, так как Индекс выйдет за пределы диапозона. Можно конечно, Индекс или Кол-во строк в каком -либо столбце исходной таблицы загнать в буфер и считать обращаясь к нему. НО... пока я этой необхоимости не вижу.
Мне больше по идейному смыслу нравится подход с использованием метаданных столбцов. Это реально может ускорить обработку
Я со сторонней помощью как-то использовал этот подход. Но я не очень в этом силен
UPD1 Посчитал, что может быть логическая неувязка с тем, что вначале я вычисляю значение первой и последней строки. Сделал по порядку: вначале первая строка, потом иду до последней и завершаю вычислением последней строки. Нет эффекта
UPD2 ввел переменные до конструкции if then else. Ни вижу эффекта.
Изменено: AzatKukanov - 19.04.2023 13:48:36
Power Query. Ускорение процесса объединения текста предыдущей, текущей и последующей строк одного столбца, В Power Query создал запрос, объединяющий текст из предыдущей, текущей и последующей строк одного столбца. Все работает. НО... очень долго. Всего то около 10 тысяч строк. Подскажите, как ускорить обработку. Пример приложен.
 
Цитата
написал:
AzatKukanov, если хотите сократить/ускорить запрос, который в файле, то попробуйте вот это
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7      let          Источник = Excel.CurrentWorkbook(){[Name=  "Табл1"  ]}[Content],          f = (t as table) as table => Table.SelectRows(t, each [Сотрудник] <> null),          gr = Table.Group(Источник, {  "Номер наряда"  ,   "Операция"  }, {{  "all"  , each f(_)}}, GroupKind.Local, (s, c) => Number.From(c[Номер наряда] <> null)),          expand = Table.ExpandTableColumn(gr,   "all"  , {  "Сумма оплаты по наряду"  ,   "Сотрудник"  })    in          expand   
 
но что-то мне подсказывает, что не там вы ищете.
Проблема не на этапе определения строк с номерами Наряд-заказов. Проблема в объединении текста ТРЕХ СТРОК ОДНОГО и ТОГО ЖЕ СТОЛБЦА. До этого шага, включая предпоследний шаг (добавление индекса) все ОК. Потом все повисает
Power Query. Ускорение процесса объединения текста предыдущей, текущей и последующей строк одного столбца, В Power Query создал запрос, объединяющий текст из предыдущей, текущей и последующей строк одного столбца. Все работает. НО... очень долго. Всего то около 10 тысяч строк. Подскажите, как ускорить обработку. Пример приложен.
 
Из 1С выгружаются файлы, в которых за строкой с Наряд-заказа СЛЕДУЮЩИМИ строками прикладывается детализация с данными об Сотрудниках, принимавших участие в данном Наряд-заказе. Сдельная оплата также привязана к этим Наряд-заказам. По неизвестным мне причинам в детализации иногда  приводятся ФИО Сотрудников, но без начисления сдельной оплаты. Тогда в строке по графе оплаты нулевые (null) значения. Отдельные Наряд-заказы не содержат детализации по Сотрудникам, так как им по этим работам начисление ведется по окладной системе. И тогда вэтих строках также оплата и ФИО Сотрудника - null.
Задача удалить номера Наряд-заказов с детализаций с указанием их в строках с детализацией. Эта задача легко решается путем заполнения ВНИЗ. Проблема в определении строк для удаления. Для этой цели был добавлен столбец с идентификацией строк с наличием ФИО Сотрудника: пошел путем исключения - проверяю наличие номера Наряд-заказа при отсутствии ФИО. Еще один дополнительный столбец сформировал за счет применения Индекса путем объединения текстов предыдущей, текущей и последующей строк.
Теперь еще нужна фильтрация.
Проблема в том, что запрос немного подвисает в редакторе. При этом в режиме "Только подключение" файл спокойно закрывается и сохраняется и не санкционированных закрытий нет.
Но самое главное, он виснет напрочь даже без шага фильтрации при выгрузке выходных данных на лист. И это всего-то на 10 тысячах строк. При этом Excel самопроизвольно закрывается после загрузки 4,5 - 5 тысяч строк. А если учесть фильтрацию и увеличение объема данных, то мой и так на этом массиве не работающий код, вообще ничего не даст.
Попробовал List.Accumulate. Но не смог оптимально собрать в один-два шага нужны операции обработки я не смог.
Chat CPT по умного правильно советует брать метаданные столбцов и работать пакетно. И даже пишет код. НО... он не работает. А так как я еще не разобрался в функциях высокого порядка, то и правильно выявить ошибку не могу.
Прошу помощи по ускорению обработки...
P.S. Исходный запрос работает с предыдущими групповыми запросами: объединение файлов из папок. До шага выгрузки код работает более или менее быстро...
UPD1 Столбцов в таблице 25. Двадцать пять. Могу уменьшить частично путем свертывания группы столбцов. НО... мне кажется это не повлияет или совсем незначительно
Изменено: AzatKukanov - 19.04.2023 11:45:24
Power BI. Вход в службу с Microsoft Authenticator, Проблемы входа
 
Переустановил на своем телефоне (Android) приложение Microsoft Authenticator. Перед этим в декабре продлил просроченную лиценцию Microsoft 365. Теперь не могу войти в службу Power BI, так как не могу провести аутентификацию.
Учетная запись лиценции на gmai.com, а рабочий адрес для Power BI - на личном домене exceleducation.ru.
В приложении  Microsoft Authenticator добавил рабочий адрес для Power BI.
При попытках входа в учетные записи Microsoft (gmail и exceleducation) уведомления от корпорации поступают на телефон и без проблем утверждается вход в учетку.
Но при попытке входа в службу Power BI уведомления не приходит и нужно войти альтернативным способом. К сожалению, записанные ранее коды входа не могу найти и альтернативу использовать не могу.
Подскажите, как быть. Или это связано с использованием рабочего адреса, для которого не приобреталась лицензия на Microsoft 365? Или потому, что домен в зоне RU?  
Выборка данных по условию в таблице, построенной функцией Power Query
 
PooHkrd,рахмет (спасибо)! Вначале зациклился на функции обработки выражения, когда она вообще не нужна. Работает просто структура if then else.

Премного благодарен.
Изменено: AzatKukanov - 04.03.2020 08:56:46 (Моя ошибка: невнимательно прочитал формулу, предложенную мне. Потом понял свою ошибку. Все работает)
Выборка данных по условию в таблице, построенной функцией Power Query
 
Доброе время суток, уважаемые форумчане!

По методике https://www.youtube.com/watch?v=_5x-xcUJ0zw  создал функцию fParam  с аргументом Region для ввода в запрос Power Query параметров фильтров с листа EXCEL с последующей встроенной фильтрацией таблицы данных TABLE1.  Все прекрасно работает. НО...

При пустой ячейке значения параметра на листе EXCEL запрос (при отсутствии пустых значений в столбце фильтрации) выдает результирующую пустую таблицу. А хочется в этом случае получить всю таблицу без фильтрации.

Какие возможны варианты решения такой задачи?

Сам я попытался использовать вычисление выражений в языке М с использованием конструкции if then else:
Код
Expression.Evaluate ( if fParam("Region")=null then Table.SelectRows(#TABLE1, each true) else Table.SelectRows(#TABLE1, each [REGIONs]=fParam("Region")))

Естественно ругается, что ошибка с типами данных. А как решить проблему с учетом отсутсвия достаточных знаний не знаю. Буду благодарен за подсказку.
PQ. Замена значений по нескольким условиям
 
DrillPipe,спасибо за разъяснение.  
PQ. Замена значений по нескольким условиям
 
Андрей VG,приветствую.
Попытаюсь изложить понимание Вашего решения:
1.Преобразуем таблицу соответствия в Список:  List.Buffer(Table.ToRecords(Источник))
2. Группируем таблицу исходных данных по столбцу, подлежащему исправлению.Заодно определяем эти группировки как ключ, то есть уникальные. В созданном столбце temp храним сгруппированные таблицы.
3. Преобразуем исходную таблицу формулой Table.TransformColumns, используя в качестве функции трансформации выражение, заключенное в фигурные скобки.
4. В фигурных скобках работает пользовательская функция (source), которая использует в качестве вычисляемого выражения для первой функции List.Accumulate с объявленными аргументами (acc, pair) для листа  функцию замены пар Text.Replace(acc, pair[ВХОД], pair[ВЫХОД]).
Вот тут мне и возникли вопросы:то что Text.Replace передает пары в функции аккумулятора понятно, но где здесь исходный источник, ведь для накопления берется лист ПОДСТАНОВКА. А исходный текст используется только в самой трансформации.
Или эта конструкция работает в итерации: вначале пара из таблицы соответствия (тип List) для замены, потом это передается в исходный текст с накоплением переданной пары в аккумуляторе, потом возвращаемся к аккумулятору, тот запрашивает новую пару (??? - по строке вниз или не совпадающей с уже накопленными парами) и по этой новой паре идет замена в функции трансформации.
5. Разворачиваем полученную на предыдущем шаге таблицу: разворачиваются таблицы столбца temp с колонками "Программы","Задачи" в одноименные столбцы новой таблицы.
6. Приводим таблицу в завершенный вид.
Приношу извинения за возможно технически неграмотный текст, но я не спец в языках программирования. Я чаще всего использую готовые модули с общим пониманием концепта решения. НО... эффективное использование возможностей PQ, PPivot и PBI, на мой взгляд, требуют понимания нюансов соответствия типа данных используемым переменных, понимания механизмов, в том числе внутренних, работы той или иной функции. Иначе как делал я 300 и более шагов, так и буду. И тогда смысл использования надстроек пропадает окончательно. Надеюсь с помощью формучан всетаки освоить хоть какие-то азы
PQ. Замена значений по нескольким условиям
 
Андрей VG,рахмет (спасибо). Сейчас пытаюсь определиться с логикой Вашего кода. arturH также отправил свой вариант с рекурсией. У нас уже ночь. Все остается на завтра. Еще раз спасибо за оперативный ответ.
PQ. Замена значений по нескольким условиям
 
Приветствую всех форумчан! Нужна помощь в написании кода в Power Query замены фрагмента списка, при том что заменяемый фрагмент содержит внутри те же разделители, что и весь список. То есть в ряду ячейки содержат список ответственных, разделенных запятыми:
{МВД,МИД, акиматы Алматы, Нур-Султана и областей, НБ},
{Акиматы областей,гг. Алматы, Нур-Султана,МВД,МИД, НБ},
и так далее
и требуется замена по таблице соответствия:
акиматы Алматы, Нур-Султана и областей       = МИО
Акиматы областей,гг. Алматы, Нур-Султана      =МИО
Понятно, что имеется значительно больше чем две строки как в основной таблице, так и в таблице соответствия.
А так получается, что делаю порядка 300 шагов по замене,что сильно тормозит запрос.
И нашел пока единственный выход: на основе этих шагов создал таблицу соответствия полного текста ячеек с исправленными вручную, убрал эти шаги через  через слияние. запросов.
Понимаю, что нужно организовать внутри функции Table.ReplaceValue цикл перебора, но увы не обладаю достаточными знаниями в создании вложенных функций, а тем более с учетом преобразований в лист, преобразованием форматов на лету и так далее. Буду рад любой методической помощи, так как на этом примере хочу понять механизм таких формул и преобразований.
P.S. В теме "Замена значений в PowerQuery, Заменить несколько значений в столбце одним шагом в PQ" решение касается только замены всей ячейки.
Изменено: AzatKukanov - 30.08.2019 19:27:39
Страницы: 1
Наверх