2020年高教社杯全国大学生数学建模竞赛---校园供水系统智能管理(Python代码实现)
目錄
💥1 概述
📚2 問題
🎉3 運(yùn)行結(jié)果
👨?💻4 Python代碼
💥1 概述
校園供水系統(tǒng)是校園公用設(shè)施的重要組成部分,學(xué)校為了保障校園供水系統(tǒng)的正常運(yùn)行需要投入大量的人力、物力和財(cái)力。隨著科學(xué)技術(shù)的發(fā)展,校園內(nèi)已經(jīng)普遍使用了智能水表,從而可以獲得大量的實(shí)時(shí)供水系統(tǒng)運(yùn)行數(shù)據(jù)。后勤部門希望基于這些數(shù)據(jù),通過(guò)數(shù)學(xué)建模和數(shù)據(jù)挖掘及時(shí)發(fā)現(xiàn)和解決供水系統(tǒng)中存在的問題,提高校園服務(wù)和管理水平。
附件是某校區(qū)水表層級(jí)關(guān)系以及所有水表四個(gè)季度的讀數(shù)(以一定時(shí)間為間隔,如15分鐘)與相應(yīng)的用水?dāng)?shù)據(jù)。請(qǐng)利用這些信息和數(shù)據(jù),建立數(shù)學(xué)模型,討論以下問題:
📚2 問題
1.?統(tǒng)計(jì)、分析各個(gè)水表數(shù)據(jù)的變化規(guī)律,并給出校園內(nèi)不同功能區(qū)(宿舍、教學(xué)樓、辦公樓、食堂等)的用水特征。
🎉3 運(yùn)行結(jié)果
👨?💻4 Python代碼
'''1 讀取四個(gè)季度數(shù)據(jù):'''import pandas as pd shuju1=pd.read_excel('一季度.xlsx') shuju2=pd.read_excel('二季度.xlsx') shuju3=pd.read_excel('三季度.xlsx') shuju4=pd.read_excel('四季度.xlsx') print(shuju1)#==查看一季度的統(tǒng)計(jì)描述:==== #可以得到一季度的最大值、最小值、平均值等信息 print(shuju1.describe())#==為了快速瀏覽數(shù)據(jù)集,我們使用dataframe.info()功能=== print(shuju1.info())#===查看缺失值====== print(shuju1.isnull().sum())'''2 讀取水表層:''' shui_biao = pd.read_excel("水表層級(jí).xlsx") print(shui_biao)#查看水表有哪些不同類型: print(shui_biao['水表名'].unique())#查看四個(gè)季度水表名數(shù)量: print(len(shuju1['水表名'].unique())) print(len(shuju2['水表名'].unique())) print(len(shuju3['水表名'].unique())) print(len(shuju4['水表名'].unique()))#給數(shù)據(jù)表添加上具體季度更方便觀察: import numpy as np # 合并數(shù)據(jù) shuju1['季度'] = pd.Series(["一季度" for i in range(len(shuju1.index))]) shuju2['季度'] = pd.Series(["二季度" for i in range(len(shuju2.index))]) shuju3['季度'] = pd.Series(["三季度" for i in range(len(shuju3.index))]) shuju4['季度'] = pd.Series(["四季度" for i in range(len(shuju4.index))]) print(shuju1)#添加合并: shuju = shuju1.append([shuju2,shuju3,shuju4],ignore_index=True) # 添加合并 print(shuju)#再查看表數(shù)量: print(len(shuju['水表名'].unique())) print(len(shui_biao['水表名'].unique()))'''3 按照水表名分類,統(tǒng)計(jì)總用量''' use_water = shuju.groupby(by='水表名')['用量'].sum() # 按照水表名分類,統(tǒng)計(jì)總用量 print(use_water)#從高到低排序下: use_water.sort_values(ascending=False)import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默認(rèn)字體 #mpl.rcParams['font.sans-serif'] = ['Times New Roman'] #Times New Roman字體 mpl.rcParams['axes.unicode_minus'] = False # 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問題 import matplotlib; matplotlib.use('TkAgg') #====根據(jù)使用繪制直方圖:===== use_water.plot.hist(histtype='bar', rwidth=0.5) plt.savefig('可視化/0.1.png', dpi=300, bbox_inches="tight") plt.show()'''4 對(duì)這些功能區(qū)的類型進(jìn)行分析:'''# 全部水表list_table_name = list(shuju['水表名'].unique()) #合并后的數(shù)據(jù)'''4.1 功能區(qū)分類'''#======4.1.1 找到所有宿舍的水表========== list_home = [] #宿舍 list_teaching_build = [] #教學(xué)樓 list_teacher_build = [] #活動(dòng)地方 for name in list_table_name.copy():if name.find("學(xué)生宿舍") != -1 or name.find("留學(xué)生樓") != -1:list_home.append(name)list_table_name.remove(name) print(list_home)#=======4.1.2 同理,找到教學(xué)樓========= for name in list_table_name.copy():if name.find("XX") != -1 and name.find("樓") != -1:print(name)list_teaching_build.append(name)list_table_name.remove(name) print(list_teaching_build)#======4.1.3 農(nóng)業(yè)區(qū)================= list_agritural = [] for name in list_table_name.copy():if name.find("養(yǎng)殖") != -1 or name.find("養(yǎng)魚") != -1 or name.find("大棚")!=-1 or name.find("花")!=-1:list_agritural.append(name)list_table_name.remove(name) print(list_agritural)#=======4.1.4 后勤=============== for name in list_table_name.copy():if name.find("樓")!= -1:list_teaching_build.append(name)list_table_name.remove(name) print(list_table_name)#========類型添加上去·:================list_backup = list_table_name name_list = shuju['水表名'].tolist() #.tolist:將數(shù)組轉(zhuǎn)化為列表 type_list = [] for name in name_list:if name in list_backup:type_list.append("后勤")elif name in list_agritural:type_list.append("農(nóng)業(yè)")elif name in list_home:type_list.append('宿舍')elif name in list_teaching_build:type_list.append("活動(dòng)地方")else:type_list.append('教學(xué)樓')shuju['類型'] = pd.Series(type_list) print(shuju)'''4.2 不同類型的用量:''' type_sum = shuju.groupby(by='類型')['用量'].sum() print(type_sum)#===對(duì)不同類型可視化:=====type_sum.plot.barh(alpha=0.7) df_group_two = shuju.groupby(by=['類型']) i = 0 colors=['r','g','b','m','c'] plt.figure(figsize=(35, 35), dpi=100) for types ,group in df_group_two:i += 1plt.subplot(3,2,i)group.groupby(by='水表名').sum()["用量"].plot.barh(title=types,color=colors[i-1],alpha=.5) plt.savefig('可視化/1不同類型可視化.png', dpi=300, bbox_inches="tight") plt.show()#分析完把合并后的數(shù)據(jù)保存起來(lái): shuju.to_csv('data1.txt',index=False) #data1.csv容易數(shù)據(jù)缺失,所以考慮txt #shuju.to_xlsx('total.xlsx',index=False)#按照時(shí)間聚合: shuju['timeStamp'] = pd.to_datetime(shuju['采集時(shí)間']) shuju.set_index("timeStamp", inplace=True) data_quarter = shuju.resample("Q") # 時(shí)間聚合采樣。.resample:重新采樣,是對(duì)原樣本重新處理的一個(gè)方法,是一個(gè)對(duì)常規(guī)時(shí)間序列數(shù)據(jù)重新采樣和頻率轉(zhuǎn)換的便捷的方法。'''4.3 接下來(lái)分析每個(gè)季度、月份、天數(shù)、24小時(shí)變化:'''#===4.3.1 季度變化規(guī)律:=================== data_quarter.sum()["用量"].plot.line(style="m>-.",alpha=0.5,title="用水量隨著季度變化趨勢(shì)") #Q:季度 plt.savefig('可視化/0.2用水量隨著季度變化趨勢(shì).png', dpi=300, bbox_inches="tight") plt.show()#===4.3.2 月份變化規(guī)律:=================== data_month = shuju.resample('M').sum()["用量"].plot.line(style="c*-.",alpha=0.5,title="用水量隨著月份變化趨勢(shì)") #M:月份 plt.savefig('可視化/0.3用水量隨著月份變化趨勢(shì).png', dpi=300, bbox_inches="tight") plt.show()'''添加具體時(shí)間:''' shuju['hour'] = pd.to_datetime(shuju['采集時(shí)間']).dt.hour shuju['day'] = pd.to_datetime(shuju['采集時(shí)間']).dt.day print(shuju)#====4.3.3 用水量一天隨著小時(shí)變化規(guī)律:============= shuju.groupby(by='hour').sum()['用量'].plot.line(style="gh-.",alpha=0.5,title="用水量隨著時(shí)間變化趨勢(shì)") plt.grid() plt.savefig('可視化/0.4用水量一天隨著小時(shí)變化規(guī)律.png', dpi=300, bbox_inches="tight") plt.show()#=====4.3.4 一個(gè)月內(nèi)用水量隨著天數(shù)變化:======= shuju.groupby(by='day').sum()['用量'].plot.line(style="rd-.",alpha=0.5,title="用水量隨著天變化趨勢(shì)") plt.grid() plt.savefig('可視化/0.5一個(gè)月內(nèi)用水量隨著天數(shù)變化.png', dpi=300, bbox_inches="tight") plt.show()'''4.4 不同區(qū)域的特征:''' # 不同區(qū)域用水特征#=======4.4.1 不同區(qū)域隨著季度用水變化======================= i = 0 styles=['*-.','-.','1-.','2-.','3-.'] plt.figure(figsize=(20, 20), dpi=100) for index,group in shuju.groupby(by='類型'):i += 1plt.subplot(3,2,i)group.resample("Q").sum()['用量'].plot.line(style=styles[i-1],color=colors[i-1],alpha=0.5,title="{}用水量隨著季度變化趨勢(shì)".format(index)) #四個(gè)季度 plt.savefig('可視化/2 不同區(qū)域隨著季度用水變化.png', dpi=300, bbox_inches="tight") plt.show()#======4.4.2 不同區(qū)域隨著月份用水變化=============== i = 0 plt.figure(figsize=(20, 20), dpi=100) for index,group in shuju.groupby(by='類型'):i += 1plt.subplot(3,2,i)group.resample("M").sum()['用量'].plot.line(style=styles[i-1],color=colors[i-1],alpha=0.5,title="{}用水量隨著月份變化趨勢(shì)".format(index)) plt.savefig('可視化/3不同區(qū)域隨月份變化.png', dpi=300, bbox_inches="tight") plt.show()#=====4.4.3 不同區(qū)域隨著每月的天數(shù)用水變化============== i = 0 plt.figure(figsize=(20, 20), dpi=100) for index,group in shuju.groupby(by='類型'):i += 1plt.subplot(3,2,i)group.groupby(by='day').sum()['用量'].plot.line(style=styles[i-1],color=colors[i-1],alpha=0.5,title="{}用水量隨著天數(shù)變化趨勢(shì)".format(index))plt.grid() plt.savefig('可視化/4不同區(qū)域隨著每月的天數(shù)用水變化.png', dpi=300, bbox_inches="tight") plt.show()#=====4.4.4 不同區(qū)域隨著每天的時(shí)辰用水變化============== i = 0plt.figure(figsize=(20, 20), dpi=100) for index,group in shuju.groupby(by='類型'):i += 1plt.subplot(3,2,i)group.groupby(by='hour').sum()['用量'].plot.line(style="r*-.",alpha=0.5,title="{}用水量隨著時(shí)辰變化趨勢(shì)".format(index))plt.grid() plt.savefig('5.png', dpi=300, bbox_inches="tight") plt.show()#分析完畢~把數(shù)據(jù)保存起來(lái): shuju.to_csv('data2.txt',index=False) #data2.csv容易裝不下數(shù)據(jù),照成數(shù)據(jù)缺失 #shuju.to_xlsx('all.xlsx',index=False)
'''1 讀取四個(gè)季度數(shù)據(jù):'''
import pandas as pd
shuju1=pd.read_excel('一季度.xlsx')
shuju2=pd.read_excel('二季度.xlsx')
shuju3=pd.read_excel('三季度.xlsx')
shuju4=pd.read_excel('四季度.xlsx')
print(shuju1)
#==查看一季度的統(tǒng)計(jì)描述:====
#可以得到一季度的最大值、最小值、平均值等信息
print(shuju1.describe())
#==為了快速瀏覽數(shù)據(jù)集,我們使用dataframe.info()功能===
print(shuju1.info())
#===查看缺失值======
print(shuju1.isnull().sum())
'''2 讀取水表層:'''
shui_biao = pd.read_excel("水表層級(jí).xlsx")
print(shui_biao)
#查看水表有哪些不同類型:
print(shui_biao['水表名'].unique())
#查看四個(gè)季度水表名數(shù)量:
print(len(shuju1['水表名'].unique()))
print(len(shuju2['水表名'].unique()))
print(len(shuju3['水表名'].unique()))
print(len(shuju4['水表名'].unique()))
#給數(shù)據(jù)表添加上具體季度更方便觀察:
import numpy as np
# 合并數(shù)據(jù)
shuju1['季度'] = pd.Series(["一季度" for i in range(len(shuju1.index))])
shuju2['季度'] = pd.Series(["二季度" for i in range(len(shuju2.index))])
shuju3['季度'] = pd.Series(["三季度" for i in range(len(shuju3.index))])
shuju4['季度'] = pd.Series(["四季度" for i in range(len(shuju4.index))])
print(shuju1)
#添加合并:
shuju = shuju1.append([shuju2,shuju3,shuju4],ignore_index=True) # 添加合并
print(shuju)
#再查看表數(shù)量:
print(len(shuju['水表名'].unique()))
print(len(shui_biao['水表名'].unique()))
'''3 按照水表名分類,統(tǒng)計(jì)總用量'''
use_water = shuju.groupby(by='水表名')['用量'].sum() # 按照水表名分類,統(tǒng)計(jì)總用量
print(use_water)
#從高到低排序下:
use_water.sort_values(ascending=False)
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] ?# 指定默認(rèn)字體
#mpl.rcParams['font.sans-serif'] = ['Times New Roman'] #Times New Roman字體
mpl.rcParams['axes.unicode_minus'] = False ?# 解決保存圖像是負(fù)號(hào)'-'顯示為方塊的問題
import matplotlib; matplotlib.use('TkAgg')
#====根據(jù)使用繪制直方圖:=====
use_water.plot.hist(histtype='bar', rwidth=0.5)
plt.savefig('可視化/0.1.png', dpi=300, bbox_inches="tight")
plt.show()
'''4 對(duì)這些功能區(qū)的類型進(jìn)行分析:'''
# 全部水表
list_table_name = list(shuju['水表名'].unique()) ?#合并后的數(shù)據(jù)
'''4.1 功能區(qū)分類'''
#======4.1.1 找到所有宿舍的水表==========
list_home = [] ?#宿舍
list_teaching_build = [] ?#教學(xué)樓
list_teacher_build = [] ?#活動(dòng)地方
for name in list_table_name.copy():
? ? if name.find("學(xué)生宿舍") != -1 or name.find("留學(xué)生樓") != -1:
? ? ? ? list_home.append(name)
? ? ? ? list_table_name.remove(name)
print(list_home)
#=======4.1.2 同理,找到教學(xué)樓=========
for name in list_table_name.copy():
? ? if name.find("XX") != -1 and name.find("樓") != -1:
? ? ? ? print(name)
? ? ? ? list_teaching_build.append(name)
? ? ? ? list_table_name.remove(name)
print(list_teaching_build)
#======4.1.3 農(nóng)業(yè)區(qū)=================
list_agritural = []
for name in list_table_name.copy():
? ? if name.find("養(yǎng)殖") != -1 or name.find("養(yǎng)魚") != -1 or name.find("大棚")!=-1 or name.find("花")!=-1:
? ? ? ? list_agritural.append(name)
? ? ? ? list_table_name.remove(name)
print(list_agritural)
#=======4.1.4 后勤===============
for name in list_table_name.copy():
? ? if name.find("樓")!= -1:
? ? ? ? list_teaching_build.append(name)
? ? ? ? list_table_name.remove(name)
print(list_table_name)
#========類型添加上去·:================
list_backup = list_table_name
name_list = shuju['水表名'].tolist() ?#.tolist:將數(shù)組轉(zhuǎn)化為列表
type_list = []
for name in name_list:
? ? if name in list_backup:
? ? ? ? type_list.append("后勤")
? ? elif name in list_agritural:
? ? ? ? type_list.append("農(nóng)業(yè)")
? ? elif name in list_home:
? ? ? ? type_list.append('宿舍')
? ? elif name in list_teaching_build:
? ? ? ? type_list.append("活動(dòng)地方")
? ? else:
? ? ? ? type_list.append('教學(xué)樓')
shuju['類型'] = pd.Series(type_list)
print(shuju)
'''4.2 不同類型的用量:'''
type_sum = shuju.groupby(by='類型')['用量'].sum()
print(type_sum)
#===對(duì)不同類型可視化:=====
type_sum.plot.barh(alpha=0.7)
df_group_two = shuju.groupby(by=['類型'])
i = 0
colors=['r','g','b','m','c']
plt.figure(figsize=(35, 35), dpi=100)
for types ,group in df_group_two:
? ? i += 1
? ? plt.subplot(3,2,i)
? ? group.groupby(by='水表名').sum()["用量"].plot.barh(title=types,color=colors[i-1],alpha=.5)
plt.savefig('可視化/1不同類型可視化.png', dpi=300, bbox_inches="tight")
plt.show()
#分析完把合并后的數(shù)據(jù)保存起來(lái):
shuju.to_csv('data1.txt',index=False) ?#data1.csv容易數(shù)據(jù)缺失,所以考慮txt
#shuju.to_xlsx('total.xlsx',index=False)
#按照時(shí)間聚合:
shuju['timeStamp'] = pd.to_datetime(shuju['采集時(shí)間'])
shuju.set_index("timeStamp", inplace=True)
data_quarter = shuju.resample("Q") ?# 時(shí)間聚合采樣。.resample:重新采樣,是對(duì)原樣本重新處理的一個(gè)方法,是一個(gè)對(duì)常規(guī)時(shí)間序列數(shù)據(jù)重新采樣和頻率轉(zhuǎn)換的便捷的方法。
'''4.3 接下來(lái)分析每個(gè)季度、月份、天數(shù)、24小時(shí)變化:'''
#===4.3.1 季度變化規(guī)律:===================
data_quarter.sum()["用量"].plot.line(style="m>-.",alpha=0.5,title="用水量隨著季度變化趨勢(shì)") ?#Q:季度
plt.savefig('可視化/0.2用水量隨著季度變化趨勢(shì).png', dpi=300, bbox_inches="tight")
plt.show()
#===4.3.2 月份變化規(guī)律:===================
data_month = shuju.resample('M').sum()["用量"].plot.line(style="c*-.",alpha=0.5,title="用水量隨著月份變化趨勢(shì)") ?#M:月份
plt.savefig('可視化/0.3用水量隨著月份變化趨勢(shì).png', dpi=300, bbox_inches="tight")
plt.show()
'''添加具體時(shí)間:'''
shuju['hour'] = pd.to_datetime(shuju['采集時(shí)間']).dt.hour
shuju['day'] = pd.to_datetime(shuju['采集時(shí)間']).dt.day
print(shuju)
#====4.3.3 用水量一天隨著小時(shí)變化規(guī)律:=============
shuju.groupby(by='hour').sum()['用量'].plot.line(style="gh-.",alpha=0.5,title="用水量隨著時(shí)間變化趨勢(shì)")
plt.grid()
plt.savefig('可視化/0.4用水量一天隨著小時(shí)變化規(guī)律.png', dpi=300, bbox_inches="tight")
plt.show()
#=====4.3.4 一個(gè)月內(nèi)用水量隨著天數(shù)變化:=======
shuju.groupby(by='day').sum()['用量'].plot.line(style="rd-.",alpha=0.5,title="用水量隨著天變化趨勢(shì)")
plt.grid()
plt.savefig('可視化/0.5一個(gè)月內(nèi)用水量隨著天數(shù)變化.png', dpi=300, bbox_inches="tight")
plt.show()
'''4.4 不同區(qū)域的特征:'''
# 不同區(qū)域用水特征
#=======4.4.1 不同區(qū)域隨著季度用水變化=======================
i = 0
styles=['*-.','-.','1-.','2-.','3-.']
plt.figure(figsize=(20, 20), dpi=100)
for index,group in shuju.groupby(by='類型'):
? ? i += 1
? ? plt.subplot(3,2,i)
? ? group.resample("Q").sum()['用量'].plot.line(style=styles[i-1],color=colors[i-1],alpha=0.5,title="{}用水量隨著季度變化趨勢(shì)".format(index)) ?#四個(gè)季度
plt.savefig('可視化/2 不同區(qū)域隨著季度用水變化.png', dpi=300, bbox_inches="tight")
plt.show()
#======4.4.2 不同區(qū)域隨著月份用水變化===============
i = 0
plt.figure(figsize=(20, 20), dpi=100)
for index,group in shuju.groupby(by='類型'):
? ? i += 1
? ? plt.subplot(3,2,i)
? ? group.resample("M").sum()['用量'].plot.line(style=styles[i-1],color=colors[i-1],alpha=0.5,title="{}用水量隨著月份變化趨勢(shì)".format(index))
plt.savefig('可視化/3不同區(qū)域隨月份變化.png', dpi=300, bbox_inches="tight")
plt.show()
#=====4.4.3 不同區(qū)域隨著每月的天數(shù)用水變化==============
i = 0
plt.figure(figsize=(20, 20), dpi=100)
for index,group in shuju.groupby(by='類型'):
? ? i += 1
? ? plt.subplot(3,2,i)
? ? group.groupby(by='day').sum()['用量'].plot.line(style=styles[i-1],color=colors[i-1],alpha=0.5,title="{}用水量隨著天數(shù)變化趨勢(shì)".format(index))
? ? plt.grid()
plt.savefig('可視化/4不同區(qū)域隨著每月的天數(shù)用水變化.png', dpi=300, bbox_inches="tight")
plt.show()
#=====4.4.4 不同區(qū)域隨著每天的時(shí)辰用水變化==============
i = 0
plt.figure(figsize=(20, 20), dpi=100)
for index,group in shuju.groupby(by='類型'):
? ? i += 1
? ? plt.subplot(3,2,i)
? ? group.groupby(by='hour').sum()['用量'].plot.line(style="r*-.",alpha=0.5,title="{}用水量隨著時(shí)辰變化趨勢(shì)".format(index))
? ? plt.grid()
plt.savefig('5.png', dpi=300, bbox_inches="tight")
plt.show()
完整數(shù)據(jù)分享:
鏈接:https://pan.baidu.com/s/1SI8MZZy48e0f2Km3n7gatg?
提取碼:vquz?
--來(lái)自百度網(wǎng)盤超級(jí)會(huì)員V2的分享
#分析完畢~把數(shù)據(jù)保存起來(lái):
shuju.to_csv('data2.txt',index=False) ? ?#data2.csv容易裝不下數(shù)據(jù),照成數(shù)據(jù)缺失
#shuju.to_xlsx('all.xlsx',index=False)
總結(jié)
以上是生活随笔為你收集整理的2020年高教社杯全国大学生数学建模竞赛---校园供水系统智能管理(Python代码实现)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 锁相环PLL
- 下一篇: android ftp 客户端编写(ft