11 KiB
11 KiB
取订单包裹数据,计算它系统估算物流费用,实际支出物流成本,本地跑出来的同渠道的估算物流成本,和本地跑出来的理论最小渠道和物流成本
In [ ]:
import pandas as pd from utils.gtools import MySQLconnect # 读取需要计算的包裹信息 with MySQLconnect('ods') as db: sql = """ SELECT DATE_FORMAT(order_date,"%Y-%m") AS 月份, order_date AS 订单日期, a.目的国, a.单号 AS `order_id`, a.包裹号 AS package, a.快递公司 AS 投递渠道, a.运输方式, d.order_price AS `销售额`, d.order_price_dollar AS `销售额美元`, d.postcode, a.`快递跟踪号`, b.length AS `长`, b.width AS `宽`,. b.hight AS `高`, b.weight AS `重量`, b.length*b.width*b.hight/6000 AS 体积重, pfi.package_fund AS `实际尾端支出CNY`, pfi.other_expend AS `实际额外支出CNY`, pfi.indemnity AS `实际赔偿CNY`, pfi.package_fund + pfi.other_expend - pfi.indemnity AS `尾端最终支出CNY`, pfi.head_way_express_fee AS `实际头程支出CNY`, pfi.express_fee AS `基础估算(cp尾端CNY)`, pfi.express_additional_fee AS `偶发估算(cp附加费CNY)` FROM order_express a JOIN package_vol_info b ON a.`包裹号` = b.package JOIN order_list d ON a.`单号` = d.order_id LEFT JOIN package_fee_info pfi ON b.package =pfi.package WHERE a.`包裹状态` NOT REGEXP "作废|--" AND b.hight > 0 AND b.length > 0 AND b.width > 0 AND b.hight > 0 AND b.weight > 0 # AND a.`目的国`="United Kingdom" AND fund_status NOT regexp "等待|失败" AND site_name not REGEXP "Beautifulhalo|Litfad|SanBuy|kwoking|lakiq|Curtainsland|CurtainsIn|Brillcurtains" # AND site_name NOT REGEXP "Walmart-Lakiq" AND order_date >="2025-06-01" and order_date <"2025-11-21" """ df=pd.read_sql(sql,db.con) # print(df) # df.to_clipboard(index=False) df
计算实际物流渠道打单的预估费用,以订单为单位计算,然后价格给每个订单的每个包裹
In [ ]:
from 物流t投递审核 import local_fee_cal,cal_min_fee new_df = local_fee_cal(df) new_df =cal_min_fee(new_df) # 这里注意,这个函数的返回值新增的“最优总费用”和“多票最小费用”这两列是以订单为单位的,并未分摊到包裹,其他列都是以包裹为单位 new_df.to_excel(r'C:\Users\Admin\Desktop\售价数据类\数据统计\物流类\2025-近半年测算物流.xlsx',index=False)
In [ ]:
import pandas as pd new_df=pd.read_excel(r'C:\Users\Admin\Desktop\售价数据类\数据统计\物流类\2025-06测算物流.xlsx',sheet_name="Sheet1") new_df = new_df[new_df['尾端渠道']=="卡派-GEL"]
In [ ]:
import pandas as pd from utils.logistics_name_config import logistics_name company_mapping = logistics_name from utils.countryOperator import OperateCountry from utils.logisticsBill import BillFactory from utils.Package import Package, Package_group import pandas as pd import json import re # 美国 from utils.logisticsBill import Billing opCountry = OperateCountry('US') df_grouped= new_df.groupby('快递跟踪号') # opCountry = OperateCountry("UK") for order_num, group in df_grouped: postcode = group['postcode'].iloc[0] if pd.isna(postcode) or str(postcode).lower() == "nan": continue packages= Package_group() # Metro-SAIR try: company_name = company_mapping[group['快递公司'].iloc[0]] except: continue if company_name == "--": continue # opCountry = OperateCountry(group['目的国'].iloc[0]) total_weight=0 # 按体积重分费用 for index,row in group.iterrows(): if row['长'] == 0 or row['宽'] == 0 or row['高'] == 0 or row['重量'] == 0: continue total_weight += row['体积重'] package = Package(row['package'],row['长'],row['宽'],row['高'],row['重量']) packages.add_package(package) try: bill1 = Billing(str(index),opCountry,packages,str(postcode),company_name=company_name,head_type=1,beizhu='') # bill2=Billing(str(index),opCountry,packages,str(postcode),company_name="Fedex-HOME",head_type=1,beizhu='DPD-NV') # HOME费用 # bill3=Billing(str(index),opCountry,packages,str(postcode),company_name="Fedex-GROUD",head_type=1,beizhu='DPD-ZG') # Fedex-GROUD # bill4=Billing(str(index),opCountry,packages,str(postcode),company_name="Fedex-TEST",head_type=1,beizhu='DPD-ZG') # 测试 if bill1.tail_amount[0] >=7777: continue for index,row in group.iterrows(): propertion = row['体积重']/total_weight df.loc[df['package']==row['package'],'包裹头程'] = bill1.head_amount[0]*propertion # df.loc[df['package']==row['package'],'原渠道'] = bill1.tail_amount[0]*1 # df.loc[df['package']==row['package'],'Fedex-HOME'] = bill2.tail_amount[0]*1 # df.loc[df['package']==row['package'],'Fedex-GROUND'] = bill3.tail_amount[0]*1 # df.loc[df['package']==row['package'],'Fedex-TEST'] = bill4.tail_amount[0]*1 # df.loc[df['package']==row['package'],'尾端货币']= bill1.tail_amount[1] # for item in bill2.items: # df.loc[df['package']==row['package'],"HOME"+item.item_detail] = item.amount # for item in bill3.items: # df.loc[df['package']==row['package'],"GROUD"+item.item_detail] = item.amount # for item in bill4.items: # df.loc[df['package']==row['package'],"TEST"+item.item_detail] = item.amount df.loc[df['快递跟踪号']==order_num,'订单尾端'] = bill1.tail_amount[0] # df.loc[df['快递跟踪号']==order_num,'订单附加费'] = bill1.get_other_fee() df.loc[df['快递跟踪号']==order_num,'货币'] = bill1.tail_amount[1] df.loc[df['快递跟踪号']==order_num,'尾端渠道'] = bill1.company_name except: continue print(index,bill1.bill_dict()) df.to_excel(r'C:\Users\Admin\Desktop\10月英国测算物流.xlsx',index=False)
In [ ]:
df.to_excel(r'C:\Users\Admin\Desktop\订单利润率分析1.xlsx',index=False)
计算最优渠道费用
In [ ]:
from utils.countryOperator import OperateCountry from utils.logisticsBill import BillFactory from utils.Package import Package, Package_group import pandas as pd import json import re # 美国 from utils.logisticsBill import Billing import requests opCountry = OperateCountry('US') for order_num, group in df_grouped: postcode = group['postcode'].iloc[0] if pd.isna(postcode) or str(postcode).lower() == "nan": continue if "海运" in row['运输方式']: head_type = 1 else: head_type = 0 # 包裹打包 packages = Package_group() for index,row in group.iterrows(): package = Package(row['包裹号'],row['长'],row['宽'],row['高'],row['重量']) packages.add_package(package) if packages is None: continue bill = Billing(str(order_num),opCountry,packages,postcode,company_name=None,head_type=head_type,beizhu='1') head_price = bill.head_amount[0] tail_price = bill.tail_amount[0] if "USPS" in row['快递公司']: tail_price = tail_price/2 df.loc[df['order_id']==order_num,'最优尾端费用'] = tail_price/len(packages) # df.loc[index,"尾端货币"] = bill.tail_amount[1] df.loc[df['order_id']==order_num,'最优渠道'] = bill.company_name print(f"order_num:{order_num},最优尾端费用:{tail_price/len(packages)},最优渠道:{bill.company_name}") df.to_clipboard(index=False)
In [ ]:
df.to_clipboard(index=False)
In [ ]:
df
In [ ]: