Python 批量繪制銷量時間圖和分布圖(美國)

一、需求

針對Amazon銷售后臺導出的銷售記錄(Excel形式),將其劃分成各產(chǎn)品的銷量-時間圖和銷量-分布圖。

Excel格式如下所示:

原始數(shù)據(jù)表

二、思路

2.1 銷量時間圖

按產(chǎn)品(sku列)篩選原始數(shù)據(jù)表,統(tǒng)計各個產(chǎn)品在不同時間(date/time列)的銷量(quantity列),統(tǒng)計結果存入以該產(chǎn)品名命名的excel中。各產(chǎn)品統(tǒng)計excel形式如下:

各產(chǎn)品銷量 - 時間統(tǒng)計表

再以各產(chǎn)品銷量 - 時間統(tǒng)計表為輸入數(shù)據(jù),批量繪制各產(chǎn)品的銷量時間圖。

2.2 銷量分布圖

步驟同銷量時間圖,按產(chǎn)品(sku列)篩選原始數(shù)據(jù)表,統(tǒng)計各個產(chǎn)品在不同地區(qū)(date/time列)的銷量(quantity列),統(tǒng)計結果存入以該產(chǎn)品名命名的excel中。各產(chǎn)品統(tǒng)計excel形式如下:

各產(chǎn)品銷量 - 地區(qū)統(tǒng)計表

再以各產(chǎn)品銷量 - 地區(qū)統(tǒng)計表為輸入數(shù)據(jù),批量繪制各產(chǎn)品的銷量分布圖。

三、Python代碼實現(xiàn)——銷量時間圖

3.1 批量將原始數(shù)據(jù)表處理成多張銷量-時間excel(按產(chǎn)品分)

# 創(chuàng)建目錄
import os
def mkdir(savepath1):
    isExists=os.path.exists(savepath1)
    if not isExists:
        os.makedirs(savepath1)
        print(savepath1+' 創(chuàng)建成功')
        return True
    else:
        print(savepath1+' 目錄已存在')
        return False
import pandas as pd
import numpy as np
import openpyxl
from datetime import datetime

def generate_sales_excel_for_timeline(ori_file, savepath):
    savepath1 = savepath + "/銷量文件-時間"
    mkdir(savepath1)
    df = pd.read_excel(ori_file, sheet_name = 0)
    dates = df['date/time'].tolist()
    skus = df['sku'].tolist()

    dates1 = []
    for date in dates:                  # 處理date字符串,只保留年月日信息
        date1 = date[0:-15]             # 針對所給的日期格式,去掉后面的時分秒
        date1 = date1.rstrip()
        dates1.append(date1)
    df.loc[:,'date/time'] = dates1      # 替換原來DataFrame中'date/time'的值
    print(df)

    duplicated_dates0 = list(set(dates1))    # 日期去重
    arr = np.array(duplicated_dates0)
    # 將str格式的日期轉換成date格式,排序,再轉換成str格式
    duplicated_dates = arr[np.argsort([datetime.strptime(i, '%b %d, %Y') for i in duplicated_dates0])].tolist()
    print(duplicated_dates)

    duplicated_skus = list(set(skus))               # 商品種類去重
    num_sku = len(duplicated_skus)                  # 商品種類數(shù)
    print(duplicated_skus)

    k = 1
    for duplicated_sku in duplicated_skus:
        list_sales = []                             # 用于存放每一種產(chǎn)品的各日期銷量
        for duplicated_date in duplicated_dates:
            df_sku_date = df.loc[(df['date/time'] == duplicated_date)&(df['sku'] == duplicated_sku)]
            sale = df_sku_date['quantity'].sum()           # 循環(huán),篩選出每一種產(chǎn)品每一個日期的記錄,對銷量求和
            list_sales.append(sale)                         
        wb = openpyxl.Workbook()                    # 每一種產(chǎn)品生成一張excel表格
        ws = wb['Sheet']
        ws.title = duplicated_sku
        ws.cell(1,1).value = 'date'
        ws.cell(1,2).value = 'sale'
        for i in range(len(duplicated_dates)):        # 對應的單元格內(nèi)填入內(nèi)容
            ws.cell(i+2 ,1).value = duplicated_dates[i]
            ws.cell(i+2 ,2).value = list_sales[i]
        wb.save(savepath1 + "/" + duplicated_sku + ".xlsx")
        print('正在生成第%d個excel文件'%(k))
        print('進度:(%d / %d)'%(k, num_sku))
        k += 1
    
    list_sales_total = []                       # 同理,生成每一個日期的所有產(chǎn)品匯總銷量文件Total.xlsx
    for duplicated_date in duplicated_dates:
        df_date = df.loc[df['date/time'] == duplicated_date]
        sale_total = df_date['quantity'].sum()
        list_sales_total.append(sale_total)
    wb = openpyxl.Workbook()                    
    ws = wb['Sheet']
    ws.title = 'Total'
    ws.cell(1,1).value = 'date'
    ws.cell(1,2).value = 'sale'
    for i in range(len(duplicated_dates)):
        ws.cell(i+2 ,1).value = duplicated_dates[i]
        ws.cell(i+2 ,2).value = list_sales_total[i]
    wb.save(savepath1 + "/Total.xlsx")
    print('正在生成Total文件')
    print('進度:(1 / 1)')
    print('所有銷量-時間文件已生成完畢!')
if __name__ == "__main__":
    ori_file='D:/原始訂單數(shù)據(jù).xlsx'
    savepath = 'D:/時間圖'
    generate_sales_excel_for_timeline(ori_file, savepath)

運行結果:

批量生成的銷量 - 時間統(tǒng)計表

某產(chǎn)品銷量 - 時間統(tǒng)計表

3.2 批量繪制銷量時間圖

import pyecharts.options as opts
from pyecharts.charts import Line, Grid
import os
import openpyxl
import pandas as pd

# 繪制單張銷量時間圖
def draw_USA_timeline(df, sheet_title, savepath):
    savepath1 = savepath + '/銷量時間圖'
    mkdir(savepath1)

    timeData = df['date'].tolist()
    salesData = df['sale'].tolist()

    line = (
        Line(init_opts=opts.InitOpts(width = "1200px", height= "600px"))
        .add_xaxis(timeData)                        # 橫坐標數(shù)據(jù):時間列表
        .add_yaxis(                                
            sheet_title,                            # 系列名
            salesData ,                             # 縱坐標數(shù)據(jù):銷量列表
            is_smooth=True,                         # 平滑效果
            label_opts=opts.LabelOpts(is_show=False),
            symbol_size=8,
            linestyle_opts=opts.LineStyleOpts(width=1.5),
        )
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title="銷量時間圖", subtitle="數(shù)據(jù)統(tǒng)計自" + timeData[0]
            ),
            xaxis_opts=opts.AxisOpts(
                axistick_opts=opts.AxisTickOpts(is_align_with_label=True),
                is_scale=False,
                boundary_gap=False,
            ),
            tooltip_opts=opts.TooltipOpts(trigger="axis"),              # 縱向有條線,更容易選中
            axispointer_opts=opts.AxisPointerOpts(                      # 橫向加線,會選中與鼠標所在地具有相同y值的點,以及對應的y值
                is_show=True, link=[{"xAxisIndex": "all"}]
            ),
            datazoom_opts=[                                             # 區(qū)域縮放項
                opts.DataZoomOpts(
                    is_show=True,               
                    is_realtime=True,                                   # 拖動過程中實時顯示
                )
            ],
            yaxis_opts=opts.AxisOpts(name="銷售量(個)", name_location="center", name_gap=55),
            toolbox_opts=opts.ToolboxOpts(                              # 工具箱設置
                is_show=True,
                feature={
                    "dataZoom": {"yAxisIndex": "none"},                 # 區(qū)域縮放按鈕
                    "restore": {},                                      # 撤銷
                    "saveAsImage": {},                                  # 保存為圖片
                },
            ),
        )
        .render(savepath1 + '/' + sheet_title + '.html')                # 保存為html格式文件
    )

#  批量繪制銷量時間圖
def draw_all_USA_timeline(path, savepath):
    filenames = os.listdir(path)                        # 獲取文件夾下所有文件名
    for i, filename in enumerate(filenames):            
        if i==0:
            iSpecialFile=i+1
            sFileName=filename                          # 獲取當前文件名

        print('==================第%s個文件========================='%(i+1))
        print('文件名:%s'%(filename))
         
        wb = openpyxl.load_workbook(path+'/'+filename)
        sheets = wb.sheetnames                          # 獲取當前workbook中所有的表格
        
        for j in range(len(sheets)):                    # 循環(huán)遍歷所有sheet
            sheet = wb[sheets[j]]
            print('第' + str(j + 1) + '個sheet Name: ' + sheet.title)
            df = pd.read_excel(path + '/' + filename,sheet_name=j)
            draw_USA_timeline(df,sheet.title, savepath)       # 每一張sheet繪制一份html地圖
    print('--------------------------------結束--------------------------------')
    print('\n')

if __name__ == "__main__":
    path = 'D:/時間圖/銷量文件-時間'
    savepath = 'D:/時間圖/銷售時間圖'
    draw_all_USA_timeline(path, savepath)

運行結果

批量生成的銷量時間圖

某產(chǎn)品銷量時間圖

四、Python代碼實現(xiàn)——銷量分布圖(美國各州)

4.1 批量將原始數(shù)據(jù)表處理成多張銷量-地區(qū)excel(按產(chǎn)品分)

import os

def mkdir(savepath1):
    isExists=os.path.exists(savepath1)
    if not isExists:
        os.makedirs(savepath1)
        print(savepath1+' 創(chuàng)建成功')
        return True
    else:
        print(savepath1+' 目錄已存在')
        return False
def generate_sales_excel_for_map(ori_file, savepath):
    savepath1= savepath + '/銷量文件-地圖'
    mkdir(savepath1)
    df = pd.read_excel(ori_file, sheet_name=0)
    skus = df['sku'].tolist()
    states = df['order state'].tolist()
    
    states1 = [] 
    for state in states:                    # 替換DataFrame中'order state'的值,使其全大寫
        state1 = state.upper()
        states1.append(state1)
    df.loc[:,'order state'] = states1

    duplicated_states = [                           # 美國所有州
    'AL',
    'AK',
    'AZ',
    'AR',
    'CA',
    'CO',
    'CT',
    'DE',
    'FL',
    'GA',
    'HI',
    'ID',
    'IL',
    'IN',
    'IA',
    'KS',
    'KY',
    'LA',
    'ME',
    'MD',
    'MA',
    'MI',
    'MN',
    'MS',
    'MO',
    'MT',
    'NE',
    'NV',
    'NH',
    'NJ',
    'NM',
    'NY',
    'NC',
    'ND',
    'OH',
    'OK',
    'OR',
    'PA',
    'PR',
    'RI',
    'SC',
    'SD',
    'TN',
    'TX',
    'UT',
    'VT',
    'VA',
    'WA',
    'WV',
    'WI',
    'WY',
    'DC'
    ]
    duplicated_skus = list(set(skus))               # 商品種類去重
    num_sku = len(duplicated_skus)                  # 商品種類數(shù)
    print(duplicated_skus)

    k = 1
    for duplicated_sku in duplicated_skus:
        list_sales = []                             # 用于存放每一種產(chǎn)品的各地區(qū)銷量
        for duplicated_state in duplicated_states:
            df_sku_state = df.loc[(df['sku'] == duplicated_sku)&(df['order state'] == duplicated_state)]
            sale = df_sku_state['quantity'].sum()   # 循環(huán),篩選出每一種產(chǎn)品每一個州的記錄,對銷量求和
            list_sales.append(sale)
        wb = openpyxl.Workbook()                    # 每一種產(chǎn)品生成一張excel表格
        ws = wb['Sheet']
        ws.title = duplicated_sku
        ws.cell(1,1).value = 'state'
        ws.cell(1,2).value = 'sale'
        for i in range(len(duplicated_states)):
            ws.cell(i+2 ,1).value = duplicated_states[i]
            ws.cell(i+2 ,2).value = list_sales[i]
        wb.save(savepath1 + "/" + duplicated_sku + ".xlsx")
        print('正在生成第%d個excel文件'%(k))
        print('進度:(%d / %d)'%(k, num_sku))
        k += 1

    list_sales_total = []                       # 同理,生成所有產(chǎn)品每一個日期的銷量文件Total.xlsx
    for duplicated_state in duplicated_states:
        df_state = df.loc[df['order state'] == duplicated_state]
        sale_total = df_state['quantity'].sum()
        list_sales_total.append(sale_total)
    wb = openpyxl.Workbook()                    
    ws = wb['Sheet']
    ws.title = 'Total'
    ws.cell(1,1).value = 'state'
    ws.cell(1,2).value = 'sale'
    for i in range(len(duplicated_states)):
        ws.cell(i+2 ,1).value = duplicated_states[i]
        ws.cell(i+2 ,2).value = list_sales_total[i]
    wb.save(savepath1 + "/Total.xlsx")
    print('正在生成Total文件')
    print('進度:(1 / 1)')
    print('所有銷量-地區(qū)文件已生成完畢!')
if __name__ == "__main__":
    ori_file='D:/原始訂單數(shù)據(jù).xlsx'
    savepath = 'D:/分布圖'
    generate_sales_excel_for_timeline(ori_file, savepath)

運行結果:

批量生成的銷量 - 地區(qū)統(tǒng)計表

某產(chǎn)品銷量 - 地區(qū)統(tǒng)計表

4.2 批量繪制銷量分布圖

#  繪制美國銷量圖
def draw_USA_distribution(df, sheet_title, savepath):
    fig = go.Figure(
        go.Choropleth( 
            locations=df['state'], # 設置位置,各州的編號(縮寫) 
            z = df['sale'].astype(float), # 設置填充色數(shù)據(jù) 
            locationmode = 'USA-states', # 設置國家名稱 
            colorscale = 'Reds', # 圖例顏色 
            colorbar_title = "銷量", # 圖例標題 
    )) 
    fig.update_layout( 
        title_text = sheet_title + '美國地區(qū)銷量', # 地圖標題 
        geo_scope='usa', # 設置地圖的范圍為美國 
        #scope可選有"world","usa","europe","asia","africa","north america","south america" 
    ) 
    # 將地圖導出為html文件 
    fig.write_html(savepath + '/' + sheet_title + ".html")

#  批量繪制銷量分布圖
def draw_all_USA_distribution(path, savepath):
    filenames = os.listdir(path)                        # 獲取文件夾下所有文件名
    savepath1 = savepath + '/銷量分布圖'
    mkdir(savepath1)
    for i, filename in enumerate(filenames):            
        if i==0:
            iSpecialFile=i+1
            sFileName=filename                          # 獲取當前文件名

        print('==================第%s個文件========================='%(i+1))
        print('文件名:%s'%(filename))
         
        wb = openpyxl.load_workbook(path+'/'+filename)
        sheets = wb.sheetnames                          # 獲取當前workbook中所有的表格
        
        for j in range(len(sheets)):                    # 循環(huán)遍歷所有sheet
            sheet = wb[sheets[j]]
            print('第' + str(j + 1) + '個sheet Name: ' + sheet.title)
            df = pd.read_excel(path + '/' + filename,sheet_name=j)
            draw_USA_distribution(df,sheet.title, savepath1)       # 每一張sheet繪制一份html地圖

    print('--------------------------------結束--------------------------------')
    print('\n')
if __name__ == "__main__":
    path = 'D:/分布圖/銷量文件-地圖'
    savepath = 'D:/分布圖/銷售分布圖'
    draw_all_USA_timeline(path, savepath)

運行結果:

批量生成的銷量分布圖

某產(chǎn)品銷量分布圖
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容