博主本来也是想偷懒用CV大法,找了半天竟然发现没有找到相关的答案,索性就自己写一篇答案。
目录
第1关:基于经纬度地理坐标数据的指标计算Z1-Z5
任务描述:
本关任务:编写一个程序完成任务数量、任务平均定价、会员数量、会员平均信誉值、会员可预订任务总量共5个指标数据
过关代码:
# -*- coding: utf-8 -*-
# 根据读取的附件,构造任务指标Z1、Z2、Z3、Z4、Z5
# 将计算得到的指标存放到数组Z当中
def return_values():
import pandas as pd
import numpy as np
import math
# 读取任务和会员数据
A = pd.read_excel('附件一:已结束项目任务数据.xls')
B = pd.read_excel('附件二:会员信息数据.xlsx')
# 预定义数组Z,用于存放所有任务的指标:
# 列0为任务编号,列1~5依次为Z1~Z5
Z = np.zeros((len(A), 6))
# 遍历每一个任务,计算其在5公里范围内的指标
for t in range(len(A)):
# 第t个任务的经纬度
A_Wt = A.iloc[t, 1] # 纬度
A_Jt = A.iloc[t, 2] # 经度
# 距离数组
D1 = np.zeros(len(A)) # 任务到任务距离
D2 = np.zeros(len(B)) # 任务到会员距离
# 计算第t个任务与所有任务的距离
for i in range(len(A)):
A_Wi = A.iloc[i, 1]
A_Ji = A.iloc[i, 2]
D1[i] = 111.19 * math.sqrt(
(A_Wt - A_Wi) ** 2 +
(A_Jt - A_Ji) ** 2 * math.cos((A_Wt + A_Wi) * math.pi / 180) ** 2
)
# 计算第t个任务与所有会员的距离
for k in range(len(B)):
B_Wk = B.iloc[k, 1]
B_Jk = B.iloc[k, 2]
D2[k] = 111.19 * math.sqrt(
(A_Wt - B_Wk) ** 2 +
(A_Jt - B_Jk) ** 2 * math.cos((A_Wt + B_Wk) * math.pi / 180) ** 2
)
# 填充Z矩阵
Z[t, 0] = t
# Z1: 任务数量
idx_tasks = D1 <= 5
Z[t, 1] = np.sum(idx_tasks)
# Z2: 任务平均价格
if Z[t, 1] > 0:
Z[t, 2] = A.iloc[idx_tasks, 3].mean()
else:
Z[t, 2] = 0
# Z3: 会员数量
idx_members = D2 <= 5
Z[t, 3] = np.sum(idx_members)
# Z4: 会员平均信誉值
if Z[t, 3] > 0:
Z[t, 4] = B.iloc[idx_members, 5].mean()
else:
Z[t, 4] = 0
# Z5: 会员可预订任务总量
Z[t, 5] = B.iloc[idx_members, 3].sum()
return Z
第2关:基于经纬度地理坐标数据的指标计算Z6-Z12
任务描述:
本关任务:编写针对每个任务,计算其在5公里区域范围内在6:30、6:33~6:45、6:48~7:03、7:06~7:21、7:24~7:39、7:42~7:57、8:00,每个时段的会员可预订任务量,共7个指标数据的程序。注意,数组第0列是任务标号,第1~第7列是对应指标
过关代码:
# -*- coding: utf-8 -*-
# 根据任务与会员数据,计算每个任务在5公里范围内各时段会员可预订任务量指标Z6~Z12
def find_I(h1, m1, h2, m2, D2, B):
"""
返回指定时间段内且距离<=5km的会员逻辑索引
h1,m1: 时段开始小时、分钟
h2,m2: 时段结束小时、分钟
D2: 当前任务到各会员的距离数组
B: 会员数据,列4为会员可预约时间(datetime.time类型)
"""
import datetime
import numpy as np
# 将会员时间列提取为python time对象列表
times = B.iloc[:, 4].apply(lambda x: x if isinstance(x, datetime.time) else x.time())
# 构造逻辑索引
start = datetime.time(h1, m1)
end = datetime.time(h2, m2)
I1 = times >= start
I2 = times <= end
I3 = D2 <= 5
# 三者取交集
mask = np.array(I1 & I2 & I3)
return mask
def return_values():
import pandas as pd
import numpy as np
import math
# 读取任务与会员数据
A = pd.read_excel('附件一:已结束项目任务数据.xls')
B = pd.read_excel('附件二:会员信息数据.xlsx')
# 初始化指标矩阵:len(A)行、8列(0:任务编号,1~7:各时段指标Z6~Z12)
Z = np.zeros((len(A), 8))
# 遍历每个任务
for t in range(len(A)):
# 任务经纬度
lat_t = A.iloc[t, 1]
lon_t = A.iloc[t, 2]
# 计算任务到所有会员的距离数组D2
D2 = np.zeros(len(B))
for k in range(len(B)):
lat_k = B.iloc[k, 1]
lon_k = B.iloc[k, 2]
D2[k] = 111.19 * math.sqrt(
(lat_t - lat_k) ** 2 +
(lon_t - lon_k) ** 2 * math.cos((lat_t + lat_k) * math.pi / 180) ** 2
)
# 填充任务编号
Z[t, 0] = t
# 各时段可预订任务量(列3为可预订任务数)
Z[t, 1] = B.iloc[find_I(6, 30, 6, 30, D2, B), 3].sum()
Z[t, 2] = B.iloc[find_I(6, 33, 6, 45, D2, B), 3].sum()
Z[t, 3] = B.iloc[find_I(6, 48, 7, 3, D2, B), 3].sum()
Z[t, 4] = B.iloc[find_I(7, 6, 7, 21, D2, B), 3].sum()
Z[t, 5] = B.iloc[find_I(7, 24, 7, 39, D2, B), 3].sum()
Z[t, 6] = B.iloc[find_I(7, 42, 7, 57, D2, B), 3].sum()
Z[t, 7] = B.iloc[find_I(8, 0, 8, 0, D2, B), 3].sum()
return Z
第3关:任务定价模型的构建
任务描述:
本关任务:将第一关和第二关计算的指标数据水平集成,获得各任务12个指标完整数据集,同时将该数据集分成两部分:一部分是已完成的任务数据,另一部分为未完成的任务数据。已完成的任务假设定价是合理的,能被广大会员接受。未完成的任务假设定价不合理,需要重新进行定价。请以完成的任务12个指标数据作为自变量X,其定价作为因变量Y,构建定价模型,并以未完成的任务12个指标数据作为定价模型输入变量,输出即为重新定价结果。
过关代码:
# -*- coding: utf-8 -*-
def return_values():
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LinearRegression
from sklearn.neural_network import MLPRegressor
# 1. 加载指标数据并预处理
Z = np.load('Z.npy') # shape: (n_tasks, 13)
Data = pd.DataFrame(Z[:, 1:]) # 去掉第0列任务编号,保留12个指标
# 1.1 空值处理:将NaN填充为0
Data = Data.fillna(0)
# 1.2 相关性分析(可选打印或检查)
R = Data.corr()
# 1.3 标准化
scaler = StandardScaler()
data_std = scaler.fit_transform(Data.values)
# 1.4 主成分分析:累积贡献率90%
pca = PCA(n_components=0.9)
x_pca = pca.fit_transform(data_std) # shape: (n_tasks, n_components)
# 2. 加载任务原始数据,用于获取定价和执行状态
A = pd.read_excel('附件一:已结束项目任务数据.xls')
# 假设第4列为执行标志(1:已执行,0:未执行),第3列为定价
executed_flag = A.iloc[:, 4].values
y = A.iloc[:, 3].values.reshape(-1, 1)
# 3. 划分已执行与未执行任务数据
x_completed = x_pca[executed_flag == 1]
y_completed = y[executed_flag == 1]
x_uncompleted = x_pca[executed_flag == 0]
# 4. 构建多元线性回归模型
lr = LinearRegression()
lr.fit(x_completed, y_completed)
Slr = lr.score(x_completed, y_completed) # 判定系数 R^2
# 5. 构建神经网络回归模型
clf = MLPRegressor(solver='lbfgs', alpha=1e-5,
hidden_layer_sizes=(300, 5), random_state=1)
# 注意:MLPRegressor 接受一维目标数组
clf.fit(x_completed, y_completed.ravel())
rv1 = clf.score(x_completed, y_completed) # 拟合优度
# 6. 对未执行任务进行重新定价(可选)
# y_pred = clf.predict(x_uncompleted)
return Slr, rv1
第4关:任务定价模型的应用
任务描述:
本关任务:以第三关各任务12个指标完整数据集和附件一定价数据作为自变量X,任务完成情况作为因变量Y,构建分类模型。以未完成的任务12个指标数据和重新定价结果作为模型输入,输出即为重新定价后任务的完成情况。
过关代码:
# -*- coding: utf-8 -*-
def return_values():
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.neural_network import MLPRegressor
# 1. 加载任务及指标数据
A = pd.read_excel('附件一:已结束项目任务数据.xls') # 原始任务数据
Z = np.load('Z.npy') # 任务12指标矩阵,shape (n_tasks, 13)
# 2. 构建标签 Y(任务完成情况)和特征矩阵 X(12指标 + 原定价)
executed_flag = A.iloc[:, 4].values # 1 完成, 0 未完成
y = executed_flag.reshape(-1, 1)
# 指标部分:填充 NaN/Inf
indicators = Z[:, 1:] # shape (n_tasks, 12)
indicators = np.nan_to_num(indicators, nan=0.0, posinf=0.0, neginf=0.0)
# 原定价部分:填充可能的 NaN
original_price = A.iloc[:, 3].values.reshape(-1, 1)
original_price = np.nan_to_num(original_price, nan=0.0, posinf=0.0, neginf=0.0)
# 合并为特征矩阵 X
X = np.hstack((indicators, original_price)) # shape (n_tasks, 13)
# 3. 拆分训练/测试集,构建 SVM 分类模型
xx_train, xx_test, yy_train, yy_test = train_test_split(
X, y, test_size=0.2, random_state=4
)
clf = svm.SVC(kernel='rbf', class_weight='balanced', random_state=4)
clf.fit(xx_train, yy_train.ravel())
# 训练集准确率
rv2 = clf.score(xx_train, yy_train)
# 测试集准确率
yy_pred = clf.predict(xx_test)
rv3 = np.mean(yy_pred.reshape(-1, 1) == yy_test)
# 返回测试准确率 rv3
return rv3
第5关:任务定价调整方案评价
任务描述:
本关任务:编写一个对未完成的任务重新定价效果从两个方面评估:成本增加额和新增任务完成量。请给出具体程序计算实现,其中成本增加额=新定价总和-原定价总和,新增任务完成量=8.5模型输出为1的数量*模型准确率小程序。
过关代码:
# -*- coding: utf-8 -*-
#Z为计算得到的十二个指标数据以.npy文件保存读取出来的结果
#对得到的Z进行空值处理
#判断指标之间是否存在较强的相关性
#进行标准化处理标准化
#进行主成分分析处理
#构建多元线性回归模型
#非线性神经网络模型构建任务定价模型
#根据上面的模型计算成本增加额R1和任务完成增加量R2
def return_values():
#根据计算出指标Z,以及构建的定价模型重新对任务重新定价
import pandas as pd #导入pandas库
import numpy as np #导入nmypy库
import math #导入数学函数模
import fun #导入定义的函数
A=pd.read_excel('附件一:已结束项目任务数据.xls')
Z=np.load('Z.npy')
Data=pd.DataFrame(Z[:,1:])#将数据转化成数据框
#空值处理
Data=Data.fillna(0)
#指标之间是否存在较强的相关性
R=Data.corr()
#均值-方差标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
data=Data#.as_matrix() #数据框转化为数组形式
scaler.fit(data)
data=scaler.transform(data)
#主成分分析
from sklearn.decomposition import PCA
pca=PCA(n_components=0.9) #累计贡献率提取90%以上
pca.fit(data)
x=pca.transform(data) #返回主成分
tzxl=pca.components_ #特征向量
tz=pca.explained_variance_ #特征值
gxl=pca.explained_variance_ratio_ #累计贡献率
A4=A.iloc[:,4].values
x_0=x[A4==0,:] #未执行任务主成分数据
x_1=x[A4==1,:] #执行任务主成分数据
y=A.iloc[:,3].values
y=y.reshape(len(y),1)
y_0=y[A4==0]#未执行任务定价数据
y_1=y[A4==1]#执行任务定价数据
#构建多元线性回归模型
from sklearn.linear_model import LinearRegression as LR
lr = LR() #创建线性回归模型类
lr.fit(x_1, y_1) #拟合
Slr=lr.score(x_1,y_1) # 判定系数 R^2
c_x=lr.coef_ # x对应的回归系数
c_b=lr.intercept_ # 回归系数常数项
#非线性神经网络模型构建任务定价模型
from sklearn.neural_network import MLPRegressor
#两个隐含层300*5
clf = MLPRegressor(solver='lbfgs', alpha=1e-5,hidden_layer_sizes=(300,5),
random_state=1)
clf.fit(x_1, y_1);
rv1=clf.score(x_1,y_1)#拟合优度
y_0r=clf.predict(x_0) #对未执行的任务,利用神经网络定价模型重新预测定价
xx=pd.concat((Data,A.iloc[:,[3]]),axis=1) #12个指标+任务定价,自变量
xx=xx#.as_matrix() #转化为数组
yy=A4.reshape(len(A4),1) #任务执行情况,因变量
#对自变量与因变量按训练80%、测试20%随机拆分
from sklearn.model_selection import train_test_split
xx_train, xx_test, yy_train, yy_test = train_test_split(xx, yy, test_size=0.2, random_state=4)
from sklearn import svm
#用高斯核,训练数据类别标签作平衡策略
clf = svm.SVC(kernel='rbf',class_weight='balanced')
clf.fit(xx_train, yy_train)
rv2=clf.score(xx_train, yy_train);#模型准确率
yy1=clf.predict(xx_test)
yy1=yy1.reshape(len(yy1),1)
r=yy_test-yy1
rv3=len(r[r==0])/len(r) #预测准确率
xx_0=np.hstack((Z[A4==0,1:],y_0r.reshape(len(y_0r),1)))#预测自变量
t=pd.DataFrame(xx_0)
P=clf.predict(xx_0) #预测结果,1-执行,0-未被执行
p=P
#8.6
R1=sum(y_0r)-sum(y_0)
R2=len(p[p==1])
R2=int(R2*rv2)
return(R1,R2)
最后也是狠狠拿下。