{ "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 }