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