“拍照赚钱”是移动互联网下的一种自助式服务模式。用户下载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公里范围内具体包括哪些任务和会员,进而就可以计算其指标值了。

任务完成:计算所有任务的Z1Z2Z3Z4Z5

前面介绍了第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个任务与所有任务、所有会员之间的由点到线的计算。面:即所有任务与所有任务、所有会员之间的线到面的计算。这种由简单到复杂的程序演化编程思想,对编程具有非常重要的作用。