如何用for循环按Employee_ID分组计算各员工利润预测MAE
按员工分组的线性回归利润预测及MAE计算方案
问题背景
现有时间序列DataFrame记录员工月度利润数据,已实现全局线性回归预测利润并计算MAE,现在需要按Employee_ID分组,为每个员工单独训练模型并输出对应MAE,期望输出格式如下:
Mean Absolute Error for Employee 111 is : 24.09 Mean Absolute Error for Employee 222 is : 12.09
实现思路
- 保留关键字段:预处理时不急于将日期设为索引或删除核心字段,确保
Employee_ID可用于分组 - 分组遍历处理:通过
groupby('Employee_ID')拆分数据,获取每个员工的独立子数据集 - 单员工模型训练:对每个子数据集重复执行训练集(7-8月)/测试集(9月)划分、模型训练、预测及MAE计算流程
- 格式化输出:按指定格式打印每个员工的MAE结果
完整代码实现
import pandas as pd from sklearn.linear_model import LinearRegression from sklearn import metrics from copy import deepcopy # 原始数据集(可替换为你的实际数据加载逻辑) df = pd.DataFrame({ 'Employee_ID': [111,111,111,222,222,222], 'Age': [43,43,43,55,55,55], 'Start_Date': ['01/07/2020 9:00','01/08/2020 9:00','01/09/2020 9:00', '01/07/2020 9:00','01/08/2020 9:00','01/09/2020 9:00'], 'End_Date': ['30/07/2020 9:04','30/08/2020 9:04','30/09/2020 9:00', '30/07/2020 9:04','30/08/2020 9:00','01/09/2020 9:00'], 'Profits': [7772.14,4352.46,4532.66,5643.73,7685.15,4573.53] }) # 日期格式转换 df['Start_Date'] = pd.to_datetime(df['Start_Date'], dayfirst=True) # 按员工ID分组遍历 for emp_id, emp_data in df.groupby('Employee_ID'): # 按日期排序 emp_data_sorted = emp_data.sort_values(by='Start_Date') # 划分训练集(7-8月)和测试集(9月) train_data = emp_data_sorted[(emp_data_sorted['Start_Date'] >= '2020-07-01') & (emp_data_sorted['Start_Date'] <= '2020-08-30')] test_data = emp_data_sorted[(emp_data_sorted['Start_Date'] >= '2020-09-01') & (emp_data_sorted['Start_Date'] <= '2020-09-30')] # 准备特征与目标变量(排除非特征字段) X_train = deepcopy(train_data.drop(['Profits', 'Employee_ID', 'Start_Date', 'End_Date'], axis=1)) y_train = train_data['Profits'] X_test = deepcopy(test_data.drop(['Profits', 'Employee_ID', 'Start_Date', 'End_Date'], axis=1)) y_test = test_data['Profits'] # 训练线性回归模型 regressor = LinearRegression() regressor.fit(X_train, y_train) # 预测并计算MAE y_pred = regressor.predict(X_test) mae = metrics.mean_absolute_error(y_test, y_pred) # 按指定格式输出结果 print(f'Mean Absolute Error for Employee {emp_id} is : {mae:.2f}')
代码说明
- 分组逻辑:
groupby('Employee_ID')确保每个员工的数据独立处理,避免不同员工数据互相干扰 - 日期筛选:使用日期范围条件替代索引切片,适配分组后的数据结构
- 特征清洗:训练时排除利润、员工ID、日期等非预测特征,仅保留有效输入(示例中为
Age) - 结果格式化:通过f-string实现指定格式的输出,MAE保留两位小数
内容的提问来源于stack exchange,提问作者MohammedE
相关产品推荐
相关产品推荐

