src package

Submodules

src.utils module

Модуль містить допоміжні функції для підготовки даних та проведення розрахунків.

src.utils.merge_all(data, on, return_all_regions=True)[source]

Послідовно виконує pd.merge на масиві таблиць.

Параметри
  • data (list[pd.DataFrame]) – Список таблиць, які необхідно об’єднати

  • on (str) – Ключ для об’єднання таблиць

  • return_all_regions (bool) – Чи включати відсутні області в таблицю

Повертає

Об’єднана єдина таблиця

Тип повернення

pd.DataFrame

src.utils.normalize_parameter(array, fill_na=True, min_bound=None, max_bound=None, feature_range=(0, 1), reverse=False)[source]

Імплементація min-max normalization формули:

\[{x}' = a + \frac{(x-min(x))(b-a)}{max(x)-min(x)}\]

де \(x\) є array, \(a\) та \(b\) є feature_range, що за замовченням є [0, 1];

Якщо параметри min_bound та max_bound задані, функція ігнорує реальні мінімальні та максимальні значення array.

Параметри
  • array (pd.Series) – Колонка, значення якої нормалізуємо

  • fill_na (bool) – NaN policy: заповнюємо порожні значення нулями (True) або ні (False)

  • min_bound (Any[None, int, float]) – Задана нижня межа параметрів, або задане мінімальне значення колонки.

  • max_bound (Any[None, int, float]) – Задана верхня межа параметрів, або задане максимальне значення колонки.

  • feature_range (tuple (min, max), default=(0, 1)) – Шкала, в межах якої трансформуємо дані: [мінімальне, максимальне]

  • reverse (bool) – Спосіб нормалізації. Найбільше значення отримує 1 якщо True, 0 якщо False.

Examples

>>> array = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

За замовченням функція трансформує array в шкалу [0, 1], використовуючи наявні максимальні та мінімальні значення колонки.

>>> normalize_parameter(array)
feature_range=(0, 1); fill_na=True; array_bounds=(1, 10); normalization_bounds=(1, 10)
0    0.000000
1    0.111111
2    0.222222
3    0.333333
4    0.444444
5    0.555556
6    0.666667
7    0.777778
8    0.888889
9    1.000000
dtype: float64

Можемо задати максимальне значення самостійно. Наприклад, якщо ми хочемо порівняти наявність генеральних планів у селах і за найкращий показник свідомо беремо 100%, але в жодній з областей такого показника немає, ми вручну встановлюємо верхню межу як 100% замість максимального значення по областях

Спрощений приклад на array: якщо max_bound=15, а реальне максимальне значення в межах колонки сягає 10, найкращий з усіх рядків не отримує 1 (тому що порівнюється вже не відносно інших значень, а ще й відносно заданого максимального значення).

>>> normalize_parameter(array, max_bound=15)
feature_range=(0, 1); fill_na=True; array_bounds=(1, 10); normalization_bounds=(1, 15)
0    0.000000
1    0.071429
2    0.142857
3    0.214286
4    0.285714
5    0.357143
6    0.428571
7    0.500000
8    0.571429
9    0.642857
dtype: float64

Приклад використання іншої від [0, 1] шкали нормалізації:

>>> normalize_parameter(array, feature_range=(2, 5))
feature_range=(2, 5); fill_na=True; array_bounds=(1, 10); normalization_bounds=(1, 10)
0    2.000000
1    2.333333
2    2.666667
3    3.000000
4    3.333333
5    3.666667
6    4.000000
7    4.333333
8    4.666667
9    5.000000
dtype: float64
Повертає

Колонка з нормалізованими значеннями

Тип повернення

pd.Series

src.utils.save_data(sources, weights, parameter, show_results=False)[source]

Розраховує оцінку галузевого параметру

Параметри
  • sources (list[pd.DataFrame]) – Список усіх таблиць з нормалізованими показниками нижнього рівня

  • weights (dict[str, float]) – Словник з назвою параметру та його вагою

  • parameter (str) – Галузевий параметр (параметр верхнього рівня): [P1, P2, P3, P4, P5, P6, P7, P8]

src.utils.weighted_average(df, columns, weights, multiplier=10)[source]

Ф-ція середнього зваженого.

\[\bar{x} = \frac{\sum_{i=1}^{n} w_ix_i}{\sum_{i=1}^{n} w_i} \times m\]

де \(x\) є значенням, \(w\) є його вагою значення, \(m\) є мультиплікатором.

Параметри
  • df (pd.DataFrame) – Таблиця з параметрами

  • columns (list[str]) – Перелік колонок, значення яких слід розрахувати

  • weights (dict[str, float]) – Словник з назвою параметру та його вагою

  • multiplier (float) – Мультиплікатор результату

Examples

>>> df = pd.DataFrame({
    "A": [1, 4, 4, 5, 6, 7, 5, 3, 4, 5],
    "B": [2, 8, 1, 4, 6, 2, 8, 1, 1, 1],
})

Функція адаптова під роботу з таблицею (використовує broadcasting), що містить окремі колонки, які необхідно порахувати; у реальному застосуванні ці колонки визначаються патерном.

>>> weighted_average(df=df, columns=["A", "B"], weights={"A": 1.5, "B": 2})
0    15.714286
1    62.857143
2    22.857143
3    44.285714
4    60.000000
5    41.428571
6    67.142857
7    18.571429
8    22.857143
9    27.142857
dtype: float64
Повертає

Колонка з розрахованим середнім зваженим

Тип повернення

pd.Series

src.utils.zscore_wrapper(df, param, cv=1.96)[source]

Визначає аутлаєри колонки param за допомогою scipy.stats.zscore.

Відхилення (аутлаєр) є статистично значущим, якщо отримане значення є більшим або меншим за критичне значення cv.

\[z =\frac{x_i-\mu}{\sigma}\]
Параметри
  • df (pd.DataFrame) – Таблиця з параметрами

  • param (str) – Назва параметру

  • cv (float) – Критичне значення [1.96, 2.58] для 95% та 99% стат. значущості відповідно

Examples

Певний параметр може містити аутлаєри, які часом можуть виникати внаслідок помилки в даних або свідчити про аномальну ситуацію в певних областях (обидва варіанти можуть викривлювати результати розрахунків).

Для прикладу я генерую датасет df, що містить одну колонку param, котра складається з випадкового набору значень в межах нормального розподілу (normal distribution)

>>> df = pd.DataFrame({"param": np.random.standard_normal(size=24)})
>>> df
       param
0  -1.292244
1  -2.610441
2   0.069343
3  -0.959068
4   0.407773
5   0.192192
6   0.694097
7  -0.758156
8   0.403748
9   1.585239
10 -0.807982
11 -0.507439
12 -0.312586
13  0.624023
14 -0.953230
15 -0.797517
16  1.604804
17 -1.187396
18 -0.535961
19  2.263956
20 -0.182657
21  0.616233
22 -0.928197
23 -0.320723

Функція по суті є обгорткою для scipy.stats.zscore і повертає ті рядки-аутлаєри (чиї значення zscore виходять за критичне значення cv)

>>> zscore_wrapper(df, "param")
       param
1  -2.610441
19  2.263956
Повертає

Таблиця з статистично значущими аутлаєрами

Тип повернення

pd.DataFrame

src.visualize module

Модуль містить допоміжні функції для візуалізації результатів оцінювання.

src.visualize.delete_frame(ax)[source]

sns.despine() для matplotlib.

src.visualize.draw_boxplot(ax, data, numbers)[source]

Створює boxplot

Параметри
  • ax (matplotlib.axes._subplots.AxesSubplot) – Тло візуалізації

  • data (pd.DataFrame) – Таблиця з розрахованим індексом

  • numbers (list) – Перелік колонок, які слід ігнорувати

src.visualize.draw_boxplot_dist(df_index, cols, save=False)[source]

Створює зображення з розподілом показників нижнього рівня. Обгортка для draw_boxplot

Параметри
  • df_index (pd.DataFrame) – asd

  • cols (list[str]) – asd

  • reg_index (int) – asd

  • save (bool, defaults False) – asd

src.visualize.draw_multiple_spiders(df_index, cols, save=False)[source]

Створює графік, що показує значення параметрів верхнього рівня для кожної з областей. Обгорта для draw_spider

Параметри
  • df_index (pd.DataFrame) – Таблиця з розрахованим індексом

  • cols (list[str]) – Колонки параметрів верхнього рівня

  • save (bool, defaults False) – Чи слід зберігати зображення в reports/figures

src.visualize.draw_profile_det(df_index, cols, reg_index, save=False)[source]

Створює графік для області reg_index з оцінками параметрів нижнього рівня

Параметри
  • df_index (pd.DataFrame) – Таблиця з розрахованим індексом

  • cols (list[str]) – Колонки нижнього параметрів рівня

  • reg_index (int) – номер індексу таблиці області, яку слід візуалізувати

  • save (bool, defaults False) – Чи слід зберігати зображення в reports/figures

src.visualize.draw_profile_gen(df_index, cols, reg_index, save=False)[source]

Створює графік для області reg_index з оцінками параметрів верхнього рівня

Параметри
  • df_index (pd.DataFrame) – Таблиця з розрахованим індексом

  • cols (list[str]) – Колонки верхнього параметрів рівня

  • reg_index (int) – номер індексу таблиці області, яку слід візуалізувати

  • save (bool, defaults False) – Чи слід зберігати зображення в reports/figures

src.visualize.draw_rankings(df_index, kvartal='III', save=False)[source]

Створює відсортований барчарт з остаточними оцінками.

Параметри
  • df_index (pd.DataFrame) – Таблиця з розрахованим індексом

  • kvartal (str) – Номер кварталу для винесення в заголовок візуалізації

  • save (bool, defaults False) – Чи слід зберігати зображення в reports/figures

src.visualize.draw_spider(ax, angles, values, values_mean, cols)[source]

Spider-візуалізація.

Параметри
  • ax (matplotlib.axes._subplots.AxesSubplot) – Тло візуалізації

  • angles (list[float]) – Нахил для візулаізації

  • values (list[floats]) – Оцінка параметрів верхнього рівня

  • values_mean (float) – Середня оцінка параметрів верхнього рівня

  • cols (list[str]) – Колонки параметрів верхнього рівня

src.visualize.dynamic_rankings(df, value, value_colour, change, change_colour, save=False)[source]

Створює відсортований барчарт з абсолютною оцінкою та показує динаміку відносно минулого кварталу.

Параметри
  • df (pd.DataFrame) – Таблиця з розрахованим індексом

  • value (pd.Series) – Колонка з абсолютною оцінкою за квартал

  • value_color (pd.Series) – Колонка з кольорами для основного барчарту

  • change (pd.Series) – Колонка з різницею абсолютної оцінки відносно минулого кварталу

  • change_colour (pd.Series) – Колонка з кольорами для точкової діаграми

  • save (bool, defaults False) – Чи слід зберігати зображення в reports/figures

Module contents