Коэффициент трудового участия — коэффициент, отражающий количественную оценку меры трудового участия отдельного работника в общих результатах труда группы работников, характеризующий суммарный вклад работника в общие результаты труда производственной бригады, коллектива
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С и не заносят данную информацию в программу. Также данный код может служить прекрасной проверкой расчета данного показателя, если вы сомневаетесь в правильности сделанных вами расчетов.
Комментарии (7)
CrazyElf
05.07.2024 11:30+2Зачем такое сложное создание словаря, есть же to_dict у Pandas, выбираете две колонки и делаете to_dict, никаких iterrows. Ну может параметр orient ещё угадать там. Если вы делаете iterrows, обычно это значит, что вы не знаете какого-то метода Pandas.
OlgaTerra12 Автор
05.07.2024 11:30Спасибо, что указали на такую деталь. Если честно я думала, что и to_dict и iterrows - равнозначные методы pandas :)
CrazyElf
05.07.2024 11:30Ну уж нет ) to_dict работает векторно, сразу с целым датафреймом, через вызовы Numpy, а iterrows - это построчный перебор, это очень медленно.
NikSerAlx
05.07.2024 11:30Весьма странный набор критериев для трудового "участия".
Не хватает именно "участия".
Какой % от плана бригады пришёлся на конкретного человека. Ведь можно самому обслуживать станок, делать без замечаний, не иметь дисциплинарных взысканий, но сделать малое количество деталей. А кто-нибудь будет конфликтовать, нарушать дисциплину, но в итоге изготовит более других (ситуация редкая и такие рок-звезды встречаются не часто)
OlgaTerra12 Автор
05.07.2024 11:30Эти критерии были приведены для примера, вы можете в вашем случае указать абсолютно любые критерии, которые есть у вас на предприятии. И, еще, чаще всего из моего опыта, бригада работает на общий результат и они должны выполнить определенный план. Не выполнили план, не будет премии у всей бригады, включая руководство. И это не учитывается в КТУ.
kosdmit
Т.к имел дело с похожими расчетами, подскажу вам несколько направлений для повышения надежности, тестируемости и читаемости кода:
При получении данных из внешних систем, используйте сериализаторы (десериализаторы) для валидации и предобработки полученных данных. Это поможет избавиться от возможных проблем при получении на вход программы данных, которые вы не ожидали.
Рассматривайте строку таблицы как объект определенного класса (используйте ООП). Размещайте необходимые методы для расчета показателей внутри этого класса.
Так вы получите более структурированный код, который можно переиспользовать в больших приложениях.
OlgaTerra12 Автор
Спасибо большое. Обязательно воспользуюсь вашей рекомендацией:)