数据分析_商品维度占比及变化可视化分析(Pandas和Matplotlib)

数据分析_商品维度占比及变化可视化分析(Pandas和Matplotlib)

分析维度包括:

  1. 各商品年度销量占比

  2. 各商品月度销量变化

构建测试数据

这里你可以了解到:

  • 如何生成时间相关的数据。

  • 如何从列表(可迭代对象)中生成随机数据。

  • Pandas 的 DataFrame 自行创建,包含生成新字段。

  • Pandas 数据合并。

(1) 构建数据: 时间字段:

time_range = pd.date_range(start="2019/01/01", end="2021/12/31")

print("[Message] Time Range Built Through Pandas:")
print(time_range)

print("[Message] Time Length Built Through Pandas:")
print(len(time_range))

输出:

[Message] Time Range Built Through Pandas:
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-05', '2019-01-06', '2019-01-07', '2019-01-08',
               '2019-01-09', '2019-01-10',
               ...
               '2021-12-22', '2021-12-23', '2021-12-24', '2021-12-25',
               '2021-12-26', '2021-12-27', '2021-12-28', '2021-12-29',
               '2021-12-30', '2021-12-31'],
              dtype='datetime64[ns]', length=1096, freq='D')
[Message] Time Length Built Through Pandas:
1096

(2) 构建数据: 水果列表:

fruits = ["香蕉", "苹果", "葡萄", "橙子", "哈密瓜", "芭乐", "梨", "桃子"]
fruits_list = np.random.choice(fruits, size=len(time_range), replace=True)

print("[Message] Fruits List Built Through NumPy:")
print(fruits_list)

print("[Message] Length of Fruits List Built Through NumPy:")
print(len(fruits_list))

输出:

[Message] Fruits List Built Through NumPy:
['香蕉' '葡萄' '香蕉' ... '香蕉' '橙子' '桃子']
[Message] Length of Fruits List Built Through NumPy:
1096

(3) 构建数据: 客户列表:

names = ["Mike", "Jhon", "Tom", "Xiaoming", "Jimmy", "Lym", "Michk"]
names_list = np.random.choice(names, size=len(time_range), replace=True)

print("[Message] Customer List Built Through NumPy:")
print(names_list)

print("[Message] Length of Customer List Built Through NumPy:")
print(len(names_list))

输出:

[Message] Customer List Built Through NumPy:
['Mike' 'Michk' 'Michk' ... 'Xiaoming' 'Jhon' 'Lym']
[Message] Length of Customer List Built Through NumPy:
1096

(4) 构建数据: 订单数据:

order = pd.DataFrame({"time": time_range,   # -> 下单时间。
                      "fruit": fruits_list, # -> 水果名称。
                      "name": names_list,   # -> 顾客名。
                      "kilogram": np.random.choice(list(range(50,100)), size=len(time_range),replace=True)}) # -> 购买量。

print("[Message] Generate Order Data Through Pandas DataFrame:")
print(order)

输出:

[Message] Generate Order Data Through Pandas DataFrame:
            time  fruit      name  kilogram
0     2019-01-01   香蕉      Mike        63
1     2019-01-02   葡萄     Michk        69
2     2019-01-03   香蕉     Michk        51
3     2019-01-04   香蕉      Mike        69
4     2019-01-05   香蕉       Tom        64
...          ...    ...       ...       ...
1091  2021-12-27   葡萄       Lym        94
1092  2021-12-28     梨  Xiaoming        60
1093  2021-12-29   香蕉  Xiaoming        95
1094  2021-12-30   橙子      Jhon        90
1095  2021-12-31   桃子       Lym        93

[1096 rows x 4 columns]

(5) 构建数据: 水果信息:

information = pd.DataFrame({"fruit": fruits,
                            "price": [3.8, 8.9, 12.8, 6.8, 15.8, 4.9, 5.8, 7],
                            "region": ["华南", "华北", "西北", "华中", "西北", "华南", "华北", "华中"]})

print("[Message] Building Fruits Information Through Pandas DataFrame:")
print(information)

输出:

[Message] Building Fruits Information Through Pandas DataFrame:
    fruit  price  region
0    香蕉    3.8    华南
1    苹果    8.9    华北
2    葡萄   12.8    西北
3    橙子    6.8    华中
4  哈密瓜   15.8    西北
5    芭乐    4.9    华南
6      梨    5.8    华北
7    桃子    7.0    华中

(6) 构建数据: 合并订单数据和水果信息:

# 将订单信息和水果信息直接合并成一个完整的 DataFrame, 这个 df 就是要用到的测试数据。
df = pd.merge(order, information, how="outer").sort_values("time").reset_index(drop=True)

print("[Message] Merge Order Data and Fruits Information Through Pandas DataFrame:")
print(df)

输出:

[Message] Merge Order Data and Fruits Information Through Pandas DataFrame:
            time  fruit      name  kilogram  price  region
0     2019-01-01   香蕉      Mike        63    3.8    华南
1     2019-01-02   葡萄     Michk        69   12.8    西北
2     2019-01-03   香蕉     Michk        51    3.8    华南
3     2019-01-04   香蕉      Mike        69    3.8    华南
4     2019-01-05   香蕉       Tom        64    3.8    华南
...          ...    ...       ...       ...    ...   ...
1091  2021-12-27   葡萄       Lym        94   12.8    西北
1092  2021-12-28     梨  Xiaoming        60    5.8    华北
1093  2021-12-29   香蕉  Xiaoming        95    3.8    华南
1094  2021-12-30   橙子      Jhon        90    6.8    华中
1095  2021-12-31   桃子       Lym        93    7.0    华中

[1096 rows x 6 columns]

(7) 构建数据: 计算订单金额:

df["amount"] = df["kilogram"] * df["price"]

print("[Message] Compute Order Amount Through Pandas DataFrame:")
print(df.head())

输出:

[Message] Compute Order Amount Through Pandas DataFrame:
         time  fruit   name  kilogram  price  region  amount
0  2019-01-01   香蕉   Mike        63    3.8    华南   239.4
1  2019-01-02   葡萄  Michk        69   12.8    西北   883.2
2  2019-01-03   香蕉  Michk        51    3.8    华南   193.8
3  2019-01-04   香蕉   Mike        69    3.8    华南   262.2
4  2019-01-05   香蕉    Tom        64    3.8    华南   243.2

配置 Matplotlib (全局配置)

# 指定 Matplotlib 默认字体 (解决中文无法显示的问题)。
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决 Matplotlib 保存图像时负号 "-" 显示方块的问题。
plt.rcParams['axes.unicode_minus'] = False

# 设置 Matplotlib 字体大小 (全局生效)。
plt.rcParams['font.size'] = 6

各商品年度销量和销售额数据

提取年份:

# 提取日期中的年份。
df["year"] = df["time"].dt.year

计算各商品的年度销量和销售额数据:

# 计算各水果的年度销量和销售额数据。
annual_data = df.groupby(["year", "fruit"]).agg({"kilogram":"sum", "amount":"sum"}).reset_index()
annual_data["year"] =   annual_data["year"].astype(str)
annual_data["amount"] = annual_data["amount"].apply(lambda x: round(x, 2))

print("[Message] Top 10 Lines of Annual Quantity and Amount Data:")
print(annual_data.head(10))

输出:

[Message] Top 10 Lines of Annual Quantity and Amount Data:
   year   fruit  kilogram   amount
0  2019  哈密瓜      3671  58001.8
1  2019    桃子      3799  26593.0
2  2019      梨      2917  16918.6
3  2019    橙子      3084  20971.2
4  2019    芭乐      3378  16552.2
5  2019    苹果      3732  33214.8
6  2019    葡萄      3594  46003.2
7  2019    香蕉      3246  12334.8
8  2020  哈密瓜      3922  61967.6
9  2020    桃子      2877  20139.0

绘制商品年度销量占比和销售额占比

绘制各商品的年度销量占比环形图:

绘制 Matplotlib 环形图: 通过向 matplotlib.pyplot 的 .pie 方法传递参数 wedgeprops={‘width’:0.6} 绘制,自定义数值 0.6 表示环形图的宽度。

# 创建一个 10 * 32 点的图,设置分辨率为 144。
fig = plt.figure(figsize=(10, 32), dpi=144)

filter_data = annual_data[annual_data.year == "2019"]
ax1 = plt.subplot2grid((10, 32), (0, 0), rowspan=10, colspan=10)
ax1.pie(filter_data["kilogram"], labels=filter_data["fruit"], autopct='%1.2f%%', wedgeprops={'width':0.6})
ax1.set_title("环形图 (2019年商品销量占比)")

filter_data = annual_data[annual_data.year == "2020"]
ax2 = plt.subplot2grid((10, 32), (0, 11), rowspan=10, colspan=10)
ax2.pie(filter_data["kilogram"], labels=filter_data["fruit"], autopct='%1.2f%%', wedgeprops={'width':0.6})
ax2.set_title("环形图 (2020年商品销量占比)")

filter_data = annual_data[annual_data.year == "2021"]
ax3 = plt.subplot2grid((10, 32), (0, 22), rowspan=10, colspan=10)
ax3.pie(filter_data["kilogram"], labels=filter_data["fruit"], autopct='%1.2f%%', wedgeprops={'width':0.6})
ax3.set_title("环形图 (2021年商品销量占比)")

plt.show()

预览:

图01

绘制各商品的年度销售额树状热力图:

绘制 Matplotlib 树状热力图: 在 Matplotlib 中绘制树状热力图, 需要先 Pip 安装 squarify, 然后 import squarify 后即可调用 squarify.plot 方法。

# 重置 Matplotlib 字体大小 (全局生效)。
plt.rcParams['font.size'] = 10

# 创建一个 16 * 5 点的图,设置分辨率为 144。
fig = plt.figure(figsize=(16, 5), dpi=144)

filter_data = annual_data[annual_data.year == "2019"]
plt.subplot(1,3,1)
squarify.plot(filter_data["amount"],
              #color=['red', 'green', 'blue', 'orange'],
              label=filter_data["fruit"],
              value=filter_data["amount"],
              pad=True)
plt.title("树状热力图 (2019年商品销售额占比)")
plt.axis('off')

filter_data = annual_data[annual_data.year == "2020"]
plt.subplot(1,3,2)
squarify.plot(filter_data["amount"],
              #color=['red', 'green', 'blue', 'orange'],
              label=filter_data["fruit"],
              value=filter_data["amount"],
              pad=True)
plt.title("树状热力图 (2020年商品销售额占比)")
plt.axis('off')

filter_data = annual_data[annual_data.year == "2021"]
plt.subplot(1,3,3)
squarify.plot(filter_data["amount"],
              #color=['red', 'green', 'blue', 'orange'],
              label=filter_data["fruit"],
              value=filter_data["amount"],
              pad=True)
plt.title("树状热力图 (2021年商品销售额占比)")
plt.axis('off')

plt.show()

预览:

图02

各商品月度销售额数据

同时提取年份和月份:

# 同时提取日期中的年份和月份。
df["year_month"] = df["time"].dt.strftime('%Y%m')

计算各商品的月度销售额数据:

# 计算各水果的月度销售额数据。
monthly_data = df.groupby(["year_month", "fruit"])["amount"].sum().reset_index()

# 找出某些水果在哪些月份没有销售,并填充 0.0 便于绘图。
LIST_for_Year_Month = monthly_data["year_month"].drop_duplicates()
LIST_for_Fruit = monthly_data["fruit"].drop_duplicates()
# ..................................................
for ym in LIST_for_Year_Month:
    for fru in LIST_for_Fruit:
        
        filtered_line = monthly_data[(monthly_data.year_month == ym) & (monthly_data.fruit == fru)]
        
        if filtered_line.empty == True:
            
            new_line = {"year_month": ym, "fruit": fru, "amount": 0.0}
            # FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
            monthly_data = monthly_data.append(new_line, ignore_index=True)
            
        else:         
            pass

print("[Message] Monthly Amount Data:")
print(monthly_data)

输出:

[Message] Monthly Amount Data:
    year_month   fruit  amount
0       201901  哈密瓜  2496.4
1       201901    桃子  1687.0
2       201901      梨  1479.0
3       201901    橙子  1740.8
4       201901    芭乐  2744.0
..         ...     ...     ...
280     202112    橙子   523.6
281     202112    芭乐  1127.0
282     202112    苹果  3097.2
283     202112    葡萄  2649.6
284     202112    香蕉  1900.0

[285 rows x 3 columns]

绘制商品月销售额变化

绘制各商品的月度销售额堆叠条形图:

monthly_data = monthly_data.sort_values("year_month", ascending=True)
LIST_for_Year_Month = monthly_data["year_month"].drop_duplicates()
LIST_for_Fruit = monthly_data["fruit"].drop_duplicates()
LIST_for_Bottom = [i - i for i in range(len(LIST_for_Year_Month))]
# ..................................................
for i in range(len(LIST_for_Fruit)):
    
    if (i == 0):
        
        filter_data = monthly_data[monthly_data.fruit == LIST_for_Fruit[i]]
        X_axis = LIST_for_Year_Month
        Y_axis = filter_data["amount"]
        plt.bar(X_axis, Y_axis, bottom=0, label=LIST_for_Fruit[i])
        
        LIST_for_Y_Axis = Y_axis.values.tolist()
        LIST_for_Bottom = [n + m for n, m in zip(LIST_for_Bottom, LIST_for_Y_Axis)]
        
    else:
        
        filter_data = monthly_data[monthly_data.fruit == LIST_for_Fruit[i]]
        X_axis = LIST_for_Year_Month
        Y_axis = filter_data["amount"]
        plt.bar(X_axis, Y_axis, bottom=LIST_for_Bottom, label=LIST_for_Fruit[i])
        
        LIST_for_Y_Axis = Y_axis.values.tolist()
        LIST_for_Bottom = [n + m for n, m in zip(LIST_for_Bottom, LIST_for_Y_Axis)]
# ..................................................
plt.title("堆叠条形图 (水果月度销售额变化)")
plt.xticks(rotation=-90) # -> 将 X 轴刻度标签旋转 90 度 (正数为逆时针,负数为顺时针)。
plt.xlabel("日期 (年月)")
plt.ylabel("销售额 (Amount)")
plt.grid(True)
# bbox_to_anchor 设置图例位置,参照官网,(1.0, 0.7) 这个数值将图例设置到图像外侧右边中间。
plt.legend(bbox_to_anchor=(1.0, 0.7))

plt.show()

预览:

图03

绘制各商品的月度销售额走势折线图:

monthly_data = monthly_data.sort_values("year_month", ascending=True)
LIST_for_Year_Month = monthly_data["year_month"].drop_duplicates()
LIST_for_Fruit = monthly_data["fruit"].drop_duplicates()
# ..................................................
for fru in LIST_for_Fruit:
        
    filter_data = monthly_data[monthly_data.fruit == fru]
    X_axis = LIST_for_Year_Month
    Y_axis = filter_data["amount"]
    plt.plot(X_axis, Y_axis, label=fru)
# ..................................................
plt.title("折线图 (水果月度销售额走势)")
plt.xticks(rotation=-90) # -> 将 X 轴刻度标签旋转 90 度 (正数为逆时针,负数为顺时针)。
plt.xlabel("日期 (年月)")
plt.ylabel("销售额 (Amount)")
plt.grid(True)
# bbox_to_anchor 设置图例位置,参照官网,(1.0, 0.7) 这个数值将图例设置到图像外侧右边中间。
plt.legend(bbox_to_anchor=(1.0, 0.7))

plt.show()

预览:

图04

完整代码

#!/usr/bin/python3
# Create By GF 2023-07-24

# 分析维度包括:
# 1. 各商品年度销量占比
# 2. 各商品月度销量变化

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
import squarify

# (1) 构建数据: 时间字段。
time_range = pd.date_range(start="2019/01/01", end="2021/12/31")

print("[Message] Time Range Built Through Pandas:")
print(time_range)

print("[Message] Time Length Built Through Pandas:")
print(len(time_range))

# (2) 构建数据: 水果列表。
fruits = ["香蕉", "苹果", "葡萄", "橙子", "哈密瓜", "芭乐", "梨", "桃子"]
fruits_list = np.random.choice(fruits, size=len(time_range), replace=True)

print("[Message] Fruits List Built Through NumPy:")
print(fruits_list)

print("[Message] Length of Fruits List Built Through NumPy:")
print(len(fruits_list))

# (2) 构建数据: 客户列表。
names = ["Mike", "Jhon", "Tom", "Xiaoming", "Jimmy", "Lym", "Michk"]
names_list = np.random.choice(names, size=len(time_range), replace=True)

print("[Message] Customer List Built Through NumPy:")
print(names_list)

print("[Message] Length of Customer List Built Through NumPy:")
print(len(names_list))

# (4) 构建数据: 订单数据。
order = pd.DataFrame({"time": time_range,   # -> 下单时间。
                      "fruit": fruits_list, # -> 水果名称。
                      "name": names_list,   # -> 顾客名。
                      "kilogram": np.random.choice(list(range(50,100)), size=len(time_range),replace=True)}) # -> 购买量。

print("[Message] Generate Order Data Through Pandas DataFrame:")
print(order)

# (5) 构建数据: 水果信息。
information = pd.DataFrame({"fruit": fruits,
                            "price": [3.8, 8.9, 12.8, 6.8, 15.8, 4.9, 5.8, 7],
                            "region": ["华南", "华北", "西北", "华中", "西北", "华南", "华北", "华中"]})

print("[Message] Building Fruits Information Through Pandas DataFrame:")
print(information)

# (6) 构建数据: 合并订单数据和水果信息。
# 将订单信息和水果信息直接合并成一个完整的 DataFrame, 这个 df 就是要用到的测试数据。
df = pd.merge(order, information, how="outer").sort_values("time").reset_index(drop=True)

print("[Message] Merge Order Data and Fruits Information Through Pandas DataFrame:")
print(df)

# (7) 构建数据: 计算订单金额。
df["amount"] = df["kilogram"] * df["price"]

print("[Message] Compute Order Amount Through Pandas DataFrame:")
print(df.head())

# ####################################################################################################

# 指定 Matplotlib 默认字体 (解决中文无法显示的问题)。
plt.rcParams['font.sans-serif'] = ['SimHei']

# 解决 Matplotlib 保存图像时负号 "-" 显示方块的问题。
plt.rcParams['axes.unicode_minus'] = False

# 设置 Matplotlib 字体大小 (全局生效)。
plt.rcParams['font.size'] = 6

# ####################################################################################################

# 提取日期中的年份。
df["year"] = df["time"].dt.year

# 计算各水果的年度销量和销售额数据。
annual_data = df.groupby(["year", "fruit"]).agg({"kilogram":"sum", "amount":"sum"}).reset_index()
annual_data["year"] =   annual_data["year"].astype(str)
annual_data["amount"] = annual_data["amount"].apply(lambda x: round(x, 2))

print("[Message] Top 10 Lines of Annual Quantity and Amount Data:")
print(annual_data.head(10))

# ####################################################################################################
# 绘制各商品的年度销量占比环形图

# 创建一个 10 * 32 点的图,设置分辨率为 144。
fig = plt.figure(figsize=(10, 32), dpi=144)

filter_data = annual_data[annual_data.year == "2019"]
ax1 = plt.subplot2grid((10, 32), (0, 0), rowspan=10, colspan=10)
ax1.pie(filter_data["kilogram"], labels=filter_data["fruit"], autopct='%1.2f%%', wedgeprops={'width':0.6})
ax1.set_title("环形图 (2019年商品销量占比)")

filter_data = annual_data[annual_data.year == "2020"]
ax2 = plt.subplot2grid((10, 32), (0, 11), rowspan=10, colspan=10)
ax2.pie(filter_data["kilogram"], labels=filter_data["fruit"], autopct='%1.2f%%', wedgeprops={'width':0.6})
ax2.set_title("环形图 (2020年商品销量占比)")

filter_data = annual_data[annual_data.year == "2021"]
ax3 = plt.subplot2grid((10, 32), (0, 22), rowspan=10, colspan=10)
ax3.pie(filter_data["kilogram"], labels=filter_data["fruit"], autopct='%1.2f%%', wedgeprops={'width':0.6})
ax3.set_title("环形图 (2021年商品销量占比)")

plt.show()

# ####################################################################################################
# 绘制各商品的年度销售额树状热力图

# 重置 Matplotlib 字体大小 (全局生效)。
plt.rcParams['font.size'] = 10

# 创建一个 16 * 5 点的图,设置分辨率为 144。
fig = plt.figure(figsize=(16, 5), dpi=144)

filter_data = annual_data[annual_data.year == "2019"]
plt.subplot(1,3,1)
squarify.plot(filter_data["amount"],
              #color=['red', 'green', 'blue', 'orange'],
              label=filter_data["fruit"],
              value=filter_data["amount"],
              pad=True)
plt.title("树状热力图 (2019年商品销售额占比)")
plt.axis('off')

filter_data = annual_data[annual_data.year == "2020"]
plt.subplot(1,3,2)
squarify.plot(filter_data["amount"],
              #color=['red', 'green', 'blue', 'orange'],
              label=filter_data["fruit"],
              value=filter_data["amount"],
              pad=True)
plt.title("树状热力图 (2020年商品销售额占比)")
plt.axis('off')

filter_data = annual_data[annual_data.year == "2021"]
plt.subplot(1,3,3)
squarify.plot(filter_data["amount"],
              #color=['red', 'green', 'blue', 'orange'],
              label=filter_data["fruit"],
              value=filter_data["amount"],
              pad=True)
plt.title("树状热力图 (2021年商品销售额占比)")
plt.axis('off')

plt.show()

# ####################################################################################################

# 同时提取日期中的年份和月份。
df["year_month"] = df["time"].dt.strftime('%Y%m')

# 计算各水果的月度销售额数据。
monthly_data = df.groupby(["year_month", "fruit"])["amount"].sum().reset_index()

# 找出某些水果在哪些月份没有销售,并填充 0.0 便于绘图。
LIST_for_Year_Month = monthly_data["year_month"].drop_duplicates()
LIST_for_Fruit = monthly_data["fruit"].drop_duplicates()
# ..................................................
for ym in LIST_for_Year_Month:
    for fru in LIST_for_Fruit:
        
        filtered_line = monthly_data[(monthly_data.year_month == ym) & (monthly_data.fruit == fru)]
        
        if filtered_line.empty == True:
            
            new_line = {"year_month": ym, "fruit": fru, "amount": 0.0}
            # FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
            monthly_data = monthly_data.append(new_line, ignore_index=True)
            
        else:         
            pass

print("[Message] Monthly Amount Data:")
print(monthly_data)

# ####################################################################################################
# 绘制各商品的月度销售额堆叠条形图

monthly_data = monthly_data.sort_values("year_month", ascending=True)
LIST_for_Year_Month = monthly_data["year_month"].drop_duplicates()
LIST_for_Fruit = monthly_data["fruit"].drop_duplicates()
LIST_for_Bottom = [i - i for i in range(len(LIST_for_Year_Month))]
# ..................................................
for i in range(len(LIST_for_Fruit)):
    
    if (i == 0):
        
        filter_data = monthly_data[monthly_data.fruit == LIST_for_Fruit[i]]
        X_axis = LIST_for_Year_Month
        Y_axis = filter_data["amount"]
        plt.bar(X_axis, Y_axis, bottom=0, label=LIST_for_Fruit[i])
        
        LIST_for_Y_Axis = Y_axis.values.tolist()
        LIST_for_Bottom = [n + m for n, m in zip(LIST_for_Bottom, LIST_for_Y_Axis)]
        
    else:
        
        filter_data = monthly_data[monthly_data.fruit == LIST_for_Fruit[i]]
        X_axis = LIST_for_Year_Month
        Y_axis = filter_data["amount"]
        plt.bar(X_axis, Y_axis, bottom=LIST_for_Bottom, label=LIST_for_Fruit[i])
        
        LIST_for_Y_Axis = Y_axis.values.tolist()
        LIST_for_Bottom = [n + m for n, m in zip(LIST_for_Bottom, LIST_for_Y_Axis)]
# ..................................................
plt.title("堆叠条形图 (水果月度销售额变化)")
plt.xticks(rotation=-90) # -> 将 X 轴刻度标签旋转 90 度 (正数为逆时针,负数为顺时针)。
plt.xlabel("日期 (年月)")
plt.ylabel("销售额 (Amount)")
plt.grid(True)
# bbox_to_anchor 设置图例位置,参照官网,(1.0, 0.7) 这个数值将图例设置到图像外侧右边中间。
plt.legend(bbox_to_anchor=(1.0, 0.7))

plt.show()

# ####################################################################################################
# 绘制各商品的月度销售额走势折线图

monthly_data = monthly_data.sort_values("year_month", ascending=True)
LIST_for_Year_Month = monthly_data["year_month"].drop_duplicates()
LIST_for_Fruit = monthly_data["fruit"].drop_duplicates()
# ..................................................
for fru in LIST_for_Fruit:
        
    filter_data = monthly_data[monthly_data.fruit == fru]
    X_axis = LIST_for_Year_Month
    Y_axis = filter_data["amount"]
    plt.plot(X_axis, Y_axis, label=fru)
# ..................................................
plt.title("折线图 (水果月度销售额走势)")
plt.xticks(rotation=-90) # -> 将 X 轴刻度标签旋转 90 度 (正数为逆时针,负数为顺时针)。
plt.xlabel("日期 (年月)")
plt.ylabel("销售额 (Amount)")
plt.grid(True)
# bbox_to_anchor 设置图例位置,参照官网,(1.0, 0.7) 这个数值将图例设置到图像外侧右边中间。
plt.legend(bbox_to_anchor=(1.0, 0.7))

plt.show()

总结

以上就是关于 数据分析 商品维度占比及变化可视化分析(Pandas和Matplotlib) 的全部内容。

更多内容可以访问我的代码仓库:

https://gitee.com/goufeng928/public

https://github.com/goufeng928/public

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/561635.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IOS 32位调试环境搭建

一、背景 调试IOS程序经常使用gdb,目前gdb只支持32位程序调试,暂不支持IOS 64位程序调试。IOS 32位程序使用GDB调试之前,必须确保手机已越狱,否则无法安装和使用GDB调试软件。下面详细介绍GDB调试IOS 32位程序的环境搭建。 二、I…

数字时代的智慧演奏

数字化时代,工业不再是孤独的机器运转,而是演绎着一场智能与数据的华丽交响。无数智能节点的联动,数据的涌动,成为工业的新活力,同时也是创新的源泉。 工业互联网将每个机器、设备连接在一起,打破了原本独立…

从预训练损失的角度,理解语言模型的涌现能力

原文:Understanding Emergent Abilities of Language Models from the Loss Perspective 摘要 本文从预训练损失的角度重新审视语言模型的涌现能力,挑战了以往以模型大小或训练计算量为标准的观念。通过实验,作者发现预训练损失是预测下游任…

SRIO系列-时钟逻辑与复位逻辑

一、前言 上一篇讲述了SRIO协议的基本概念,传输的HELLO帧格式、事务类型等,本篇说一下SRIO IP核的时钟关系。 基本的IP设置可以参考此篇文章:【高速接口-RapidIO】Xilinx SRIO IP 核详解-CSDN博客 二、时钟关系 PHY可以在两个时钟域上运行…

C#语法知识之运算符

3、运算符 目录 3、运算符1、算数运算符思考 秒转化时间 2、字符串拼接3、条件运算符4、逻辑运算符5、位运算符6、三目运算符思考 闰年 1、算数运算符 1、赋值符号 //把右侧的值赋给左侧的变量2、算数运算符 _ * / float f 1 / 2f; %3、算数运算符的优先级 //乘除余优先级高…

【数据结构3-栈和队列】

数据结构3-栈和队列 1 栈-特殊的线性表-先进后出1.1 栈的三个案例 2 队列-与栈相反-先进先出2.1 队列的案例 3 用C实现栈的代码:4 用C实现队列的代码 1 栈-特殊的线性表-先进后出 1.1 栈的三个案例 2 队列-与栈相反-先进先出 2.1 队列的案例 3 用C实现栈的代码&…

<计算机网络自顶向下> TCP拥塞

目录 TCP拥塞控制机制 TCP拥塞感知 TCP速率控制方法 TCP拥塞控制和流量控制的联合动作 TCP拥塞控制策略 TCP吞吐量 TCP公平性 TCP拥塞控制机制 端到端的拥塞控制机制 路由器不向主机提供有关拥塞的反馈信息 路由器负担较轻 符合网络核心简单的TCP/IP架构原则 端系统根据自…

【机器学习】农田智能监控系统的实践探索

机器学习赋能现代农业:农田智能监控系统的实践探索 一、机器学习在现代农业中的重要作用二、机器学习在农田智能监控系统中的应用三、农田智能监控系统的实践意义 在科技飞速发展的今天,机器学习技术正以其强大的数据处理和模式识别能力,逐步…

Windows下Git的使用

目录 一、克隆远程仓库到本地二、git的三板斧2.1 add-将代码添加到本地仓库2.2 commit-提交代码到本地仓库2.3 push-推送本次添加操作到远程仓库2.4 gitee只有三板斧吗? 三、推送后没有出现绿点四、push到远程时报错五、git图形化界面下载链接 一、克隆远程仓库到本…

nodejs大文件上传

安装依赖 1.express 帮我们启动服务&#xff0c;并且提供接口 2.multer 读取文件&#xff0c;存储 3.cors 解决跨域 项目的目录结构&#xff1a; 前端代码&#xff1a; <input type"file" /><script>const file document.queryselector(input)// 分隔…

【漏洞复现】WordPress_Wholesale_Market admin-ajax.php 任意文件读取漏洞

0x01 产品简介 WordPress Wholesale Market是一个WordPress主题,专门设计用于创建批发市场和在线商城网站。该主题提供了许多功能和设计元素,使您能够轻松地构建一个功能强大的批发市场平台,以满足批发商和零售商的需求。 0x02 漏洞概述 WordPress Wholesale Market存在任…

(2022级)成都工业学院数据库原理及应用实验八: 数据库恢复技术

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 1、使用mysqldump实现数据库备份。 2、使用mysqldump实…

【声呐仿真】学习记录1-配置dave、uuv_simulator

【声呐仿真】学习记录1-配置dave、uuv_simulator 1.介绍2.配置3.一些场景 1.介绍 家|DAVE项目 — Home | Project DAVE 2.配置 参考官方教程安装|DAVE项目 — Installation | Project DAVE mkdir -p ~/uuv_ws/src cd ~/uuv_ws/src git clone https://github.com/Field-Robot…

基于SpringBoot的“体质测试数据分析及可视化”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“体质测试数据分析及可视化”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 体质测试数据分析及可视化设计结构图…

python多线程技术(Threading)

文章目录 前言一、多线程(Threading)是什么?二、threading库1.初识多线程2.增加新线程2.1 多线程的基本使用2.2 对多线程是同时进行的进行一个直观上的演示(非重点--理解是实时就行)2.3 thread.join()功能2.4 使用queue(队列)功能获取多线程的返回值(重要,这就是前面那…

永恒之蓝上线CS

该文介绍了在内网环境下&#xff0c;利用永恒之蓝漏洞&#xff08;EternalBlue&#xff09;将攻击者控制台&#xff08;CS&#xff09;上线的方法。前提条件是目标机器可上网、无防火墙和杀毒软件&#xff0c;并且存在永恒之蓝漏洞。使用Erebus插件的eterblue功能&#xff0c;通…

【Java框架】Spring框架(三)——Spring整合Mybatis及Spring声明式事务

目录 回顾Mybatis和新对象思路整理 Spring和MyBatis的整合步骤1. 创建Web工程&#xff0c;导入Spring和MyBatis的相关依赖2. 建立开发目录结构&#xff0c;创建实体类3. 创建数据访问接口和SQL映射语句文件4. 使用Spring配置文件配置数据源4.1 database.properties4.2spring配置…

第6章 Kafka-Eagle监控【Kafka】

第6章 Kafka-Eagle监控【Kafka】 前言推荐第6章 Kafka-Eagle监控6.1 MySQL环境准备6.2 Kafka环境准备6.3 Kafka-Eagle安装6.4 Kafka-Eagle页面操作 最后 前言 2024-3-27 22:44:15 本文是根据尚硅谷学习所做笔记 仅供学习交流使用&#xff0c;转载注明出处 推荐 【尚硅谷】…

纯干货|图像清晰度从哪里优化

1.Demosaic 调试Demosaic参数需要结合实验室静物高频细节需要插值出来如静物场景的视力表、星条卡和实验室灯箱环境下解析率卡的解析度指标满足要求。 Demosaic模块实现的功能就是将输入的Bayer数据转化成RGB数据。为获得彩色图像,需要利用当前像素及周围像素的色彩分…

计算机组成原理【CO】Ch7 I/O大题

目录 I/O大题解题方法 I/O接口 各种I/O方式的特点 I/O端口编址 程序查询方式 中断控制方式 DMA控制方式 程序中断的工作流程 程序中断的工作流程 DMA方式和中断方式的区别 I/O大题解题方法 CPU 程序查询中断DMA I/O接口的类型 按字传输&#xff1a;每次传输一个字 程…