Python в Excel жив?

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

Python в Excel? Почему бы и нет.

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 

physiological sighs moderate 

59 

65 

physiological sighs light 

57 

62 

4.4–6.6 

56 

59 

following pulse 

55 

61 

4.2–0–6.4–0 

53 

62 

6–6 

53 

61 

calming breathing: inhale through nose, slow exhale through mouth 

53 

61 

5–5 

52 

63 

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-овского округления до целых чисел.  

* В «нативном» подходе нет отсечки паттернов с количеством замеров менее шести.

Выводы и наблюдения по теме:  

  1. В Python итоговая таблица сама автоматически изменяет размеры при добавлении новых паттернов. GROUPBY by Excel ведет себя так же, а вот связка GROUPBY&XLOOKUP уже потребует редактирования формул: нужно изменять адреса диапазонов ячеек, к которым обращается XLOOKUP. 

  1. Вопреки большему размеру Python-код мне кажется проще и для написания, и для чтения-понимания. Хотя писать код в ячейке Excel — весьма извращенное удовольствие. 

  1. Исполнение кода Python требует интернет-соединения. 

Выводы и наблюдения не совсем по теме:  

  1. Для меня лично схема дыхания «physiological sighs light» (легкие физиогические вздохи) — оптимальный выбор.  

  1. Более шести месяцев я придумывал, зачем мне может понадобиться живущий в Excel Python и наконец нашел. 

Буду благодарен за советы и критику. Постараюсь ответить на вопросы.

© Habrahabr.ru