Python智慧停车场运营分析系统

前言

该文章所使用的资料可以私聊获取

该项目小白不用担心,因为全部都有注释,不用担心看不懂 (贴心boy)

所有代码为完整的代码,不用担心(放心)

项目使用的xlse文件(表格部分截图)

先看完成实现效果(0_0)

各个按钮实现情况图

项目结构

btn.py文件代码

import pygame

class Button:
    def __init__(self, screen,centerxy,width,height,button_color,text_color,msg,size):
        """
        创建一个按钮对象
        参数:
        screen:pygame.Surface对象,代表屏幕
        centerxy:tuple,代表按钮的中心坐标
        width:int,代表按钮的宽度
        height:int,代表按钮的高度
        button_color:tuple,代表按钮的背景颜色
        text_color:tuple,代表按钮上文字的颜色
        msg:str,代表按钮上显示的文字
        size:int,代表字体的大小
        """
        self.screen = screen  # 设置屏幕属性
        self.width, self.height = width, height  # 设置宽度和高度属性
        self.button_color = button_color  # 设置按钮颜色属性
        self.text_color = text_color  # 设置文字颜色属性
        self.font = pygame.font.SysFont('SimHei', size)  # 设置字体属性
        self.rect = pygame.Rect(0, 0, self.width, self.height)  # 创建一个矩形对象,设置宽度和高度属性
        self.rect.centerx = centerxy[0]  # 设置矩形的中心点x坐标
        self.rect.centery = centerxy[1]  # 设置矩形的中心点y坐标
        self.deal_msg(msg)  # 处理消息方法


    def deal_msg(self,msg):
        """
        处理按钮上的文字图片

        参数:
        msg:str,按钮上显示的文字
        """
        self.msg_img = self.font.render(msg, True, self.text_color)  # 创建一个图像对象,将传入的文本渲染为图像,并设置文字为前景颜色和背景颜色
        self.msg_img = self.font.render(msg, True, self.text_color, self.button_color)  # 创建一个图像对象,将传入的文本渲染为图像,并设置文字为前景颜色和背景颜色
        self.msg_img_rect = self.msg_img.get_rect()  # 创建一个矩形对象,用于表示图像的位置和大小
        self.msg_img_rect.center = self.rect.center  # 设置图像矩形的中心点为父对象矩形的中心点


    def draw_button(self):
        # 绘制按钮背景
        self.screen.fill(self.button_color,self.rect)
        # 绘制按钮文字
        self.screen.blit(self.msg_img,self.msg_img_rect)


import sys  # 导入sys模块,用于退出程序和打印错误信息
import pygame  # 导入pygame模块,用于开发跨平台的电子游戏和多媒体应用程序
import btn  # 导入btn模块,用于处理按钮的相关操作
import TimeUtil  # 导入TimeUtil模块,用于处理时间相关操作

pygame.init()  # 初始化pygame模块
# size = width, height = 320,240  # 设置窗口大小为800x600
size = width, height = 360,240  # 设置窗口大小为800x600

WHITE = (255,255,255)  # 定义白色RGB值
BLUE = (72,61,139)  # 定义蓝色RGB值
screen = pygame.display.set_mode(size)  # 创建一个pygame屏幕对象,并设置屏幕的大小
screen.fill(WHITE)  # 将屏幕填充为白色
while True:
    # button1 = btn.Button(screen, (90, 50), 140, 60, BLUE, WHITE, '关闭窗口', 20)  # 创建一个矩形按钮对象,指定位置、尺寸、颜色、文字颜色、文字内容和文字大小
    # button1.draw_button()  # 绘制按钮

    # 创建按钮1
    btn1 = btn.Button(screen, (90, 50), 140, 60, BLUE, WHITE, '停车时间分布', 20)
    # 绘制按钮1
    btn1.draw_button()

    # 创建按钮2
    btn2 = btn.Button(screen, (90, 130), 140, 60, BLUE, WHITE, '停车高峰时间', 20)
    # 绘制按钮2
    btn2.draw_button()

    # 创建按钮3
    btn3 = btn.Button(screen, (90, 210), 140, 60, BLUE, WHITE, '停车场信息', 20)
    # 绘制按钮3
    btn3.draw_button()

    # 创建按钮4
    btn4 = btn.Button(screen, (250, 50), 140, 60, BLUE, WHITE, '月收入分析', 20)
    # 绘制按钮4
    btn4.draw_button()

    # 创建按钮5
    btn5 = btn.Button(screen, (250, 130), 140, 60, BLUE, WHITE, '接待车辆统计', 20)
    # 绘制按钮5
    btn5.draw_button()

    pygame.display.update()  # 更新屏幕显示
    for event in pygame.event.get():  # 遍历事件列表
        if event.type == pygame.QUIT:  # 如果事件类型是退出窗口
            pygame.quit()  # 退出pygame
            sys.exit()  # 退出程序
        elif event.type == pygame.MOUSEBUTTONDOWN:  # 如果事件类型是鼠标按下

            # 如果鼠标位置在按钮的水平范围内
            if 20 <= event.pos[0] and event.pos[0] <= 90 + 70 and 20 <= event.pos[1] and event.pos[1] <= 50 + 30:

                # sys.exit()  # 退出程序
                TimeUtil.sjfb()
                pass
            elif 20 <= event.pos[0] and event.pos[0] <= 90 + 70  and 100 <= event.pos[1] and event.pos[1] <= 130 + 30:
                TimeUtil.tcgf()
                pass  # 终止当前函数,不做其他操作
            elif 20 <= event.pos[0] and event.pos[0] <= 90 + 70 and 180 <= event.pos[1] and event.pos[1] <= 210 + 30:
                TimeUtil.fmtj()
                pass
            elif 180 <= event.pos[0] and event.pos[0] <= 250 + 70 and 20 <= event.pos[1] and event.pos[1] <= 50 + 30:
                TimeUtil.ysrfx()
                pass
            elif 180 <= event.pos[0] and event.pos[0] <= 250 + 70 and 100 <= event.pos[1] and event.pos[1] <= 130 + 30:
                TimeUtil.cljd()
                pass

TimeUtil.py文件代码

import pandas as pd
import matplotlib.pyplot as plt
import datetime
import matplotlib.ticker as ticker
# 导入pandas库,用于数据处理和分析
# 导入matplotlib.pyplot库,用于数据可视化
# 导入datetime库,用于处理日期和时间相关函数


def get_week_numbeer(date):

    from datetime import datetime
    # 导入datetime模块

    # 将字符串日期转换为datetime对象
    date = datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S")

    # 获取日期对应的星期几(0表示星期一,6表示星期日)
    day = date.weekday()

    # 返回星期几的值
    return day


# 停车时间分布图
def sjfb():
# 排除进入停车场未出停车场的车
    # 读取停车场信息表的数据
    pi_data = pd.read_excel("../datafile/停车场信息表.xlsx")

    # 选取timeout不为0的记录
    data = pi_data.loc[pi_data['timeout']!=0]

    # 将timein和timeout列转换为datetime格式
    data['timein']=pd.to_datetime(data['timein'])
    data['timeout']=pd.to_datetime(data['timeout'])

    # 计算停车时间差
    data['h']=data['timeout']-data['timein']

    # 设置停车时间分布图的标题
    plt.title('停车时间分布图')

    # 设置字体样式
    plt.rcParams['font.sans-serif'] = ['FangSong']

    # 分类统计数据
    df1 = data.loc[data['h']<='0 days 01:00:00']
    df2 = data.loc[(data['h']>'0 days 01:00:00') & (data['h']<='0 days 02:00:00')]
    df3 = data.loc[(data['h']>'0 days 02:00:00') & (data['h']<='0 days 03:00:00')]
    df4 = data.loc[(data['h']>'0 days 03:00:00') & (data['h']<='0 days 04:00:00')]
    df5 = data.loc[data['h']>'0 days 04:00:00']

    # 绘制停车时间分类统计图
    x = ['1小时','2小时','3小时','4小时','4小时以上']
    y = [len(df1),len(df2),len(df3),len(df4),len(df5)]
    plt.bar(x, y)

    # 在图中添加每类停车量的标签
    for x, y in enumerate(y):
        plt.text(x, y+20, str(y)+'台', ha='center')

    # 显示图形
    plt.show()

    pass


# 停车高峰期占比
def tcgf():

    # 导入pandas库并读取停车场信息表的Excel文件
    data = pd.read_excel("../datafile/停车场信息表.xlsx")

    # 设置图表标题为'停车高峰期占比'
    plt.title('停车高峰期占比')

    # 设置各类别标签
    labels = ['0-3点' ,'3-6点','6-9点','9-12点','12-15点','15-18点','18-21点','21-00点']

    # 分类统计数据
    # 获取具体时间点为00:00的停车数据
    kk0 = data[(data['timein'].str.contains(' 00:'))]
    # 获取具体时间点为01:00的停车数据
    kk1 = data[(data['timein'].str.contains(' 01:'))]
    # 获取具体时间点为02:00的停车数据
    kk2 = data[(data['timein'].str.contains(' 02:'))]
    # 获取具体时间点为03:00的停车数据
    kk3 = data[(data['timein'].str.contains(' 03:'))]
    # 获取具体时间点为04:00的停车数据
    kk4 = data[(data['timein'].str.contains(' 04:'))]
    # 获取具体时间点为05:00的停车数据
    kk5 = data[(data['timein'].str.contains(' 05:'))]
    # 获取具体时间点为06:00的停车数据
    kk6 = data[(data['timein'].str.contains(' 06:'))]
    # 获取具体时间点为07:00的停车数据
    kk7 = data[(data['timein'].str.contains(' 07:'))]
    # 获取具体时间点为08:00的停车数据
    kk8 = data[(data['timein'].str.contains(' 08:'))]
    # 获取具体时间点为09:00的停车数据
    kk9 = data[(data['timein'].str.contains(' 09:'))]
    # 获取具体时间点为10:00的停车数据
    kk10 = data[(data['timein'].str.contains(' 10:'))]
    # 获取具体时间点为11:00的停车数据
    kk11 = data[(data['timein'].str.contains(' 11:'))]
    # 获取具体时间点为12:00的停车数据
    kk12 = data[(data['timein'].str.contains(' 12:'))]
    # 获取具体时间点为13:00的停车数据
    kk13 = data[(data['timein'].str.contains(' 13:'))]
    # 获取具体时间点为14:00的停车数据
    kk14 = data[(data['timein'].str.contains(' 14:'))]
    # 获取具体时间点为15:00的停车数据
    kk15 = data[(data['timein'].str.contains(' 15:'))]
    # 获取具体时间点为16:00的停车数据
    kk16 = data[(data['timein'].str.contains(' 16:'))]
    # 获取具体时间点为17:00的停车数据
    kk17 = data[(data['timein'].str.contains(' 17:'))]
    # 获取具体时间点为18:00的停车数据
    kk18 = data[(data['timein'].str.contains(' 18:'))]
    # 获取具体时间点为19:00的停车数据
    kk19 = data[(data['timein'].str.contains(' 19:'))]
    # 获取具体时间点为20:00的停车数据
    kk20 = data[(data['timein'].str.contains(' 20:'))]
    # 获取具体时间点为21:00的停车数据
    kk21 = data[(data['timein'].str.contains(' 21:'))]
    # 获取具体时间点为22:00的停车数据
    kk22 = data[(data['timein'].str.contains(' 22:'))]
    # 获取具体时间点为23:00的停车数据
    kk23 = data[(data['timein'].str.contains(' 23:'))]

    # 统计各类别停车数量
    x = [(len(kk0) + len(kk1) + len(kk2)), (len(kk3) + len(kk4) + len(kk5)), (len(kk6) + len(kk7) + len(kk8)), (len(kk9) + len(kk10) + len(kk11)), (len(kk12) + len(kk13) + len(kk14)), (len(kk15) + len(kk16) + len(kk17)), (len(kk18) + len(kk19) + len(kk20)), (len(kk21) + len(kk22) + len(kk23))]

    # 绘制饼图
    # 生成一个饼图
    plt.pie(x, labels=labels, autopct='%1.1f%%')
    # 设置x轴和y轴相等
    plt.axis('equal')
    # 在右上角添加图例,图例的字体大小为10
    plt.legend(loc='upper right', fontsize=10, bbox_to_anchor=(1.1, 0.5), borderaxespad=0.3)
    # 显示图形
    plt.show()

    pass


# 停车星期比
def fmtj():
    # 读取停车场信息表的Excel文件
    data = pd.read_excel("../datafile/停车场信息表.xlsx")

    # 筛选出状态为1的记录
    ds=data.loc[data['state']==1]

    # 复制筛选结果
    ds=ds.copy()

    # 将时间列timein转换为DateTime格式
    ds['timein']=pd.to_datetime(ds['timein'])

    # 统计每周一到周日的停车数量
    ds['timeinweek']=ds['timein'].dt.dayofweek
    ds2=ds.groupby('timeinweek')
    weeksuns=ds2.size()

    # 定义星期的标签
    labels=['星期一','星期二','星期三','星期四','星期五','星期六','星期天']

    # 设置中文字符集为方正字体
    plt.rcParams['font.sans-serif']=['FangSong']

    # 绘制饼图,显示每周停车数量占比
    plt.pie(weeksuns,labels=labels,autopct='%.2f%%')

    # 设置图表标题
    plt.title('停车星期比')

    # 显示图表
    plt.show()

    pass


# 月收入分析
def ysrfx():
    # 读取停车场信息表的Excel文件
    data = pd.read_excel("../datafile/停车场信息表.xlsx")

    # 筛选出state为1的数据
    srdf = data.loc[data['state'] == 1]


    # 筛选出2018年1月的数据
    kk1 = srdf[(srdf['timeout'].str.contains('2018-01'))]

    # 筛选出2018年2月的数据
    kk2 = srdf[(srdf['timeout'].str.contains('2018-02'))]

    # 筛选出2018年3月的数据
    kk3 = srdf[(srdf['timeout'].str.contains('2018-03'))]

    # 计算每个月的收入总和
    price1 = kk1['price'].sum()
    price2 = kk2['price'].sum()
    price3 = kk3['price'].sum()

    # 设置x轴和y轴的标签
    labels_x = ['1月', '2月', '3月']
    y = [price1, price2, price3]

    # 绘制柱状图
    plt.bar(labels_x, y)

    # 在每个柱子上显示具体的数值
    for x, y in enumerate(y):
        plt.text(x, y + 300, str(y) + '元', ha='center')

    # 设置标题和总收入
    plt.title('2018年1月-3月收入分析-总收入:' + str(price1 + price2 + price3) + '元')
    plt.xlabel('月份')
    plt.ylabel('收入')

    # 显示图形
    plt.show()

    pass



#每日接待车辆统计
def cljd():
    # 读取停车场信息表的Excel文件
    data = pd.read_excel("../datafile/停车场信息表.xlsx")

    # 筛选出状态为1的数据
    data = data.loc[data['state']==1]

    # 设置开始日期和结束日期
    iin = '2018-01-01'
    end = '2018-03-31'

    # 使用strptime将字符串转换为时间元组
    dataiin = datetime.datetime.strptime(iin,'%Y-%m-%d')
    dataend = datetime.datetime.strptime(end,'%Y-%m-%d')

    # 初始化x和y列表
    x = []
    y = []

    # 循环遍历日期范围内的每一天
    while dataiin <= dataend:
        # 将时间元组转换为字符串,并将结果添加到x列表中
        x.append(dataiin.strftime('%y-%m-%d'))

        # 统计该日期下车辆的数量,并将结果添加到y列表中
        y.append(len(data[data['timein'].str.contains(dataiin.strftime('%y-%m-%d'))]))

        # 增加一天后继续下一次循环
        dataiin = dataiin + datetime.timedelta(days=1)

    # 设置中文显示格式
    plt.rcParams['font.sans-serif'] = ['SimHei']

    # 绘制折线图
    plt.plot(x,y)

    # 清除刻度标签
    plt.xticks([])

    # 设置图表标题
    plt.title('每日接待车辆统计')

    # 设置x轴标签
    plt.xlabel('2018-01-01到2018-03-31')

    # 显示图形
    plt.show()
    pass

结尾

没什么说的,愿各位代码无bug。

网络乞丐求打赏!(❀_❀)

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于物联网的智能停车场系统可以通过以下运营方式: 1. 停车场智能化管理 智能停车场系统可以通过传感器、摄像头、无线网络等技术实现对停车场的实时监控和管理。通过智能识别车辆,系统可以自动识别车辆入场时间和出场时间,以及车辆停放的位置和停放时长等信息。同时,系统还可以通过移动支付等技术实现自动缴费,提高停车场的管理效率和服务水平。 2. 提供实时停车位信息 智能停车场系统可以通过传感器和无线网络等技术实现对停车位的实时监控和管理。通过实时采集停车位的使用情况,系统可以提供实时停车位信息,让车主在进入停车场前就能了解停车位的情况,从而避免盲目寻找停车位而浪费时间。 3. 优化停车场布局 智能停车场系统可以通过对停车位使用情况的分析,提供停车场布局优化方案,从而最大化利用停车位资源,提高停车场的使用效率和收益。 4. 提供车辆安全保障 智能停车场系统可以通过视频监控和车辆识别等技术,实现对停车场内车辆的安全监控和管理。同时,系统还可以提供车辆防盗、防撞等安全保障服务,让车主更加安心地停放车辆。 5. 数据分析运营优化 智能停车场系统可以通过对停车场内数据的分析,提供运营优化方案,从而提高停车场的收益和服务水平。例如,通过对车流量和停车位使用情况的分析系统可以提供停车场运营商更加精细化的管理方案,提高停车场的利润和服务品质。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值