Уже больше месяца экспериментирую, исследую, как разные схемы (паттерны) осознанного дыхания влияют на вариабельность сердечного ритма (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
Поместил код через =PY(
в ячейку А1 Excel
И он прекрасно справился с задачей и выдал таблицу с результатами:
| 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 и наконец нашел.
Буду благодарен за советы и критику. Постараюсь ответить на вопросы.