python数据分析案例

本题目标:将text1,text2两个文件内的数据读取并处理,输出每日的销售额
以下为两个文件的内容(需要具体文件及python源文件可私信我)
一个为文本文件,另一个为json文件
text

本题解决思路:使用面向对象的思维完成数据读取和处理
以下是具体方法
分为三个python文件解决

main主文件

# 设计一个类完成数据的封装
# 设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能
# 读取文件,产生数据对象
# 进行数据的逻辑计算(计算每天的销售额)
import json
from file_define import TextFileReader, JsonFileReader  # 导入相关内容
from data_define import Record


text_file_reader = TextFileReader("D:\\python\\数据分析案例\\1销售数据.txt")  # 调用TextFileReader类,并生成一个新的实例
json_file_reader = JsonFileReader("D:\\python\\数据分析案例\\2销售数据.txt")  # 调用JsonFileReader类,并生成一个新的实例

jan_data: list[Record] = text_file_reader.read_date()  # 用实例调用类中的read_date()方法
feb_data: list[Record] = json_file_reader.read_date()  # 用实例调用类中的read_date()方法

all_data: list[Record] = jan_data + feb_data  # 将两个数据合并为一个list存储

# 开始计算
data_dict = {}  # 创建一个空字典用于求和
for record in all_data:
    if record.date in data_dict.keys():  # record 是file_define里的实际调用Record类而形成的实际变量
        data_dict[record.date] += record.money  # 当前日期已经有记录了,和老记录做累加
    else:
        data_dict[record.date] = record.money  # 当前日期没有记录,覆盖添加一个新的记录

pretty_json = json.dumps(data_dict, indent=4)  # 通过json.dumps()函数可以将字典转换为JSON格式的字符串,并通过设置indent参数来美化输出
print(pretty_json)

data_define文件

class Record:  # 记录
    def __init__(self, date, order_id, money, province):  # 类定义的init方法
        self.date = date  # 订单日期
        self.order_id = order_id  # 订单id
        self.money = money  # 订单金额
        self.province = province  # 订单省份

    def __str__(self):
        return f"{self.date}, {self.order_id}, {self.money},{self.province}"  # 通过魔术方法__str__使得直接print是不再输出地址

file_define文件

"""
和文件相关的类定义
"""
import json

from data_define import Record  # 将Record类导入


# 先定义一个抽象类用来做顶层设计,确定有哪些功能需要实现
class FileReader:  # 一个抽象类,文件读取
    def read_date(self) -> list[Record]:  # 读取文件数据,并将读到的每一条数据都转换为Record对象,将它们都封装到list内返回
        pass


class TextFileReader(FileReader):  # 继承抽象类FileReader
    def __init__(self, path):  # 定义成员变量记录文件路径
        self.path = path

    def read_date(self) -> list[Record]:  # 复写(实现抽象方法)父类的方法
        record_list: list[Record] = []
        f = open(self.path, "r", encoding="UTF-8")  # 通过定义的成员变量path打开文件
        for line in f.readlines():  # 通过for循环读取redalines读出的每一行内容
            line = line.strip()  # 通过strip函数去除字符串前后的转义字符\n
            data_list = line.split(",")  # 将每一行内的字符串用逗号隔开并形成一个新的列表存入data_list中
            record=Record(data_list[0], data_list[1], eval(data_list[2]), data_list[3])    # 用实例调用Record类
            record_list.append(record)   # 将列表的内容追加到record_list中
        f.close()
        return record_list


class JsonFileReader(FileReader):  # 继承抽象类FileReader
    def __init__(self, path):  # 定义成员变量记录文件路径
        self.path = path

    def read_date(self) -> list[Record]:  # 复写(实现抽象方法)父类的方法
        record_list: list[Record] = []
        f = open(self.path, "r", encoding="UTF-8")  # 通过定义的成员变量path打开文件
        for line in f.readlines():  # 通过for循环读取redalines读出的每一行内容
            data_dict= json.loads(line)
            record=Record(data_dict["date"], data_dict["orderid"], eval(data_dict["money"]), data_dict["province"])
            record_list.append(record)   # 将用实例调用Record类的内容追加到record_list中
        f.close()
        return record_list


if __name__ == '__main__':
    json_file_reader=JsonFileReader("2销售数据.txt")
    text_file_reader=TextFileReader("1销售数据.txt")
    list1=json_file_reader.read_date()
    list2=text_file_reader.read_date()
    for i in list2:
        print(i)
    for i in list1:
        print(i)

最终输出结果:
{
“2011-01-01”: 6607,
“2011-01-02”: 10292,
“2011-01-03”: 8791,
“2011-01-04”: 11920,
“2011-01-05”: 10305,
“2011-01-06”: 5596,
“2011-01-07”: 5025,
“2011-01-08”: 8862,
“2011-01-09”: 11439,
“2011-01-10”: 12376,
“2011-01-11”: 9950,
“2011-01-12”: 8095,
“2011-01-13”: 8290,
“2011-01-14”: 11275,
“2011-01-15”: 8855,
“2011-02-03”: 5362,
“2011-02-04”: 11233,
“2011-02-05”: 5614,
“2011-02-06”: 9131,
“2011-02-07”: 8098,
“2011-02-08”: 3318,
“2011-02-09”: 5428,
“2011-02-10”: 7730,
“2011-02-11”: 7719,
“2011-02-12”: 10015,
“2011-02-13”: 8937,
“2011-02-14”: 12211,
“2011-02-15”: 7920
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值