“Python 语言程序设计实验2023春季”实验报告

实验报告八 数据分析与可视化(6月9日23:00截止)

实验八 数据分析与可视化

一、实验学时:2学时

二、实验目的

  1. 熟悉 CSV 和 TXT 文件操作。
  2. 熟练安装扩展库 numpy、pandas、matplotlib。
  3. 熟悉使用扩展库 pandas 进行数据分析的基本操作。
  4. 熟悉使用扩展库 matplotlib 进行数据可视化的基本操作。

三、实验内容

1.使用以下代码,在当前文件夹中生成某商场营业额模拟数据文件 data.csv。数据文件有两列,分别为“日期”和“营业额”。日期从2022-1-1开始,共365天,365条营业数据。

import csv 
import random 
import datetime 

fn = 'data.csv' 

with open(fn, 'w') as fp: 
# 创建 csv 文件写入对象 
wr = csv.writer(fp) 
# 写入表头 
wr.writerow(['日期', '营业额']) 
# 生成模拟数据 
startDate = datetime.date(2022, 1, 1) 
# 生成 365 个模拟数据 
for i in range(365): 
# 生成一个模拟数据,写入 csv 文件 
amount = 500 + i*5 + random.randrange(100) 
wr.writerow([str(startDate), amount]) 
# 下一天 
startDate = startDate + datetime.timedelta(days=1)
copy

依据以上生成的模拟数据文件,完成下面的任务:

(1)使用pandas读取文件data.csv中的数据,创建DataFrame对象,并删除其中所有缺失值。

(2)绘制折线图,显示该商场每天的营业额情况,并把图形保存为本地文件 Te.jpg;

(3)绘制柱状图,显示每个月份的营业额,并把图形保存为本地文件 Ye.jpg;

(4)按月份进行统计,找出相邻两个月最大涨幅,并把涨幅最大的月份写入文件maxMonth.txt;

(5)按季度统计该商场 2022年的营业额数据,绘制饼状图显示2022年4个季度的营业额分布情况,并把图形保存为本地文件Je.jpg。

四、实验结果

import csv
import random
import datetime
import pandas as pd
import matplotlib.pyplot as plt

# 生成模拟数据并保存到文件
fn = 'data.csv'
with open(fn, 'w', encoding='GBK') as fp:
    wr = csv.writer(fp)
    wr.writerow(['日期', '营业额'])
    startDate = datetime.date(2022, 1, 1)
    for i in range(365):
        amount = 500 + i*5 + random.randrange(100)
        wr.writerow([str(startDate), amount])
        startDate = startDate + datetime.timedelta(days=1)

# 使用 pandas 读取数据文件并删除缺失值
data = pd.read_csv('data.csv', parse_dates=['日期'], dtype={'营业额': float}, encoding='GBK')
data.dropna(inplace=True)

# 绘制折线图显示每天的营业额情况
plt.plot(data['日期'], data['营业额'])
plt.title('每天的营业额情况')
plt.xlabel('日期')
plt.ylabel('营业额')
plt.savefig('Te.jpg')
plt.show()

# 按月份统计营业额
monthly_sales = data.set_index('日期')['营业额'].resample('M').sum()

# 绘制柱状图显示每个月份的营业额
monthly_sales.plot(kind='bar', rot=45)
plt.title('每个月份的营业额')
plt.xlabel('月份')
plt.ylabel('营业额')
plt.savefig('Ye.jpg')
plt.show()

# 按月计算涨幅并找出涨幅最大的月份
monthly_growth = monthly_sales.pct_change()
max_growth_month = monthly_growth[1:].idxmax().strftime('%Y-%m')

# 输出涨幅最大的月份并写入文件
print('涨幅最大的月份是:', max_growth_month)
with open('maxMonth.txt', 'w') as f:
    f.write(max_growth_month)

# 按季度统计营业额
quarterly_sales = data.set_index('日期')['营业额'].resample('Q').sum()

# 绘制饼状图显示2022年4个季度的营业额分布
labels = ['第一季度', '第二季度', '第三季度', '第四季度']
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
explode = (0.05, 0.05, 0.05, 0.05)
plt.pie(quarterly_sales, labels=labels, colors=colors,
        explode=explode, autopct='%1.1f%%', startangle=90)
plt.title('2022年4个季度的营业额分布情况')
plt.savefig('Je.jpg')
plt.show()
copy

图片描述

图片描述

图片描述

五、实验小结

问题

  1. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byte,显示错误为读入文件的格式有误;

  2. ValueError: I/O operation on closed file.提示为在文件关闭后依然在执行输入输出操作。

解决方法

  1. with open(fn, 'w', encoding='GBK') as fp:,将原本的utf-8改为GBK,可以正常显示图形,但是会导致一些字体无法正确显示,暂时无法进一步改进;

  2. 由于是输入输出操作在with文件操作之外,所以只需要将所需语句调整到with文件操作中。

心得体会

由于所学的一些库的知识比较多,而且对应的功能很多,所以需要找到自己的方式去将这些固定代码记住,而且对全局的代码逻辑设计要严密,避免一些逻辑冲突。

最新评论

本次实验解题逻辑清晰,内容完整,格式符合要求。

2023-06-28 12:17:26
回复