Коэффициент трудового участия — коэффициент, отражающий количественную оценку меры трудового участия отдельного работника в общих результатах труда группы работников, характеризующий суммарный вклад работника в общие результаты труда производственной бригады, коллектива

https://ru.wikipedia.org/wiki/Коэффициент_трудового_участия

Очень часто КТУ используют для начисления некого вознаграждения, премии или бонуса отделу или бригаде.

В своей статье я попыталась смоделировать ситуацию, когда у нас есть несколько факторов, которые влияют на увеличение/снижение КТУ работника в бригаде. В таблице ниже приведен пример данных факторов.

Факторы КТУ
Факторы КТУ

Определенной формулы для расчета КТУ нет, но обычно каждому работнику присуждают персональный балл, который характеризует его участие в производственном процессе. Далее берут сумму коллективного вознаграждения и распределяют между сотрудниками пропорционально их баллам. Что такое персональный балл? Это и есть КТУ. Как правило, он состоит из двух частей.

  • Базовая часть (всегда равна 1).

  • Складывается из оценок по заданным факторам

Принцип расчета КТУ я взяла из данного источника https://www.buhonline.ru/pub/beginner/2019/12/15303_koefficient-trudovogo-uchastiya-2022

Например имеется бригада из 10 человек, занесем информацию по данной бригаде в простую таблицу excel. Проставим коды для каждого из факторов КТУ в столбцы, выделенные синим цветом.

Список рабочих с показателями КТУ
Список рабочих с показателями КТУ

Теперь напишем код в python с использованием библиотеки pandas. Считаем данные с первого листа excel для создания словаря значений КТУ:

import pandas as pd
def read_ktu_values(file_ktu):
    # Чтение данных из Excel файла
    df_ktu_values = pd.read_excel(file_ktu, sheet_name='KTU_Values')
    
    # Создание словаря значений КТУ
    ktu_values = {}
    for _, row in df_ktu_values.iterrows():
        ktu_values[row['Код']] = row['Значение']
    
    return ktu_values

Далее напечатаем формулу для расчета коэффициента:

def calculate_ktu(codes, ktu_values, base_ktu=1):
    ktu = base_ktu
    for code in codes:
        if code in ktu_values:
            ktu += ktu_values[code]
    return ktu

Теперь укажем значения для расчета премии и создадим словарь для работников:

def main():
    # Чтение данных из Excel файла
    file_ktu = 'ktu.xlsx'
    total_bonus = 300000  # Пример общей премии, можно заменить на нужное значение
    # Чтение значений КТУ
    ktu_values = read_ktu_values(file_ktu)
    
    # Чтение второго листа с работниками и их кодами
    df_codes = pd.read_excel(file_ktu, sheet_name=1)
    
    # Убедимся, что колонка с именами работников называется правильно
    fio_column = 'ФИО'
    
    if fio_column not in df_codes.columns:
        raise KeyError(f"Колонка '{fio_column}' отсутствует на втором листе Excel файла.")
    # Предполагаем, что в df_codes коды указаны в колонках 'Код1', 'Код2', и т.д.
    code_columns = [col for col in df_codes.columns if col.startswith('Код')]
    
    # Создание словаря с кодами для каждого работника
    worker_codes = {}
    for _, row in df_codes.iterrows():
        fio = row[fio_column]
        codes = [row[col] for col in code_columns if pd.notna(row[col])]
        worker_codes[fio] = codes

Далее исходя из наших значений факторов КТУ, рассчитаем значение данного коэффициента для каждого из работников:

# Расчет КТУ для каждого работника и добавление новой колонки в df_codes
    ktu_list = []
    for _, row in df_codes.iterrows():
        fio = row[fio_column]
        if fio in worker_codes:
            codes = worker_codes[fio]
            ktu = calculate_ktu(codes, ktu_values)
        else:
            ktu = 1  # Базовый КТУ, если нет кодов
        ktu_list.append(ktu)
    
    df_codes['КТУ'] = ktu_list
    
    # Расчет общей суммы КТУ всех работников
    total_ktu = sum(ktu_list)
    
    # Расчет премии для каждого работника
    df_codes['Премия'] = df_codes['КТУ'] / total_ktu * total_bonus

И в заключение выведем полученные значения в отдельный файл excel:

# Сохранение результатов в новый Excel файл, оставляя только нужные колонки
    output_file_path = 'output_ktu.xlsx'
    result_df = df_codes[['№, п/п', fio_column,'Должность', 'КТУ', 'Премия']]
    
    with pd.ExcelWriter(output_file_path) as writer:
        result_df.to_excel(writer, sheet_name='Результаты', index=False)
    
    print(f'Результаты сохранены в файл {output_file_path}')

if __name__ == "__main__":
    main()

В результате получим следующую таблицу:

Премия работников
Премия работников

Многие спросят для чего вообще считать данным способом коэффициент трудового участия, когда есть специальная настройка шаблона в 1С. Но, существуют небольшие фирмы, которые пользуются только основными продуктами 1С и не заносят данную информацию в программу. Также данный код может служить прекрасной проверкой расчета данного показателя, если вы сомневаетесь в правильности сделанных вами расчетов.

Комментарии (4)


  1. kosdmit
    05.07.2024 11:30
    +1

    Т.к имел дело с похожими расчетами, подскажу вам несколько направлений для повышения надежности, тестируемости и читаемости кода:

    • При получении данных из внешних систем, используйте сериализаторы (десериализаторы) для валидации и предобработки полученных данных. Это поможет избавиться от возможных проблем при получении на вход программы данных, которые вы не ожидали.

    • Рассматривайте строку таблицы как объект определенного класса (используйте ООП). Размещайте необходимые методы для расчета показателей внутри этого класса.

    Так вы получите более структурированный код, который можно переиспользовать в больших приложениях.


    1. OlgaTerra12 Автор
      05.07.2024 11:30
      +1

      Спасибо большое. Обязательно воспользуюсь вашей рекомендацией:)


  1. CrazyElf
    05.07.2024 11:30
    +2

    Зачем такое сложное создание словаря, есть же to_dict у Pandas, выбираете две колонки и делаете to_dict, никаких iterrows. Ну может параметр orient ещё угадать там. Если вы делаете iterrows, обычно это значит, что вы не знаете какого-то метода Pandas.


    1. OlgaTerra12 Автор
      05.07.2024 11:30

      Спасибо, что указали на такую деталь. Если честно я думала, что и to_dict и iterrows - равнозначные методы pandas :)