| import pandas as pd |
| import numpy as np |
|
|
|
|
| def generate_material_usage_cost_matrix(process_df, material_usage_df): |
| overall_cost_matrix = pd.DataFrame() |
| overall_amount_matrix = pd.DataFrame() |
| process_df = process_df.reset_index() |
|
|
| |
| unique_material_id = material_usage_df["_id"].unique() |
|
|
| for index in process_df.index: |
| selected_process = process_df.iloc[index] |
|
|
| |
| |
| selected_process_material = material_usage_df[ |
| material_usage_df["process_id"] == selected_process["process_id"] |
| ] |
| cost_dict = {} |
| amount_dict = {} |
|
|
| |
| for idx in range(len(selected_process_material)): |
| selected_data = selected_process_material.iloc[idx] |
| material_id = selected_data["_id"] |
| cost = selected_data["unit_cost"] |
| amount = selected_data["amount"] |
| cost_dict[material_id] = cost |
| amount_dict[material_id] = amount |
|
|
| |
| for material_id in unique_material_id: |
| if material_id not in cost_dict: |
| cost_dict[material_id] = 0 |
| amount_dict[material_id] = 0 |
|
|
| cost_df = pd.DataFrame( |
| cost_dict, index=[selected_process["process_id"]]) |
| amount_df = pd.DataFrame( |
| amount_dict, index=[selected_process["process_id"]]) |
|
|
| overall_cost_matrix = pd.concat([overall_cost_matrix, cost_df], axis=0) |
| overall_amount_matrix = pd.concat( |
| [overall_amount_matrix, amount_df], axis=0) |
|
|
| |
| column_list = unique_material_id.tolist() |
| ordered_columns = sorted(column_list) |
| overall_cost_matrix = overall_cost_matrix[ordered_columns] |
| overall_amount_matrix = overall_amount_matrix[ordered_columns] |
|
|
| overall_cost_matrix.fillna(0, inplace=True) |
| overall_amount_matrix.fillna(0, inplace=True) |
|
|
| return (overall_cost_matrix, overall_amount_matrix) |
|
|
|
|
| def generate_employee_usage_cost_matrix(process_df, employee_usage_df): |
| overall_cost_matrix = pd.DataFrame() |
| overall_duration_matrix = pd.DataFrame() |
| overall_day_amount_matrix = pd.DataFrame() |
|
|
| employee_usage_df["duration"] = ( |
| employee_usage_df["duration"] * employee_usage_df["amount"] |
| ) |
|
|
| unique_emp_id = employee_usage_df["employee_id"].unique() |
|
|
| process_df = process_df.reset_index() |
|
|
| |
| for index in process_df.index: |
| selected_process = process_df.iloc[index] |
| selected_process_employee = employee_usage_df[ |
| employee_usage_df["process_id"] == selected_process["process_id"] |
| ] |
|
|
| ec_cost_dict = {} |
| ec_duration_dict = {} |
| ec_day_amount_dict = {} |
|
|
| unique_process_employee = selected_process_employee["employee_id"].unique( |
| ) |
| unique_pe_df = pd.DataFrame( |
| unique_process_employee, columns=["employee_id"]) |
|
|
| |
| |
| |
| for idx in range(len(unique_pe_df)): |
| selected_data = unique_pe_df.iloc[idx] |
| all_record = selected_process_employee[ |
| selected_process_employee["employee_id"] == selected_data["employee_id"] |
| ] |
| first_record = all_record.iloc[0] |
| |
| cost = first_record["cost"] |
| day_amount = first_record["day_amount"] |
| |
| duration = all_record["duration"].sum() |
| |
| unique_pe_df.loc[idx, "cost"] = cost |
| unique_pe_df.loc[idx, "duration"] = duration |
| unique_pe_df.loc[idx, "day_amount"] = day_amount |
| unique_pe_df.loc[idx, "process_id"] = first_record["process_id"] |
|
|
| for idx in range(len(unique_pe_df)): |
| selected_data = unique_pe_df.iloc[idx] |
| cost = selected_data["cost"] |
| employee_id = selected_data["employee_id"] |
| duration = selected_data["duration"] |
| day_amount = selected_data["day_amount"] |
|
|
| ec_cost_dict[employee_id] = cost |
| ec_duration_dict[employee_id] = duration |
| ec_day_amount_dict[employee_id] = day_amount |
|
|
| |
|
|
| for employee_id in unique_emp_id: |
| if employee_id not in ec_cost_dict: |
| ec_cost_dict[employee_id] = 0 |
| ec_duration_dict[employee_id] = 0 |
| ec_day_amount_dict[employee_id] = 1 |
|
|
| employee_cost_df = pd.DataFrame( |
| ec_cost_dict, index=[selected_process["process_id"]] |
| ) |
|
|
| employee_duration_df = pd.DataFrame( |
| ec_duration_dict, index=[selected_process["process_id"]] |
| ) |
|
|
| employee_dayamount_df = pd.DataFrame( |
| ec_day_amount_dict, index=[selected_process["process_id"]] |
| ) |
|
|
| overall_cost_matrix = pd.concat( |
| [overall_cost_matrix, employee_cost_df], axis=0 |
| ) |
|
|
| overall_duration_matrix = pd.concat( |
| [overall_duration_matrix, employee_duration_df], axis=0 |
| ) |
|
|
| overall_day_amount_matrix = pd.concat( |
| [overall_day_amount_matrix, employee_dayamount_df], axis=0 |
| ) |
|
|
| |
|
|
| |
| column_list = unique_emp_id.tolist() |
| ordered_columns = sorted(column_list) |
| overall_cost_matrix = overall_cost_matrix[ordered_columns] |
| overall_duration_matrix = overall_duration_matrix[ordered_columns] |
| overall_day_amount_matrix = overall_day_amount_matrix[ordered_columns] |
|
|
| overall_cost_matrix.fillna(0, inplace=True) |
| overall_duration_matrix.fillna(0, inplace=True) |
| overall_day_amount_matrix.fillna(1, inplace=True) |
|
|
| return ( |
| overall_cost_matrix, |
| overall_duration_matrix, |
| overall_day_amount_matrix, |
| ) |
|
|
|
|
| def generate_capital_cost_matrix(process_df, capital_cost_df): |
| cost_df = pd.DataFrame() |
| day_amount_df = pd.DataFrame() |
| duration_df = pd.DataFrame() |
| process_df = process_df.reset_index() |
|
|
| |
| unique_capital_cost_id = capital_cost_df["_id"].unique() |
|
|
| |
| for index in process_df.index: |
| selected_process = process_df.iloc[index] |
| selected_process_capitalcost = capital_cost_df[ |
| capital_cost_df["process_id"] == selected_process["process_id"] |
| ] |
|
|
| cost_dict = {} |
| day_amount_dict = {} |
| duration_dict = {} |
| uniq_process_cc = selected_process_capitalcost["_id"].unique() |
|
|
| uniq_pcc_df = pd.DataFrame( |
| uniq_process_cc, columns=["capital_cost_id"]) |
|
|
| |
| |
| |
| for idx in range(len(uniq_pcc_df)): |
| selected_data = uniq_pcc_df.iloc[idx] |
| all_record = selected_process_capitalcost[ |
| selected_process_capitalcost["_id"] == selected_data["capital_cost_id"] |
| ] |
| first_record = all_record.iloc[0] |
| |
| cost = first_record["cost"] |
| |
| duration = all_record["duration"].sum() |
| |
| uniq_pcc_df.loc[idx, "cost"] = cost |
| uniq_pcc_df.loc[idx, "duration"] = duration |
| uniq_pcc_df.loc[idx, "day_amount"] = first_record["day_amount"] |
| uniq_pcc_df.loc[idx, "process_id"] = first_record["process_id"] |
|
|
| |
| for idx in range(len(uniq_pcc_df)): |
| selected_data = uniq_pcc_df.iloc[idx] |
| cost = selected_data["cost"] |
| duration = selected_data["duration"] |
| captial_cost_id = selected_data["capital_cost_id"] |
| cost_dict[captial_cost_id] = cost |
| day_amount_dict[captial_cost_id] = selected_data["day_amount"] |
| duration_dict[captial_cost_id] = duration |
|
|
| |
| for cc_id in unique_capital_cost_id: |
| if cc_id not in cost_dict: |
| cost_dict[cc_id] = 0 |
| day_amount_dict[cc_id] = 1 |
| duration_dict[cc_id] = 0 |
|
|
| |
| sub_cost_df = pd.DataFrame( |
| cost_dict, index=[selected_process["process_id"]]) |
| sub_duration_df = pd.DataFrame( |
| duration_dict, index=[selected_process["process_id"]] |
| ) |
| sub_dayamount_df = pd.DataFrame( |
| day_amount_dict, index=[selected_process["process_id"]] |
| ) |
|
|
| |
| cost_df = pd.concat([cost_df, sub_cost_df], axis=0) |
| day_amount_df = pd.concat([day_amount_df, sub_dayamount_df], axis=0) |
| duration_df = pd.concat([duration_df, sub_duration_df], axis=0) |
|
|
| |
|
|
| column_list = unique_capital_cost_id.tolist() |
| sorted_column = sorted(column_list) |
|
|
| day_amount_df = day_amount_df[sorted_column] |
| cost_df = cost_df[sorted_column] |
| duration_df = duration_df[sorted_column] |
|
|
| day_amount_df.fillna(1, inplace=True) |
| cost_df.fillna(0, inplace=True) |
| duration_df.fillna(1, inplace=True) |
|
|
| return (cost_df, day_amount_df, duration_df) |
|
|
|
|
| def generate_price_matrix(process_df, use_3d=False, use_unit_cost=True): |
| price_arr = [] |
| process_df = process_df.reset_index() |
| if use_unit_cost: |
| for index in process_df.index: |
| selected_data = process_df.iloc[index] |
| cost = selected_data["cost"] |
| if use_3d: |
| price_arr.append([[cost]]) |
| else: |
| price_arr.append([cost]) |
| else: |
| for index in process_df.index: |
| selected_data = process_df.iloc[index] |
| if use_3d: |
| price_arr.append([[selected_data["cost"]]]) |
| else: |
| price_arr.append([selected_data["cost"]]) |
| price_arr = np.array(price_arr) |
| return price_arr |
|
|
|
|
| def generate_duration_matrix(process_df, use_3d=False): |
| duration_array = [] |
| process_df = process_df.reset_index() |
| for index in process_df.index: |
| selected_data = process_df.iloc[index] |
| duration = selected_data["duration"] |
| if use_3d: |
| duration_array.append([[duration]]) |
| else: |
| duration_array.append([duration]) |
|
|
| duration_array = np.array(duration_array) |
| return duration_array |
|
|