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

Страницы: 1 2 След.
Нехватка данных в источнике при пагинации посредством Power Query
 
AlienSx,  спасибо, код работает. Правда, результат запроса выводит определенное количество строк, в которых во всех ячейках выводится значение "Error". С этим надо будет разбираться, почему это так.
Нехватка данных в источнике при пагинации посредством Power Query
 
nilske,  благодарю за информацию, изучу. Но, насколько понимаю, наличие токена не обязательно для решения этой задачи.  Достаточно много  раз исполнял код, но проблем с капчой не было
Изменено: Sergey Chernichenko - 22.11.2023 15:38:09
Нехватка данных в источнике при пагинации посредством Power Query
 
Цитата
AlienSx написал:
где вы этот код взяли я не знаю, но может лучше его автор разберется в этих хитросплетениях?

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

Цитата
nilske написал:
Sergey Chernichenko , токен доступа разве не требуется?
nilske, без токена код по url видит всю информацию. Насколько понимаю, в данном случае токен не нужен.
Изменено: Sergey Chernichenko - 22.11.2023 15:18:02
Нехватка данных в источнике при пагинации посредством Power Query
 
Уважаемые форумчане, приветствую! Прошу помощи в решении возникшей трудности при парсинге посредством Power Query. С сайта-источнике отдача происходит по 100 строк на странице, максимум 20 страниц (максимум 2000 строк). Но бывает, что в источнике страниц меньше, чем фиксированного в Power Query. В этом случае возникает ошибка. Изучил у Илья Назаров предложенный им  "API в Power Query часть 2: пагинация", попробовал перенести на свою задачу, но не получил требуемого результата. Код выводит в итог запроса только первые 100 строк, а на 101 строке во всех столбцах фиксирует ошибку. Если кто-то сможет помочь в решении данной задачи, буду крайне благодарен. При текущем указанном url в источнике содержится в районе 450 строк.

Код
let
  
   url = "https://api.hh.ru/vacancies?text=агроном",
   
    parameters = [
        per_page = "100"
    ],
    
    getPage = ( optional page ) => let
        response = Web.Contents(url, [
            Query = parameters & [ page = Text.From( page ?? 0 ) ], //as record
            // page ?? 0 === if page = null then 0 else page
            ManualStatusHandling = { 400, 403, 406, 409 } 
        ]),
        metadata = Value.Metadata(response),
        buffer = Binary.Buffer( response ),
        status = metadata[Response.Status],
        json = try Json.Document( buffer ),
        result = if not json[HasError] and status >=200 and status < 300 
            then json[Value][items]
            else error Error.Record(json[Value][error],json[Value][description],json[Value][message])
    in result,

    getNextPage = ( previousPage ) => let
        metadata = Value.Metadata( previousPage ),
        page = metadata[page],
        nextPage = Function.InvokeAfter( () => getPage( page + 1 ), #duration(0,0,0,1/5) )
    in nextPage,

    pages = List.Generate(
        () => getPage(),
        each _ <> {},
        each getNextPage ( _ )
    ),

    result = Table.FromRecords( List.Combine( pages ) )
in
    result
Расчет коэффициента сезонности
 
Вроде как нашел решение. Возможно, не очень оптимальное, но работает. Выкладываю, вдруг кому пригодится:
Код
КоэффСезонности = VAR EndData = DATE(2021,12,31)
VAR Period = 
MAXX(
    FILTER(
        '_Константы',
        '_Константы'[Константа] = "Количество периодов сезонности, лет"
    ),
    '_Константы'[Значение]
)
var StartData = EDATE(EndData,- Period*12)
VAR MonthsValues = 
CALCULATETABLE(
    ADDCOLUMNS ( 
        VALUES ( '_Календарь'[№_месяца] ), 
            "@sum", 
                CALCULATE ( SUM ( 'Операции'[Количество] ) )           
                ), 
                FILTER(ALL('_Календарь'[Дата]),'_Календарь'[Дата] > StartData && '_Календарь'[Дата] <= EndData))
VAR sredZnach = 
    AVERAGEX(
            MonthsValues,
        [@sum]
    )   
VAR OperMonth = 
   CALCULATE(
       SUM('Операции'[Количество]),
            ALLEXCEPT('_Календарь','_Календарь'[№_месяца]),
                        FILTER('_Календарь','_Календарь'[Дата] > StartData && '_Календарь'[Дата] <= EndData)
            )
var KoeffSezon = 
        DIVIDE(OperMonth, sredZnach)
    return
KoeffSezon
Ссылка на ячейки в мерах DAX Power Pivot/Power BI, Как ссылаться на данные в ячейках при построении/написании мер
 
Предполагаю, что нужно создать таблицу менеджеров и связать её с таблицей продаж. Но для точного диагноза нужна ваша модель, которую нужно выложить
Изменено: Sergey Chernichenko - 29.09.2022 14:18:03
Расчет коэффициента сезонности
 
Уважаемые форумчане, приветствую вас! Есть потребность в помощи при расчете коэффициента сезонности продаж. Имеется таблица продаж ("Операции"), в которой приведены строки ежедневных продаж за несколько лет. Коэффициент сезонности рассчитываю по следующему алгоритму:
1. Агрегатирую количество продаж за несколько лет по номеру месяца продаж.
2. Вычисляю среднее количество продаж по агрегатированным 12 месяцам.
3. Вычисляю коэффициент сезонности в помесячной разбивке, как деление агрегатированных продаж в конкретном месяце к среднему (п.2).
Код
КоэффСезонности = 
VAR EndData = CALCULATE (MAX('Операции'[Дата]),ALL())
VAR Period = 
MAXX(
    FILTER(
        '_Константы',
        '_Константы'[Константа] = "Количество периодов сезонности, лет"
    ),
    '_Константы'[Значение]
)
var StartData = EDATE(EndData,- Period*12)
VAR MonthsValues =
CALCULATETABLE(
    ADDCOLUMNS ( 
        VALUES ( '_Календарь'[№_месяца] ), 
            "@sum", 
                CALCULATE ( SUM ( 'Операции'[Количество] ) )           
                ), 
                FILTER(ALL('_Календарь'[Дата]),'_Календарь'[Дата] > StartData && '_Календарь'[Дата] <= EndData))
VAR sredZnach = 
    AVERAGEX(
            MonthsValues,
        [@sum]
    )

Первые два пункта описал в коде, а как вывести сумму агрегатированных продаж в конкретном месяце и соотнести к пункту 2 не понимаю. Буду благодарен за помощь в данном вопросе
Изменено: Sergey Chernichenko - 29.09.2022 12:15:46
Расчет стандартного отклонения и коэффициента вариации при отсутствующих данных в периодах
 
понял. Не туда вносил фильтрацию по датам. Код должен выглядеть так:
Код
VAR YearMonthsValues = 
CALCULATETABLE(
    ADDCOLUMNS ( 
        VALUES ( '_КалендарьAUTO'[ГодМесяц] ), 
            "@sum", 
                VAR curSum = CALCULATE ( SUM ( 'Оборот'[ОборотКолич]) ) 
                VAR resSum = IF ( ISBLANK ( curSum ), 0, curSUM )
      RETURN resSum
                ), 
                FILTER(ALL('_КалендарьAUTO'[Дата]),'_КалендарьAUTO'[Дата] >= StartData && '_КалендарьAUTO'[Дата] <= EndData))

Теперь всё работает. surkenny, спасибо за помощь!
Расчет стандартного отклонения и коэффициента вариации при отсутствующих данных в периодах
 
surkenny, понял, в чем была моя ошибка в предыдущем посте. Для функции AVERAGEX  требовалось добавить ссылку на столбец (квадратные скобки), а я вставлял без них. Конечный код выглядит так:
Код
КоэффВариацииСпуст = 
VAR monthsValues = 
ADDCOLUMNS ( 
   VALUES ( '_КалендарьAUTO'[Month] ), 
   "@sum", 
      VAR curSum = CALCULATE ( SUM ( 'Оборот'[ОборотКолич] ) ) 
      VAR resSum = IF ( ISBLANK ( curSum ), 0, curSUM )
      RETURN resSum
)
VAR sredZnach = 
IF (
    NOT HASONEFILTER ( '_КалендарьAUTO'[Month] ),
    AVERAGEX(
        monthsValues,
        [@sum]
    )
)
VAR standOtkl = 
IF (
    NOT HASONEFILTER ( '_КалендарьAUTO'[Month] ),
    STDEVX.P(
        monthsValues,
        [@sum]
    )
)
return
DIVIDE(standOtkl,sredZnach)

surkenny, спасибо! На всякий случай выкладываю файл с данным кодом, вдруг кому пригодится. И еще вопрос по теме. Этот код работает по внешним фильтрам дат. Как сделать так, чтобы он брал данные только за последние 6 месяцев вне зависимости от внешних фильтров дат на визуализации? Попытался это сделать, внедрив фильтрацию в момент формирования таблицы:
Код
VAR YearMonthsValues = ADDCOLUMNS ( 
   VALUES ( '_КалендарьAUTO'[ГодМесяц] ), 
   "@sum", 
      VAR curSum = CALCULATE ( SUM ( 'Оборот'[ОборотКолич]  ), 
                    DATESBETWEEN('_КалендарьAUTO'[Дата], StartData, EndData ) )
      VAR resSum = IF ( ISBLANK ( curSum ), 0, curSUM )
      RETURN resSum
)

Но расчет при этом сломался, он перестал видеть месяцы с нулевыми значениями.
Изменено: Sergey Chernichenko - 02.09.2022 13:46:11
Расчет стандартного отклонения и коэффициента вариации при отсутствующих данных в периодах
 
surkenny, код ваш, а то, что он продублирован в коде - это уже моё творчество. Month - да, это столбец с наименованием месяца, принимаю, что нужно брать YearMonth, ценное замечание, спасибо.
Алгоритм расчета понятен, но попробовал по вашему примеру рассчитать среднее, не получилось:
Код
СреднЗначКорр =     
AVERAGE(
        ADDCOLUMNS ( 
                VALUES ( '_КалендарьAUTO'[Month] ), 
                    "sumkol", 
                VAR curSum = CALCULATE ( SUM ( 'Оборот'[ОборотКолич] ) ) 
                VAR resSum = IF ( ISBLANK ( curSum ), 0, curSUM )
         RETURN resSum
        )
    )  
Если использую AVERAGE, пишет, - "Функция "AVERAGE" принимает в качестве аргумента только ссылку на столбец". А если AVERAGEX - "Функции AVERAGEX передано слишком мало аргументов. Минимальное число аргументов для этой функции составляет 2". Никак не пойму, что необходимо добавить, чтобы он начал считать.
Изменено: Sergey Chernichenko - 02.09.2022 00:03:56
Расчет стандартного отклонения и коэффициента вариации при отсутствующих данных в периодах
 
Уважаемые форумчане, добрый день! Выявилась потребность в расчете  коэффициента вариации. Как мы все знаем, это соотношение стандартного отклонения к среднему значению. В исходных данных детализация оборота - по дням,  требуемое значение вариации необходимо рассчитать с помесячной агрегацией.  Написал такой код (подсмотрел у surkenny, спасибо):

Код
КоэффВариации = 
var standOtkl = 
IF (
    NOT HASONEFILTER ( '_КалендарьAUTO'[Month] ),
    STDEVX.P (
        ADDCOLUMNS (
            SUMMARIZE ( FILTER ( 'Оборот', 'Оборот'[ОборотКолич] <> BLANK () ), '_КалендарьAUTO'[Month]),
            "w", CALCULATE ( SUM ( 'Оборот'[ОборотКолич] ) )
        ),
        [w]
    )
)
var sredZnach = 
IF (
    NOT HASONEFILTER ( '_КалендарьAUTO'[Month] ),
    AVERAGEX(
        ADDCOLUMNS (
            SUMMARIZE ( FILTER ( 'Оборот', 'Оборот'[ОборотКолич] <> BLANK () ), '_КалендарьAUTO'[Month]),
            "w", CALCULATE ( SUM ( 'Оборот'[ОборотКолич] ) )
        ),
        [w]
    )
)
return
 DIVIDE(standOtkl,sredZnach)

Код работает, но только в случае, когда во всех месяцах есть строки с данными по обороту. Если в каком-либо месяце оборота нет (нет строк в исходнике), код не воспринимает этот месяц. А для корректности требуемой задачи должен принимать исходные данные, как нулевые по этому месяцу и производить расчет стандартного отклонения, среднего значения и коэффициента вариации с учетом всех этих нулевых месяцев. Буду благодарен, если кто-нибудь сможет подсказать решение данной задачи.

Изменено: Sergey Chernichenko - 01.09.2022 16:44:56
Расчет ежедневных остатков при наличии данных по остаткам на промежуточные даты
 
surkenny, прошу прощения за задержку с ответом. Да, согласен, моя цитируемая вами фраза некорректна. Попытался на реальной модели посчитать ежедневную оборачиваемость каждой номенклатуры (соотношение продаж за предыдущий месяц к среднему остатку), рассчитанному по вышеуказанной методологии, но 64 Гб оперативной памяти не хватило для данного действия. Хотя, если таблица остатков на каждый день не расчетная из двух таблиц, как у меня в примере,  а загружаемая единая, он с ней справляется. Наверное, очень большой объём информации приходится держать в оперативке. Одну номенклатурную позицию считает быстро и нормально, при 300 позиций говорит, что не хватает памяти. Буду думать. В любом случае, ваша помощь в расчете конечных остатков и открытие по обработке мер через SUMX были очень ценны для меня, за что я вам крайне благодарен.
Расчет ежедневных остатков при наличии данных по остаткам на промежуточные даты
 
surkenny, спасибо! Ранее я пытался создать, подобную конструкцию, но не с SUMX, а с SUM. У меня ничего не получилось и я сделал для себя вывод, что этот вариант не работает и всё нужно загонять в меру. Оказывается, я ошибался с оператором и, на самом деле, всё считает. Если SUMX считает, значит, по идее, и CALCULATE может считать скользящую оборачиваемость на каждую дату (отношение продаж за промежуток с текущей даты до даты минус 30 дней к среднему остатку за этот же промежуток времени). Хотя, возможно, не CALCULATE, а CALCULATETABLE, судя по обсуждаемому коду.
Расчет ежедневных остатков при наличии данных по остаткам на промежуточные даты
 
surkenny, спасибо за дополнительную информацию! В коде сообщения #3 при тестировании выявил неточность - если смотреть по одной номенклатурной позиции, считает правильно, если несколько - нет. Для себя выявил, что MIN необходимо заменить на SUM, т.е.
Код
VAR initialStock =    CALCULATE (
        MIN ( 'ПромежИтоги'[ПромежКоличество] ),
        ALL ( '_КалендарьAUTO' ),
        '_КалендарьAUTO'[Data] = initialStockDate
поменять на
Код
VAR initialStock =    CALCULATE (
        SUM ( 'ПромежИтоги'[ПромежКоличество] ),
        ALL ( '_КалендарьAUTO' ),
        '_КалендарьAUTO'[Data] = initialStockDate

Вроде бы и по логике правильно.

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

И, если будет возможность ответить, задам ещё один вопрос. Мера сейчас рассчитывает остаток на каждый день. А как получить сумму этих значений по каждому дню (чтобы в дальнейшем использовать данные для расчета оборачиваемости)? Какой-то цикл надо организовывать?

Расчет ежедневных остатков при наличии данных по остаткам на промежуточные даты
 
surkenny, благодарю за помощь! В коде разобрался, понял в чем была ошибка моей логики. Особенно приятно, что код дополнен "невыводом" данных, лежащих за пределами временного среза. Это мелочь, но однозначно показатель работы эксперта - профессионала. Ну и из кода вы убрали MAXX+FILTER, значит Максим Зеленский не будет хмурить на меня брови))).
Расчет ежедневных остатков при наличии данных по остаткам на промежуточные даты
 
Кстати, пока просматривал подобный вопрос не форуме, увидел, что Максим Зеленский написал, что "...ну и MAXX+FILTER - это же ужас-ужас с точки зрения производительности...". А у меня в коде эта конструкция присутствует.  
Расчет ежедневных остатков при наличии данных по остаткам на промежуточные даты
 
Уважаемые форумчане, добрый день! Выявилась проблема с расчетом ежедневных остатков. Есть промежуточные ежемесячные данные по остаткам на 1-й день месяца (1 января, 1 февраля и т.д.) и есть оборот (приходы, расходы) по каждому дню в отдельной таблице. Необходимо рассчитать начальный и конечный остаток каждого дня.
Логику расчета конечного остатка понимаю - надо вычислить ближайшую, более раннюю дату промежуточного остатка  к минимальной дате установленного срезом временного промежутка. И затем к вычисленному на эту дату промежуточному остатку прибавить обороты за промежуток с даты этого промежуточного остатка до максимальной даты среза. Попытался создать меру по этому алгоритму.
Код
КонечныйОстаток = var MinDate = MIN('_КалендарьAUTO'[Data])
var MaxDate = MAX('_КалендарьAUTO'[Data])
var DateUst = 
    maxx(
        filter(
            'ПромежИтоги',
            'ПромежИтоги'[Дата]>=MinDate&&
            'ПромежИтоги'[Дата]<=MaxDate
        ),
        'ПромежИтоги'[Дата]
    )
return
CALCULATE(
    SUM('Оборот'[ОборотКолич]),
    FILTER(
        ALL('_КалендарьAUTO'),
        '_КалендарьAUTO'[Data]>=DateUst&&
        '_КалендарьAUTO'[Data]<=MaxDate
        )
)+
CALCULATE(
    SUM('ПромежИтоги'[ПромежКоличество]),
        FILTER(
                ALL('_КалендарьAUTO'),
                '_КалендарьAUTO'[Data] = DateUst
            )
)

Но она считает неправильно. Просьба помочь в решении вопроса.
Анализ "Что-Если" в Power BI
 
surkenny, спасибо, однозначно не обижусь. Буду разбираться
Анализ "Что-Если" в Power BI
 
Вариант с MAX работает:
Код
VAR curDate = MAX('Тест (2)'[Месяц])
Но насколько это правильно, не смогу оценить
Анализ "Что-Если" в Power BI
 
surkenny, решил не выдумывать велосипед, но на мере так же споткнулся. Если просто перегнать код столбца в меру, то ругается на переменную
Код
VAR curDate = 'Тест (2)'[Месяц]

В вычисляемом столбце он эту конструкцию принимает. Пока не пойму, как это победить. Если не трудно, помогите с данной проблемой.

Анализ "Что-Если" в Power BI
 
surkenny, спасибо, не буду выдумывать велосипед. Перегоню вычисляемые столбцы модели в меры. Производительность нужна, появились проблемы с долгим обновлением
Анализ "Что-Если" в Power BI
 
surkenny, благодарю за помощь! Да, как Вы верно подметили, я пытаюсь организовать расчеты в вычисляемых столбцах, чтобы видеть этапы вычисления и обезопасить себя от возможных логических ошибок. Но, с Ваших слов я понял, что "подружить" вычисляемые столбцы внутренних таблиц с внешним параметром (движком) не получится. Буду думать про перенос расчета из вычисляемых столбцов в меры. Про SELECTEDVALUE я знал, пробовал применить для этой задачи, но решения не получилось.
Ранее видел в каком-то источнике, что организовывают связь между таблицей параметра и таблицей, в вычислениях которой требуется использование данного параметра. Сейчас  его не нашел. Если найду, выложу в текущую ветку.  
Анализ "Что-Если" в Power BI
 
Добрый день! Есть необходимость в организации анализа "What if" в Power BI. Для этого в Моделировании создал параметр "Множитель расхода" и создал формулу расчета в таблице Тест (2) РасходМножитель:
Код
РасходМножитель = 'Тест (2)'[Расход]*'Множитель расхода'[Значение Множитель расхода]

Но на изменение движка "Множитель расхода" никак не происходит вывод данных и их изменение в таблице. Подчеркну, что изменение необходимо именно в таблице Тест (2). Возможно требуется другая формула, но я не знаю, какая. Просьба помочь по данному вопросу.
Изменено: Sergey Chernichenko - 04.05.2022 12:02:04 (Вложение)
Расчет приходов и остатков по периодам
 
surkenny, спасибо за наставничество и совет!
Расчет приходов и остатков по периодам
 
surkenny, понял, спасибо! Возник ещё вопрос. Данный расчет прихода производится с учетом  расхода следующего месяца. А если требуется, чтобы конечный остаток текущего месяца составлял какую-то долю (например, 50% от расхода следующего месяца или 150%), как это можно организовать?

Я в блок вычисления расхода ввёл коэффициент 0.5, но расчет воспринял это как просто уменьшение расхода в 2 раза и пересчитал не так, как было необходимо. Конечный ежемесячный остаток ушел в минус
Код
VAR expNextMonth =    CALCULATE (
        SUM ( 'Тест (2)'[Расход] ),
        ALLEXCEPT ( 'Тест (2)', 'Тест (2)'[Товар] ),
        'Тест (2)'[Месяц] = EDATE ( curDate, 1 )
    ) 
        *0.5
Изменено: Sergey Chernichenko - 25.04.2022 09:50:39 (Корректировка)
Расчет приходов и остатков по периодам
 
surkenny, благодарю и за это решение. Не совсем понял блок программного кода в расчете Прихода:
Код
VAR stok =    CALCULATE (
        MAX ( 'Тест (2)'[Начальный остаток] ),
        ALLEXCEPT ( 'Тест (2)', 'Тест (2)'[Товар] ),
        CALCULATETABLE (
            FIRSTDATE ( 'Тест (2)'[Месяц] ),
            ALLEXCEPT ( 'Тест (2)', 'Тест (2)'[Товар] )
        )
    )
Я заменил его на:
Код
VAR stok =    CALCULATE (
       MAX ( 'Тест (2)'[Начальный остаток] ),
       ALLEXCEPT ( 'Тест (2)', 'Тест (2)'[Товар] ),
       'Тест (2)'[Месяц] <= curDate
    ) 

Если не трудно, оцените, возможно ли его так заменить.  
Изменено: Sergey Chernichenko - 24.04.2022 22:36:10 (Вложение файла)
Расчет приходов и остатков по периодам
 
surkenny, потревожу ещё с вопросом по теме.

1. Этот расчет приведен для варианта без начального остатка. А если он есть (например, 200) на начало расчетов. Где он должен в коде присутствовать?
2. Сейчас расчет прихода и остатков показывает только необходимый объём расхода с кратностью 50. А если нужен запас (остаток) в размере следующего месяца расходов, как это в коде организовать?
Расчет приходов и остатков по периодам
 
surkenny, искренне благодарю за потраченное на моё обучение и решение задачи силы и время! Если нужно что-то большее, дайте знать.
Расчет приходов и остатков по периодам
 
surkenny, спасибо, понял. Замена ALL на ALLEXCEPT дает необходимый эффект. Но математика расчета не бьется почему-то. Январь - нормально (Приход 200, Расход -181, Остаток - 19).

Но февраль (Остаток предыдущего месяца - 19, Приход - 250, Расход - 206) должен выводить 63, а выводит 13 (разница 50).
Март - (Остаток предыдущего месяца - 63, Приход - 350, Расход - 293) должен выводить 120, а выводит 20 (разница 100).
Апрель - (Остаток предыдущего месяца - 120,  Приход - 450, Расход - 418) должен выводить 152, а выводит 2 (разница 150).
Май - (Остаток предыдущего месяца - 152,  Приход - 350, Расход - 329) должен выводить 173, а выводит 23 (разница 150) и т.д.

Где-то в коде захватывает дополнительное количество кратности (округления). Не совсем понятно где, логики н вижу. Приход рассчитывается в увеличенном объёме. А остаток получается правильным (тем, который необходим для данной задачи - не более количества кратности)
Расчет приходов и остатков по периодам
 
surkenny спасибо за ваш вариант! Но мне требуется получить данные не в сводной таблице визуализации, а в самой таблице. На основании вашего кода создал в таблице дополнительно 2 столбца (Прих и ОстатКонМес), но он выдает в каждой ячейке итоговое значение. Это проблема календаря? Создал отдельно календарь, но как получить данные в таблице, как и в итоговой визуализации пока не пойму.
Страницы: 1 2 След.
Наверх