Уже больше месяца экспериментирую, исследую, как разные схемы (паттерны) осознанного дыхания влияют на вариабельность сердечного ритма (Heart Rate Variability, HRV на чуждом языке). В скромной, но не совсем уж крошечной Excel-таблице со столбцами “Паттерн”, “HRV”, “Пульс” набралось 258 записей и мне понадобилось выбрать победителя — дыхательный паттерн, дающий на выходе максимальное значение HRV. Не вручную же сортировать эти записи!
Да, я знаю: есть Pivot Table & Power Query. Но Pivot Table мне не по душе необходимостью после каждого изменения таблицы-источника делать REFRESH, во-первых, избыточной сложностью создания, во-вторых. И просто так не нравятся Pivot Table, что главное. Что же касается Power Query, то сочетание слов вызывает у меня трепет и учащенное сердцебиение: не понимаю, что это за зверь такой и насколько он страшный или полезный.
Поэтому для подсчета результатов — и выбора победителя — применил относительно недавно появившуюся в Excel функцию GROUPBY в связке с XLOOKUP. И, раз уж пришлось группировать данные, решил сравнить нативные функции Excel с GROUPBY от Pandas (мы ведь помним, что сейчас Python можно запустить внутри Excel).
Написал простой код:
df = xl("Table5[#All]", headers=True) df = df.dropna(subset=['HRV']) #select patterns which are recorded >= 6 times patterns = df.breathing_pattern.to_list() patterns = list(set([i for i in patterns if patterns.count(i) >= 6])) df = df[df.breathing_pattern.isin(patterns)] patterns_efficacy = df.groupby("breathing_pattern").mean( ['HRV','HR'] ).astype(int).reset_index() patterns_efficacy = patterns_efficacy.sort_values(by=['HRV'], ascending=False) patterns_efficacy
И он прекрасно справился с задачей и выдал таблицу с результатами:
|
|
breathing_pattern |
HRV |
HR |
|
8 |
physiological sighs moderate |
59 |
65 |
|
7 |
physiological sighs light |
57 |
62 |
|
1 |
4.4-6.6 |
56 |
59 |
|
6 |
following pulse |
55 |
61 |
|
0 |
4.2-0-6.4-0 |
53 |
62 |
|
3 |
6-6 |
53 |
61 |
|
4 |
calming breathing: inhale through nose, slow exhale through mouth |
53 |
61 |
|
2 |
5-5 |
52 |
63 |
|
5 |
count: 4 inhale nose, 6 exhale mouth |
52 |
63 |
Комбинация функций GROUPBY и XLOOKUP тоже отработала без изъянов:
Для группировки по HRV в ячейку E1 =GROUPBY(Table5[[#All],[breathing_pattern]],Table5[[#All],[HRV]], AVERAGE,3,0,-2) Для группировки по пульсу в ячейку E13 =GROUPBY(Table5[[#All],[breathing_pattern]],Table5[[#All],[HR]], AVERAGE,3,0,-2) И для объединения в одну общую таблицу в ячейку G2 =XLOOKUP(E2:E10,E14:E22,F14:F22,"not found")
|
breathing_pattern |
HRV |
HR |
|
physiological sighs moderate |
59 |
65 |
|
physiological sighs light |
57 |
63 |
|
4.4-6.6 |
56 |
60 |
|
following pulse |
55 |
61 |
|
4.2-0-6.4-0 |
54 |
63 |
|
6-6 |
54 |
61 |
|
calming breathing: inhale through nose, slow exhale through mouth |
53 |
62 |
|
5-5 |
53 |
63 |
|
count: 4 inhale nose, 6 exhale mouth |
52 |
63 |
* Для внимательных: разница в данных между двумя таблицами — плод Python-овского округления до целых чисел.
* В “нативном” подходе нет отсечки паттернов с количеством замеров менее шести.
Выводы и наблюдения по теме:
-
В Python итоговая таблица сама автоматически изменяет размеры при добавлении новых паттернов. GROUPBY by Excel ведет себя так же, а вот связка GROUPBY&XLOOKUP уже потребует редактирования формул: нужно изменять адреса диапазонов ячеек, к которым обращается XLOOKUP.
-
Вопреки большему размеру Python-код мне кажется проще и для написания, и для чтения-понимания. Хотя писать код в ячейке Excel — весьма извращенное удовольствие.
-
Исполнение кода Python требует интернет-соединения.
Выводы и наблюдения не совсем по теме:
-
Для меня лично схема дыхания “physiological sighs light” (легкие физиогические вздохи) — оптимальный выбор.
-
Более шести месяцев я придумывал, зачем мне может понадобиться живущий в Excel Python и наконец нашел.
Буду благодарен за советы и критику. Постараюсь ответить на вопросы.
ссылка на оригинал статьи https://habr.com/ru/articles/819169/
Добавить комментарий