案例分析: 众包任务
“拍照赚钱”是移动互联网下的一种自助式服务模式。用户下载APP,注册成为APP会员,然后从APP上领取需要拍照的任务(比如上超市去检查某种商品的上架情况),赚取APP对任务所标定的酬金。这种基于移动互联网的自助式劳务众包平台,为企业提供各种商业检查和信息搜集,相比传统的市场调查方式可以大大节省调查成本,而且有效地保证了调查数据真实性,缩短了调查的周期。因此APP成为该平台运行的核心,而APP中的任务定价又是其核心要素。如果定价不合理,有的任务就会无人问津,而导致商品检查的失败。
附件一是一个已结束项目的任务数据,包含了每个任务的位置、定价和完成情况(“1”表示完成,“0”表示未完成);附件二是会员信息数据,包含了会员的位置、信誉值、参考其信誉给出的任务开始预订时间和预订限额,原则上会员信誉越高,越优先开始挑选任务,其配额也就越大(任务分配时实际上是根据预订限额所占比例进行配发)。附件一和附件二的表结构如表7-1和表7-2所示。
问题:
(1) 对每一个任务,计算该任务在5公里范围内的任务数量总和,记为Z1。
(2) 对每一个任务,计算该任务在5公里范围内的任务平均价格,记为Z2。
(3) 对每一个任务,计算该任务在5公里范围内的会员个数,记为Z3。
(4) 对每一个任务,计算该任务在5公里范围内的会员信誉平均值,记为Z4。
(5) 对每一个任务,计算该任务在5公里范围内的会员可预订任务限额总和,记为Z5。
图7-1所示圆圈代表任务,三角形代表会员,分布在同一个区域上,位置均由经度和纬度确定。以某个任务为圆心,5公里范围为半径,作一个圆,如图中所示。该任务在5公里范围内有4个任务(包括自身)、2个会员。对该任务来讲,则:
Z1=4;
Z2=对应4个任务定价的平均值
Z3=2
Z4=对应2个会员信誉值的平均值
Z5=对应2个会员预订限额的总和
本案例的关键是在计算任务之间、任务与会员之间的距离,从而确定每个任务在5公里范围内具体包括哪些任务和会员,进而就可以计算其指标值了。
任务完成:计算所有任务的Z1、Z2、Z3、Z4、Z5。
前面介绍了第0个任务点与所有任务(线)、所有会员(线)之间的计算,在此基础上利用循环即可实现所有任务与所有任务、所有会员之间的指标计算。示例代码如下:
import pandas as pd #导入pandas库
import numpy as np #导入nmypy库
import math #导入数学函数模
A=pd.read_excel('附件一:已结束项目任务数据.xls')
B=pd.read_excel('附件二:会员信息数据.xlsx')
# 预定义,存放所有任务的指标Z1、Z2、Z3、Z4、Z5
Z=np.zeros((len(A),5))
for q in range(len(A)):
A_Wq=A.iloc[q,1] #第q个任务的维度
A_Jq=A.iloc[q,2] #第q个任务的经度
# 预定义数组D1,用于存放第q个任务与所有任务之间的距离
# 预定义数组D2,用于存放第q个任务与所有会员之间的距离
D1=np.zeros((len(A)))
D2=np.zeros((len(B)))
for t in range(len(A)):
A_Wt=A.iloc[t,1] #第t个任务的维度
A_Jt=A.iloc[t,2] #第t个任务的经度
#第q个任务到第t个任务之间的距离
dt=111.19*math.sqrt((A_Wq-A_Wt)**2+(A_Jq-A_Jt)**2*math.cos((A_Wq+A_Wt)*math.pi/180)**2);
D1[t]=dt
for k in range(len(B)):
B_WJ=B.iloc[k,1]
I=B_WJ.find(' ',0,len(B_WJ))
B_Wk=float(B_WJ[0:I])
#第k个会员的维度
B_Jk=float(B_WJ[I:len(B_WJ)])
#第k个会员的经度
#第q个任务到第k个会员之间的距离
dk=111.19*math.sqrt((A_Wq-B_Wk)**2+(A_Jq-B_Jk)**2*math.cos((A_Wq+B_Wk)*math.pi/180)**2);
D2[k]=dk
Z1=len(D1[D1<=5])
Z2=A.iloc[D1<=5,[3]].mean()[0]
Z3=len(D2[D2<=5])
Z4=B.iloc[D2<=5,[2,4]].sum()[0]
Z5=B.iloc[D2<=5,[2,4]].sum()[1]/Z3
Z[q,0]=Z1
Z[q,1]=Z2
Z[q,2]=Z3
Z[q,3]=Z4
Z[q,4]=Z5
本案例在指标计算过程中,详细介绍了如何由简单到复杂的程序演化计算过程,也体现了由点到线,再到面的的编程思想。点:即第0个任务与第1个任务、第0个会员之间距离的点对点的计算。线:即第0个任务与所有任务、所有会员之间的由点到线的计算。面:即所有任务与所有任务、所有会员之间的线到面的计算。这种由简单到复杂的程序演化编程思想,对编程具有非常重要的作用。