logistics/物流渠道测算.ipynb

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 [ ]: