基于Python的订单数据分析与可视化

发布于:2024-12-22 ⋅ 阅读:(18) ⋅ 点赞:(0)

概述

本文档详细介绍了使用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是一个字典,并且包含provincemoney键。这样,我们就可以安全地访问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")

 

 


网站公告

今日签到

点亮在社区的每一天
去签到