Python之数据分析



【案例】

某公司有2份数据文件,现在需要对其进行数据分析,计算每日的销售额并以柱状图表的形式进行展现。

数据如下:

一月份数据:

二月份数据:

需求分析

根据题目要求我们要得到每日销售额,分析文本数据可以知道,我们只需要将对应的相同的时间提取出来,并找到相应的销售额相加得到结果即可,然后使用pyecharts画图即可。

使用面向对象思想来实现,思路图如下:

订单

设计一个订单的类类中要包含订单的基本信息。

"""
     数据定义的类
"""
class Record:
    def __init__(self,data,order_id,money,province):
        self.data = data              # 订单日期
        self.order_id = order_id      # 订单id
        self.money = money            # 订单金额
        self.province = province      # 销售省份

    def __str__(self):
        return f"{self.data},{self.order_id},{self.money},{self.province}"

数据处理

我们手中的文本数据有两种,一个是基本的txt文件,一个是JSON类型的txt文件,因此我们设计一个读取文件的操作方法,并且这个方法要是抽象的方法,用子类来实现不同文件的数据读取。

"""
    和文件相关的定义
"""
from data_define import *
import json
# 先定义一个抽象类用来做顶层设计,确定有那些需要实现的功能
class FileReader:
    def read_data(self) -> list[Record]:
        """
        读取文件的数据,读到的每一条数据都转换为Order对象,将他们封装到list内返回即可
        :return:
        """
        pass

class TextFileReader(FileReader):

    def __init__(self,path):
        self.path = path        # 定义成员变量记录文件路径

    # 复写(实现抽象方法)父类的方法
    def read_data(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF-8")

        record_list:list[Record] = []
        for line in f.readlines():   # readlines()一次性读取文件的每一行内容返回的是列表
            line = line.strip()      # 消除读取到的每一行的换行符
            data_list = line.split(",")
            record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])  # 构建为Order对象
            record_list.append(record)

        f.close()
        return record_list


class JsonFileReader(FileReader):


    def __init__(self,path):
        self.path = path

    def read_data(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF-8")

        record_list:list[Record] = []
        for line in f.readlines():   # readlines()一次性读取文件的每一行内容返回的是列表
            data_dict = json.loads(line)
            record = Record(data_dict['date'],data_dict['order_id'],data_dict['money'],data_dict['province'],)  # 构建为Order对象
            record_list.append(record)
        f.close()
        return record_list


if __name__ == '__main__':
    text_file_reader = TextFileReader("D:/网盘下载的文件/2011年1月销售数据.txt")
    jison_file_reader = JsonFileReader("D:/网盘下载的文件/2011年2月销售数据JSON.txt")
    list1 = text_file_reader.read_data()
    list2 = jison_file_reader.read_data()
    for l1 in list1:
        print(l1)
    for l2 in list2:
        print(l2)

计算数据

通过上述的处理我们设置好了处理数据的方法。接下来,我们通过打开文件获取数据,将对应的日期的金额加起来即可。

#  创建文件对象获取文件
text_file_reader = TextFileReader("D:/网盘下载的文件/2011年1月销售数据.txt")
jison_file_reader = JsonFileReader("D:/网盘下载的文件/2011年2月销售数据JSON.txt")

jen_data:list[Record] = text_file_reader.read_data()  # 一月份的数据
feb_data:list[Record] = jison_file_reader.read_data()  # 二月份的数据

# 将两个月份的数据合并
all_data:list[Record] = jen_data+feb_data

# 开始进行数据计算
data_dict = {}
for record in all_data:
    if record.data in data_dict.keys():
        # 如果当前的日期在字典中累加起来即可
        data_dict[record.data] += record.money

    else:
        data_dict[record.data] = record.money

我们可以运用字典将每天的时间与金额形成key与value对应的关系。

绘制图像

使用Pyecharts提供的方法来绘制柱状图。

# 可视化图表开发
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
# 添加x轴的数据
bar.add_xaxis(list(data_dict.keys()))
# 添加y轴的数据
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))
bar.set_global_opts(
    title_opts=TitleOpts(title="每日销售额")
)
bar.render("每日销售额.html")

【全部代码】

data_define.py

"""
     数据定义的类
"""
class Record:
    def __init__(self,data,order_id,money,province):
        self.data = data              # 订单日期
        self.order_id = order_id      # 订单id
        self.money = money            # 订单金额
        self.province = province      # 销售省份

    def __str__(self):
        return f"{self.data},{self.order_id},{self.money},{self.province}"


file_define.py

"""
    和文件相关的定义
"""
from data_define import *
import json
# 先定义一个抽象类用来做顶层设计,确定有那些需要实现的功能
class FileReader:
    def read_data(self) -> list[Record]:
        """
        读取文件的数据,读到的每一条数据都转换为Order对象,将他们封装到list内返回即可
        :return:
        """
        pass   # 抽象方法

class TextFileReader(FileReader):  # 用来读取普通文件数据的方法

    def __init__(self,path):
        self.path = path        # 定义成员变量记录文件路径

    # 复写(实现抽象方法)父类的方法
    def read_data(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF-8")

        record_list:list[Record] = []
        for line in f.readlines():   # readlines()一次性读取文件的每一行内容返回的是列表
            line = line.strip()      # 消除读取到的每一行的换行符
            data_list = line.split(",")
            record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])  # 构建为Order对象
            record_list.append(record)

        f.close()
        return record_list


class JsonFileReader(FileReader):   # 用来读取JSON文件数据的方法

    def __init__(self,path):
        self.path = path

    def read_data(self) -> list[Record]:
        f = open(self.path,"r",encoding="UTF-8")

        record_list:list[Record] = []
        for line in f.readlines():   # readlines()一次性读取文件的每一行内容返回的是列表
            data_dict = json.loads(line)
            record = Record(data_dict['date'],data_dict['order_id'],data_dict['money'],data_dict['province'],)  # 构建为Order对象
            record_list.append(record)
        f.close()
        return record_list


if __name__ == '__main__':
    text_file_reader = TextFileReader("D:/网盘下载的文件/2011年1月销售数据.txt")
    jison_file_reader = JsonFileReader("D:/网盘下载的文件/2011年2月销售数据JSON.txt")
    list1 = text_file_reader.read_data()
    list2 = jison_file_reader.read_data()
    for l1 in list1:
        print(l1)
    for l2 in list2:
        print(l2)


main.py
"""
   1.设计一个类,可以完成数据封装
   2.设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能
   3.读取文件,生产数据对象
   4.进行数据需求的逻辑计算(计算每一天的销售额)
   5.通过PyEcharts进行绘图
"""
#  导包
from file_define import *
from data_define import *
from pyecharts.charts import *
from pyecharts.options import *
from pyecharts.globals import *
#  创建文件对象获取文件
text_file_reader = TextFileReader("D:/网盘下载的文件/2011年1月销售数据.txt")
jison_file_reader = JsonFileReader("D:/网盘下载的文件/2011年2月销售数据JSON.txt")

jen_data:list[Record] = text_file_reader.read_data()  # 一月份的数据
feb_data:list[Record] = jison_file_reader.read_data()  # 二月份的数据

# 将两个月份的数据合并
all_data:list[Record] = jen_data+feb_data

# 开始进行数据计算
data_dict = {}
for record in all_data:
    if record.data in data_dict.keys():
        # 如果当前的日期在字典中累加起来即可
        data_dict[record.data] += record.money

    else:
        data_dict[record.data] = record.money

# 可视化图表开发
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
# 添加x轴的数据
bar.add_xaxis(list(data_dict.keys()))
# 添加y轴的数据
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))
bar.set_global_opts(
    title_opts=TitleOpts(title="每日销售额")
)
bar.render("每日销售额.html")

【运行效果】

相关推荐
古希腊掌管学习的神43 分钟前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
LucianaiB2 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
PieroPc4 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
梧桐树04298 小时前
python常用内建模块:collections
python
Dream_Snowar8 小时前
速通Python 第三节
开发语言·python
落魄君子9 小时前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
落魄君子9 小时前
ELM分类-单隐藏层前馈神经网络(Single Hidden Layer Feedforward Neural Network, SLFN)
神经网络·分类·数据挖掘
蓝天星空9 小时前
Python调用open ai接口
人工智能·python
jasmine s9 小时前
Pandas
开发语言·python
郭wes代码9 小时前
Cmd命令大全(万字详细版)
python·算法·小程序