实验4 Python数据分析与GUI( 二 )


实验4.4:数据可视化
题目描述:利用CSV、、、和库完成5项编程任务 。
(1)利用csv、和创建1个WPF商店2018年营业额模拟数据文件data.csv,此文件中包含两列数据(日期date、销量) 。模拟数据随机生成共365条,数据日期date起于2018-01-01止于2018-12-31,数据销量的取值范围为[300,600]之间,如图4-1所示 。
. . .
(2)利用读取文件data.csv中数据,创建1个行列索引的数据结构,并删除其中的所有缺失值 。
(3)利用生成折线图,按每天进行统计,显示商店每天的销量情况,并把图形保存为本地文件.png 。实验效果如图4-2所示 。
(4)利用生成柱状图,按月份进行统计,显示商店每月的销量情况,并把图形保存为本地文件.png 。实验效果如图4-3所示 。同时,找出相邻两个月最大涨幅,并把涨幅最大的月份写入到文件.txt中 。
(5)利用生成饼状图,按季度进行统计,显示商店4个季度的销量分布情况,并把图形保存为本地文件.png 。实验效果如图4-4所示 。
提示:使用.( )创建二维数据结构;使用.库中的( )、plot( )、bar( )、pie( )、title( )、( )和show( )等创建数据可视化图片,其功能分别设置图片大小、生成这线图、生成柱状图、生成饼状图、设置图片标题、保存图片和显示图片等 。
import collectionsimport matplotlib.pyplot as pltimport numpy as np# (1)import csv,random,datetime#创建文件对象with open(r"data.csv","w+",newline='') as csvfile:wr = csv.writer(csvfile,dialect="excel")wr.writerow(["data","amount"])sd = datetime.date(2020,1,1)for i in range(365):amount = int(random.random()*301 + 300)wr.writerow([sd,amount])sd = sd + datetime.timedelta(days=1)# (2)import pandas as pd# 读取数据df = pd.read_csv("data.csv",encoding="cp936")df.dropna() # 丢弃缺失值# (3)折线plt.figure(figsize=(14,7)) # 设置大小plt.plot(df["data"],df["amount"],label = "day -> amount",color = "red",linewidth = 2)plt.title("2020 Day Business Volume of MMMM Store")plt.xlabel("day")plt.ylabel("amont")plt.xlim("2020-01-01","2020-12-31")plt.legend()plt.savefig("day_amount_plot.png") # 先保存在展示plt.show()# (4) 柱形df1 = dfdf1["month"] = df1["data"].map(lambda x:x[:x.rindex('-')])df1 = df1.groupby(by = "month",as_index=False).sum()plt.figure(figsize=(14,7))plt.bar(df1["month"],df1["amount"],label = "month -> amount ",color = "blue")plt.title("2020 Month Business Volume of MMMM Store")plt.xlabel("month")plt.ylabel("amont")plt.xlim("2020-01-01","2020-12-31")plt.ylim(300,600)plt.legend()plt.savefig("month_amount_plot.png") # 先保存在展示plt.show()# (5) 饼状season1 = df1[:3]['amount'].sum()season2 = df1[3:6]['amount'].sum()season3 = df1[6:9]['amount'].sum()season4 = df1[9:12]['amount'].sum()plt.figure(figsize=(14,7))plt.pie([season1,season2,season3,season4],labels = ["season1","season2","season3","season4"])plt.title("2020 Season Business Volume of MMMM Store")plt.savefig("Season_amount_plot.png") # 先保存在展示plt.show()
实验4.5:简单GUI编程-学生成绩统计
题目描述:利用库完成2项GUI编程任务 。
(1)利用库设计1个如图5-1所示的GUI图形界面 。
(2)利用GUI面向对象编程方式实现学生四门课程的平均成绩计算功能 。

实验4 Python数据分析与GUI

文章插图
提示:利用生成窗体、标签、文本框、命令按钮;利用grid实现窗体布局;利用GUI面向对象编程方式实现GUI编程封装 。
import tkinter as tfrom tkinter import Button, DoubleVar, Entry, IntVar, Label, Tk, messageboxclass ScoreCalculate:def __init__(self):win = Tk() #窗口对象win.title("学生成绩统计") # 设置窗口标题lab_entNumber = Label(win,text = "C/C++程序设计:") #创建Label标签lab_entNumber.grid(row = 0,column = 0,padx = 5,pady = 5,sticky = "e") # 使用grid 布局self.VCpp = IntVar()entNumber = Entry(win,width = 15,textvariable=self.VCpp) # 创建Entry对象entNumber.grid(row = 0,column = 1,padx = 5,pady = 5,sticky = "w") # 使用grid 布局Py = Label(win,text = "Python程序设计:") #创建Label标签Py.grid(row = 1,column = 0,padx = 5,pady = 5,sticky = "e") # 使用grid 布局self.VPy = IntVar()ppy = Entry(win,width = 15,textvariable=self.VPy) # 创建Entry对象ppy.grid(row = 1,column = 1,padx = 5,pady = 5,sticky = "w") # 使用grid 布局Ja = Label(win,text = "Java程序设计:") #创建Label标签Ja.grid(row = 2,column = 0,padx = 5,pady = 5,sticky = "e") # 使用grid 布局self.VJa = IntVar()Jja = Entry(win,width = 15,textvariable=self.VJa) # 创建Entry对象Jja.grid(row = 2,column = 1,padx = 5,pady = 5,sticky = "w") # 使用grid 布局WL = Label(win,text = "物联网工程:") #创建Label标签WL.grid(row = 3,column = 0,padx = 5,pady = 5,sticky = "e") # 使用grid 布局self.VIo = IntVar()Wwl = Entry(win,width = 15,textvariable=self.VIo) # 创建Entry对象Wwl.grid(row = 3,column = 1,padx = 5,pady = 5,sticky = "w") # 使用grid 布局bt_Calculate = Button(win,text = "计算平均成绩:",command=self.Calculate)bt_Calculate.grid(row = 4,column=0,columnspan=2,pady = 5) # 横跨两列AV = Label(win,text = "平均成绩:") #创建Label标签AV.grid(row = 5,column = 0,padx = 5,pady = 5,sticky = "e") # 使用grid 布局self.VAvg = DoubleVar()Avv = Entry(win,width = 15,state="readonly",textvariable=self.VAvg) # 创建Entry对象Avv.grid(row = 5,column = 1,padx = 5,pady = 5,sticky = "w") # 使用grid 布局win.mainloop()def Calculate(self):try:xC = float(self.VCpp.get())xP = float(self.VPy.get())xJ = float(self.VJa.get())xIoT = float(self.VIo.get())xAvg = (xC + xP + xJ + xIoT) / 4self.VAvg.set(round(xAvg,1))except :messagebox.showerror(title="提示",message = "输入错误,请重新输入")ScoreCalculate()