数据分析_商品维度占比及变化可视化分析(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:         passprint("[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_MonthY_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_MonthY_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_MonthY_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:         passprint("[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_MonthY_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_MonthY_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_MonthY_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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JVM系列】关于静态块、静态属性、构造块、构造方法的执行顺序

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

2.Vue简介

Vue简介 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,V…

【网站项目】“最多跑一次”小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【一竞技DOTA2】双冠王N0tail将发布新书自传《性格胜过天赋》

1、近日Ti双冠王N0tail,在个人推特上宣布将发布自己的自传《性格胜过天赋》。N0tail职业生涯豪夺两届Ti冠军,700万美元个人生涯奖金亦是电竞史最高的传奇选手。 “经过许多年的努力和收到的大量请求,我将发布我的自传新书《性格胜过天赋》&am…

特征值eigenvalue与特征向量eigenvector

特征值,特征向量概念 在线性代数中,对于一个给定的线性变换A,他的特征向量v经过这个线性变换的作用之后,得到的新向量仍然与原来的 v v v保持在同一条直线上。但长度或方向也许会改变。即: A v Av Av λ v \lambda…

强化网络安全防线,您的等级保护措施到位了吗?

在这个信息化飞速发展的时代,网络安全已经成为我们每个人都需要关注的问题。无论是企业还是个人,我们的工作和生活都越来越依赖于网络。确保网络环境的安全,防止信息泄露和网络攻击,已经成为了一项至关重要的任务。等级保护制度作…

如何做一个优秀的系统工程师?

一、背景 做好一个优秀系统工程师的关键在于其在产品开发生命周期中对需求分析的有效把握与运用,这个过程直接影响到系统的整体架构设计、规格参数的明确设定以及业务流程的深度挖掘与优化。需求分析不仅是理解用户实际问题的核心环节,更是界定系统开发…

无限滚动分页加载与下拉刷新技术探析:原理深度解读与实战应用详述

滚动分页加载(也称为无限滚动加载、滚动分页等)是一种常见的Web和移动端应用界面设计模式,用于在用户滚动到底部时自动加载下一页内容,而无需点击传统的分页按钮。这种设计旨在提供更加流畅、连续的浏览体验,减少用户交…

Go语言中通过数据对齐降低内存消耗和提升性能

数据对齐是一种安排数据分配方式以加速 CPU 访问内存的方法。 不了解这个概念会导致额外的内存消耗甚至性能下降。 要了解数据对齐的工作原理,让我们首先讨论没有它会发生什么。假设我们分配两个变量,一个 int32 类型的 (32 B) 和…

docker-compose 安装MongoDB续:创建用户及赋权

文章目录 1. 问题描述2. 分析2.1 admin2.2 config2.3 local 3. 如何连接3.解决 1. 问题描述 在这一篇使用docker-compose创建MongoDB环境的笔记里,我们创建了数据库,但是似乎没有办法使用如Robo 3T这样的工具去连接数据库。连接的时候会返回这样的错误&…

Redis:报错Creating Server TCP listening socket *:6379: bind: No error

错误: window下启动redis服务报错: Creating Server TCP listening socket *:6379: bind: No error 原因: 端口6379已被绑定,应该是因为上次未关闭服务 解决: ①依次输入命令: redis-cli.exe &#xff08…

RAG与LLM本身知识存在冲突时,大模型如何抉择?

原文:https://arxiv.org/pdf/2404.10198.pdf 引言 在人工智能领域,大型语言模型(LLMs)因其强大的语言理解和生成能力而备受关注。然而,这些模型在处理特定问题时可能会产生错误信息,即所谓的“幻觉”&…

springcloud第4季 springcloud-alibaba之sentinel

一 sentinel介绍 1.1 sentinel作用 sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障服务的稳定性。 1.2 组成部分 sen…

基于人工智能的机动车号牌检测与推理系统v1.0

基于人工智能的机动车号牌检测与推理系统v1.0代码重构与实现。 目前整合3中现有算法,并完成阶段性改造,包括【传统方法检测车牌,SVM推理字符】、【YOLO方法检测车牌,SVM推理字符】、【YOLO方法检测车牌,CNN推理字符】&…

FPGA - 基于自定义AXI FULL总线的PS和PL交互

前言 在FPGA - ZYNQ 基于Axi_Lite的PS和PL交互中,介绍了基于基于AXi_Lite的PL和PS交互,接下来构建基于基于Axi_Lite的PS和PL交互。 AXI_GP、AXI_HP和AXI_ACP接口 首先看一下ZYNQ SoC的系统框图,如下图所示。在图中,箭头方向代表…

OpenHarmony 蓝牙相关API用法

介绍 本示例通过使用蓝牙低功耗心率服务,展示蓝牙相关API用法。实现了以下几点功能: 发现具有特定服务的设备。连接到设备。发现服务。发现服务的特征、如何读取给定特征的值、为特征设置通知等。 相关概念 BLE扫描:通过BLE扫描接口实现对…

互联网技术知识点总览——计算机网络知识框架

简介 本文对计算机网络的知识点整体框架进行梳理和分享如下:

【深度学习】写实转漫画——CycleGAN原理解析

1、前言 上一篇,我们讲解了按照指定文本标签生成对应图像的CGAN。本篇文章,我们讲CycleGAN。这个模型可以对图像风格进行转化,并且训练还是在非配对的训练集上面进行的,实用性挺大 原论文:Unpaired Image-to-Image T…

自定义鼠标软件 SteerMouse最新完整激活版

SteerMouse是一款实用的Mac OS X系统辅助工具,可以帮助用户自定义鼠标和触控板的设置,提高使用效率。它提供了多种功能,如自定义按钮、滚轮和光标速度,以及调整灵敏度等,使用户能够根据自己的需求和习惯进行优化。 Ste…

idea 将项目上传到gitee远程仓库具体操作

目录标题 一、新建仓库二、初始化项目三、addcommit四、配置远程仓库五、拉取远程仓库内容六、push代码到仓库七、如果是私有仓库可能会拉取失败(一)需要增加SSH 公钥(二)把远程仓库地址换成ssh的连接八、如果是私有仓库&#xff…