欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用Python做一个简单的对账

程序员文章站 2022-05-07 18:17:45
#工作中常常碰到需要对账的情况,理想的状态是开发功能,有时候订单量既不大又不小的时候,用python100万毫无压力毫无压力。如果2边都是成功的订单稍微简单点,但是2边都是全量的订单则较难处理,往往不同的系统对于成功的描述会不同,比如有些是’success’,有些则是一个数字,或者是“成功”以后续供业务人员具体处理。另外一种是资金明细,一笔订单有2笔,那么需要对原始资金明细进行,如果一边是资金明细,一边是订单明细,那么最好,记录下时间差,后期再调整,......

#工作中常常碰到需要对账的情况,有时候订单量既不大又不小的时候,用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("有重复订单号,请查询")

本文地址:https://blog.csdn.net/u010564788/article/details/107133503