#工作中常常碰到需要对账的情况,有时候订单量既不大又不小的时候,用python的pandas库可以方便的对账,100万条左右的数据也是很方便的
如果2方都是成功的订单比较简单,对账的结果就是一方有另一方无,二方价格不一致的情况 1.需要对原始数据进行处理,找出可以匹配的字段,如果原始数据是资金明细,一笔订单可能对应2笔流水,那么需要对原始资金明细进行处理,把2条流水(往往是一正一负) 2.核对完毕后需要把对账差异的明细和汇总的结果导出
第一个函数校验一下有没有重复的订单号,订单号不唯一要查原因再作核对
def wy(df,ord_name): a=df[df.duplicated(subset=ord_name)][ord_name]#把重复的订单号找出来 b=df[df[ord_name].isin(a)]#根据订单号把这样订单都拉出来 c=b.groupby(b[ord_name]).count().reset_index()#对这些重复订单计下数 return b,c def duizhang(data_A,data_B,A_ord,B_ord,A_price,B_price): t1=time.time() dz=pd.merge(data_A,data_B,how='outer',left_on=A_ord,right_on=B_ord,sort=False) dz['差额']=dz[A_price]-dz[B_price] result=dz[dz['差额']!=0]#如果一边有数据一边没有数据订单肯定也属于!=0的范畴 result.to_excel((os.path.abspath(os.path.pardir))+"\\"+"对账结果.xlsx",index=False) t2=time.time()#记下时间,一般100万左右的订单量python跑起来还是很快的 print(t2-t1) hz={'金额':[dz[dz['差额'].notnull()]['差额'].sum(), dz[dz['差额'].isnull().values==True][A_price].sum(), -dz[dz['差额'].isnull().values==True][B_price].sum(), data_A[A_price].sum(), -data_B[B_price].sum(),]}#负号是为了方便计算 hz2=DataFrame(hz,index=['A方减B方差价','A方有B方无','A方无B方有','A方金额','B方金额'])#index的名字可以改下 hz2.to_excel((os.path.abspath(os.path.pardir))+"\\"+"差异汇总.xlsx",index=True) return result,hz2 if __name__=='__main__': if wy(data_1,'订单号')[0].count()[0] ==0 or wy(data_1,'订单号')[0].count()[0]:#如果有重复的订单号需要先查原因 dzjg=duizhang(data_1,data_2,'A方订单号的字段名','B方订单号的字段名','A方价格的字段名','B方价格的字段名') else: print("有重复订单号,请查询")