Страницы: 1
RSS
Группировка событий с условием непрерывности дат
 
Доброго времени!
такая задача - есть события А, Б, В, которые периодически повторяются. Могут повторяться ежедневно, могут - с бОльшими интервалами.
необходимо их сгруппировать по признаку продолжительности интервала.
в примере - как только интервал больше суток должна следовать отдельная группировка
В идеале - интервал для отдельной группировки должен настраиваться вручную (вообще в задаче 60 суток).
пробовал в PowerQuery, но знаний не хватает.
 
Цитата
vandervekken написал:
пробовал в PowerQuery
я бы так делал:
Код
 let
    f=(x) =>[   cols = Table.ToColumns(x),
                nms = Table.ColumnNames(x),
                adc = {List.First(cols{1})}&List.RemoveLastN(cols{1},1),
                tbl = Table.FromColumns(cols&{adc},nms&{"Prev"}),
                add = Table.AddColumn(tbl,"diff",(x)=>Duration.TotalDays(x[дата]-x[Prev])),
                slt = Table.SelectColumns(add,nms&{"diff"}),
                grp = Table.Group(  slt,
                                    "diff",
                                    {"tmp",each Text.Combine(List.Transform([дата],Text.From),"#(lf)")},
                                    GroupKind.Local,
                                    (s,c)=>Number.From(c>1)
                                    )[tmp]
                ][grp],

    from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    typ = Table.TransformColumnTypes(from,{{"дата", type date}}),
    group = Table.Group(typ, "событие", {"даты", f}),
    to = Table.ExpandListColumn(group, "даты")
in
    to
Каждому For свой Next
 
Цитата
buchlotnik написал:
я бы так делал
спасибо, работает!
но немного не так, как надо))
мой косяк - неправильно изложил задачу
Предложенное решение группирует даты с шагом один день, а надо группировать с шагом, не превышающим заданное значение
То есть если заданное значение 10, то группироваться должны все даты, разница между которыми меньше 10:
1, 3, 4, 7
17, 22, 30
10, 12, 21
и и.д.
здесь речь идёт о процессе, который если не возобновляется через определенный период, считается оконченным и начинается заново с момента события, превышающего заданный период

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

Через два месяца и один день человек начал кашлять снова, и тогда мы считаем, что это новая болезнь.
реальная задача к медицине отношения не имеет)
и хотелось бы чтобы срок выздоровления можно было задавать вручную
 
Цитата
vandervekken написал:
решение группирует даты с шагом один день, а надо группировать с шагом, не превышающим заданное значение
мдя? вот этот кусок кода за что по вашему отвечает?
Цитата
buchlotnik написал:
Number.From(c>1)
Каждому For свой Next
 
Цитата
buchlotnik написал:
вот этот кусок кода за что по вашему отвечает?
Привет, Михаил.
А ТСу нужно заниматься анализом разбором кода? Он же к гуру за решением под ключ пришёл, а не заниматься самосовершенствованием - это только один раз нужно, да и вообще он тётушке своей помогает, так как её подругу на работе такой задачей загрузили, а она переживает шибко :)
 
Цитата
Андрей VG написал: тётушке своей
))
ну что вы так сразу... хотя суть схвачена. Сижу, смущаюсь

Цитата
buchlotnik написал: кусок кода за
спасибо! тетушка Вас не забудет!
просто, реально, все Вами изложенное для меня сложновато в условиях дефицита времени

Ещё раз спасибо!
 
Цитата
vandervekken написал:
все Вами изложенное для меня сложновато
отсылка к хроническому кашлю сложновато с моим высшим фармацевтическим
Каждому For свой Next
 
Цитата
vandervekken написал: высшим фармацевтическим
эхх... придумать бы куда в Ваш код засунуть List.Count и тоже можно было бы считать  себя немножко фармацевтом...
 
Цитата
vandervekken написал:
куда в Ваш код засунуть List.Count
с какой целью? это работа врачей - анамнез клещами вытягивать...
Каждому For свой Next
 
Цитата
buchlotnik написал:
с какой целью?
чтоб рецидив сколько раз чихнул пальцы не загибать)
 
мдя, как хотите, спасение утопающих...
Каждому For свой Next
 
Цитата
vandervekken написал:
спасение утопающих
спасутся страждущиевнутренний перфекционист категорически протестует колхозить предложенный код дополнительными итерациями
ибо присутствует чуйка что можно дополнить элегантно
внутренний колхозник предельно циничен
 
Код
let
    f=(x) =>[   cols = Table.ToColumns(x),
                nms = Table.ColumnNames(x),
                adc = {List.First(cols{1})}&List.RemoveLastN(cols{1},1),
                tbl = Table.FromColumns(cols&{adc},nms&{"Prev"}),
                add = Table.AddColumn(tbl,"diff",(x)=>Duration.TotalDays(x[дата]-x[Prev])),
                slt = Table.SelectColumns(add,nms&{"diff"}),
                grp = Table.Group(  slt,
                                    "diff",
                                    {
                                     {"даты",each Text.Combine(List.Transform([дата],Text.From),"#(lf)")},
                                     {"количество",each List.Count([дата])}
                                    },
                                    GroupKind.Local,
                                    (s,c)=>Number.From(c>1)
                                    )[[даты],[количество]]
                ][grp],

    from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    typ = Table.TransformColumnTypes(from,{{"дата", type date}}),
    group = Table.Group(typ, "событие", {"даты", f}),
    to = Table.ExpandTableColumn(group, "даты",{"даты","количество"})
in
    to
Изменено: buchlotnik - 04.05.2021 20:46:33
Каждому For свой Next
 
Спасибо!
а то у меня победил колхозник
и этого лучше не видеть
ночные кошмары, несварение желудка и утрата веры в Человечество гарантированы
 
Цитата
vandervekken написал:
победил колхозники этого лучше не видеть
разбор полетов гораздо лучше прокачивает скилл в сравнении с контролцеканьем "правильных" решений
Каждому For свой Next
 
Цитата
buchlotnik написал:
гораздо лучше
знаю
и даже может когда-нибудь разберусильно не факт, но интерес есть
в любом случае выхлоп в наличии
ТС и топиквьюверы поупражнялись в словоблудии
ТС вдобавок не перенапрягся (не из лени, а из сохранения энергии)
гуру повысил скилл нетривиальной (нуачо?) задачей и вообще в глазах общества плюс карма потому что ему будут камлать минимум двадцать четыре бездельника которым теперь не надо восстанавливать три года назад похеренные отчёты перед проверкой)
 
Цитата
vandervekken написал:
нетривиальной (нуачо?) задачей
ну а ничо - в чём нетривиальность?
понимаю, если бы это на поток ставить и желать что-то такое соорудить:
Код
let
    from = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    typ = Table.TransformColumnTypes(from,{{"дата", type date}}),
    group = Table.Group(typ, "событие", {"tmp", each ГруппировкаПоРазницеДат(_,"дата",1,"#(lf)")}),
    to = Table.ExpandTableColumn(group, "tmp",{"даты","количество"})
in
    to

тогда да - при написании функции с непривычки может быть и "сложновато"
ГруппировкаПоРазницеДат
Изменено: buchlotnik - 05.05.2021 13:08:08
Каждому For свой Next
 
Цитата
buchlotnik написал:
понимаю, если бы это на поток ставить
честно говоря, мне почему-то кажется что все решения в PQ довольно штучныев любом случае, огромное спасибо за участие!
кстати, впиливая первое решение в реальную задачу испытал мимолетное понимание сделанного и ощущение собственной небезнадежности
так что некоторый воспитательный эффект достигнут
больше вариантов не надо, мозг и так на пределе)
 
Цитата
vandervekken написал:
кажется что все решения в PQ довольно штучные
только кажется, поверьте
Каждому For свой Next
Страницы: 1
Читают тему (гостей: 1)
Наверх