概述
本文档详细介绍了使用Python进行订单数据分析和可视化的过程。我们的目标是从存储在文本文件中的JSON数据中提取信息,对这些数据进行处理和聚合,最后以图表的形式展示分析结果。本文档将详细介绍所使用的技术、编程核心思想、实现过程中遇到的问题及其解决方案。
使用的技术及介绍
Python
Python是一种解释型、高级和通用的编程语言。它的设计哲学强调代码的可读性,简洁的语法和强大的社区支持,使其成为数据分析和自动化脚本的首选语言。
json模块
Python的json
模块提供了简单的接口来编码和解码JSON数据。它能够将Python对象转换为JSON格式的字符串,以及将JSON格式的字符串解析为Python对象。
pyecharts库
pyecharts
是一个用于生成Echarts图表的Python库。Echarts是一个由百度开发的开源数据可视化工具,它提供了丰富的图表类型和灵活的配置项,非常适合于在Web应用中展示复杂的数据。
collections.defaultdict
defaultdict
是Python标准库collections
模块中的一个类,它类似于普通的字典,但在访问不存在的键时不会抛出异常,而是会返回一个默认值。这在需要对数据进行聚合时非常有用。
目的及技术选择理由
我们的目标是分析订单数据,包括订单数量和金额,并按日期和省份进行分类。选择Python是因为其在数据处理方面的高效性和易用性。json
模块用于解析JSON格式的订单数据,而pyecharts
用于生成直观的图表。defaultdict
则简化了数据聚合的过程,避免了在字典中检查键是否存在的需要。
编程核心思想
数据解析
核心思想之一是将存储在文件中的JSON数据解析为Python可以操作的数据结构。这是通过json.loads()
函数实现的,它将JSON格式的字符串转换为Python的字典或列表。
数据聚合
另一个核心思想是使用defaultdict
对解析后的数据进行聚合。例如,我们通过累加每个省份的订单金额来聚合数据,从而得到每个省份的订单总金额。
数据可视化
最后,我们将聚合后的数据以图表的形式展示出来,这通过pyecharts
实现。我们创建了折线图来展示每日订单数量的趋势,以及地图来展示各省份的订单总金额。
实现过程中出现的问题及解决方案
数据结构理解错误
在实现过程中,我们最初没有正确理解JSON数据的结构。我们错误地假设数据直接是一个列表,而实际上它是一个包含dataList
键的字典。这导致了在迭代数据时出现类型错误。
解决方案: 我们修正了代码,确保从data
字典中提取dataList
键对应的值,这个值是一个包含订单信息的列表。然后,我们迭代这个列表来累加每个省份的订单金额。
类型错误
由于对数据结构的错误理解,我们尝试使用字符串索引访问字典项,这导致了TypeError: string indices must be integers
错误。
解决方案: 我们确保在迭代dataList
中的每个订单项时,item
是一个字典,并且包含province
和money
键。这样,我们就可以安全地访问item["province"]
和item["money"]
。
数据可视化配置
在使用pyecharts
进行数据可视化时,我们需要正确配置图表的全局选项和视觉映射。这包括设置图表标题、轴名称以及视觉映射的最大值等。
解决方案: 我们根据数据的特点配置了图表的全局选项,例如设置标题和轴名称。对于视觉映射,我们设置了最大值为省份订单总金额的最大值,以确保图表的颜色映射能够正确显示。
通过解决这些问题,我们能够成功地将订单数据解析、聚合并以图表的形式展示出来,实现了数据分析和可视化的目标。这个过程不仅提高了我们对数据的理解,也展示了Python在数据处理和可视化方面的强大能力。
相关代码如下:
# encoding: utf-8
# @File : test1
# @Author: Hex1911
# @Desc :
# @Date : 2024/12/16
# encoding: utf-8
# @File : test1
# @Author: Hex1911
# @Desc : 本文件用于创建订单金额的直方图,使用 pyecharts 进行可视化
# @Date : 2024/12/16
import json
from pyecharts import options as opts
from pyecharts.charts import Bar
def create_money_histogram():
# 尝试读取文件并解析数据
try:
with open('sale_num.txt', 'r', encoding='utf-8') as file:
data_str = file.read()
# 使用json模块解析JSON格式的数据
data = json.loads(data_str)
except FileNotFoundError:
print("文件 sale_num.txt 未找到,请检查文件是否存在。")
return
except json.JSONDecodeError:
print("文件内容不是有效的 JSON 格式,请检查文件内容。")
return
# 提取订单金额列表
money_list = [item["money"] for item in data["dataList"] if "money" in item]
# 定义金额区间和相应的标签
bins = [0, 500, 1000, 1500, 2000, 2500, 3000]
bin_labels = ['0-500', '501-1000', '1001-1500', '1501-2000', '2001-2500', '2501-3000']
bin_counts = [0] * (len(bins) - 1)
# 统计不同金额区间的订单数量
for money in money_list:
for i in range(len(bins) - 1):
if bins[i] < money <= bins[i + 1]:
bin_counts[i] += 1
# 创建柱状图
bar = (
Bar()
.add_xaxis(bin_labels)
.add_yaxis("订单金额区间", bin_counts)
.set_global_opts(
title_opts=opts.TitleOpts(title="订单金额分布直方图"),
xaxis_opts=opts.AxisOpts(name="金额区间"),
yaxis_opts=opts.AxisOpts(name="订单数量")
)
)
return bar
histogram = create_money_histogram()
if histogram:
histogram.render("money_histogram.html")
# encoding: utf-8
# @File : test2
# @Author: Hex1911
# @Desc :
# @Date : 2024/12/16
from pyecharts import options as opts
from pyecharts.charts import Line
import json
from collections import defaultdict
def create_time_line_chart():
try:
with open('sale_num.txt', 'r', encoding='utf-8') as file:
data_str = file.read()
# 使用json模块解析JSON格式的数据
data = json.loads(data_str)
except FileNotFoundError:
print("文件 sale_num.txt 未找到,请检查文件是否存在。")
return
except json.JSONDecodeError:
print("文件内容不是有效的 JSON 格式,请检查文件内容。")
return
# 确保data['dataList']是列表
if 'dataList' not in data or not isinstance(data['dataList'], list):
print("数据中没有找到'dataList'键,或者'dataList'的值不是一个列表。")
return
date_order_count = defaultdict(int)
for item in data['dataList']:
# 确保item是字典且包含'date'键
if isinstance(item, dict) and 'date' in item:
date_order_count[item["date"]] += 1
else:
print(f"数据项格式不正确: {item}")
dates = list(date_order_count.keys())
counts = list(date_order_count.values())
# 创建折线图
line = (
Line()
.add_xaxis(dates)
.add_yaxis("订单数量", counts)
.set_global_opts(
title_opts=opts.TitleOpts(title="每日订单数量趋势"),
xaxis_opts=opts.AxisOpts(name="日期"),
yaxis_opts=opts.AxisOpts(name="订单数量")
)
)
return line
line_chart = create_time_line_chart()
if line_chart:
line_chart.render("time_line_chart.html")
# encoding: utf-8
# @File : test3
# @Author: Hex1911
# @Desc :
# @Date : 2024/12/16
from pyecharts import options as opts
from pyecharts.charts import Map
import json
from collections import defaultdict
def create_province_map():
try:
with open('sale_num.txt', 'r', encoding='utf-8') as file:
data_str = file.read()
# 使用json模块解析JSON格式的数据
data = json.loads(data_str)
except FileNotFoundError:
print("文件 sale_num.txt 未找到,请检查文件是否存在。")
return
except json.JSONDecodeError:
print("文件内容不是有效的 JSON 格式,请检查文件内容。")
return
# 确保data['dataList']是列表
if 'dataList' not in data or not isinstance(data['dataList'], list):
print("数据中没有找到'dataList'键,或者'dataList'的值不是一个列表。")
return
province_total_money = defaultdict(int)
for item in data['dataList']:
# 确保item是字典且包含'province'和'money'键
if isinstance(item, dict) and 'province' in item and 'money' in item:
province_total_money[item["province"]] += item["money"]
else:
print(f"数据项格式不正确: {item}")
provinces = list(province_total_money.keys())
total_money = list(province_total_money.values())
# 创建地图
map_chart = (
Map()
.add("订单总金额", [list(z) for z in zip(provinces, total_money)], "china")
.set_global_opts(
title_opts=opts.TitleOpts(title="各省份订单总金额地图"),
visualmap_opts=opts.VisualMapOpts(max_=max(total_money))
)
)
return map_chart
map_chart = create_province_map()
if map_chart:
map_chart.render("province_map.html")