目 录
一. 问题描述 2
二. 详细内容及步骤 3
- 提取数据中有用的信息 get_data.py文件 3
import pandas as pd 3
1)自动读取excel表,存在一个dataframe中: 3
2) 数据清理,调整 3
3) 增加数据列 3
4) 将处理一个文件扩展到处理多个文件 3
5) 文件内部调用:df=get_data() 4 - 画九月每天的不同时间段在库车数量 柱状图 draw_bar.py文件 8
1)切分时间 8
2) 分组,分别统计组内个数 8
3)由不同时段的停入车数量和离开车数量,计算不同时段的在库车数量 9
4)由不同时段的在库车数量owner_sum和temp_sum画出柱状图 9 - 画9月在库车数量最大值与平均值 process.py文件 10
import pandas as pd 10
- allbar函数 11
- 画甘特图 Gantt.py文件 12
1) 查找想要的数据 12
2) 排序 12
3) 甘特图可理解为横向条形图 12
三. 总结及展望 13
数据内包含业主的车与临时车。临时车是点对点的共享平台的停车用户。点对点指业主写明可共享车位的时间段,临停用户可在平台上找到适合自己停车需求的车位定点停放。该共享方案的问题是业主参与度不高,白天仍有大量剩余车位,而白天小区周围有停车需求。
现在希望建立一个新的共享停车的方案,不需要业主指明可共享的时间段。根据停车的历史数据进行分析,自动得出适合开放共享停车的时间段和共享的最大停车位数,保证业主有位置停。
二.详细内容及步骤
1.提取数据中有用的信息 get_data.py文件
使用python 中的pandas库的dataframe类来存储数据。
首先读取一个excel表中的数据,成功后再用类似的方法使用循环读取所有文件。
一些关键步骤展示整行代码,其余仅写出函数名,略去参数
import pandas as pd
1)自动读取excel表,存在一个dataframe中:
df=pd.read_excel(‘./data/’+fname,skiprows=3)#跳过前三行,从第四行开始读取 原本不知道有跳过行的功能,还使用了xlrd包先读取再存到dataframe中
2)数据清理,调整
清除列 df.drop(df.columns[delid], axis=1, inplace=True)
清楚空值所在一整行df.dropna(inplace=True)
重命名列名称 df.rename(columns={‘车牌号码’:‘num’,…},inplace=True)
重命名一列中的值df[‘type’]=df[‘type’].replace([‘纯车牌月卡A’,‘临时车纯车牌识别(小车)’],[‘业主’,‘临时’])
3)增加数据列
字符串的时间类型转化为[0,24)连续的数,小时为单位df[‘intimedig’]=list(map(time2dig,df[‘intime’]))#数字化的连续时间float64类 time2dig为自编函数
字符串的时间类型转化为datetime64类型,便于以后操作df[‘indatetime’]=pd.to_datetime(df[‘intime’])
4)将处理一个文件扩展到处理多个文件
import pandas as pd
import os
def get_data():
fnames = os.listdir(‘./data/’)#./相对目录 返回data文件夹下所有文件名称
dfall=pd.DataFrame()#创建一个空的dataframe
for fname in fnames:
df=pd.read_excel(‘./data/’+fname,skiprows=3)#跳过前三行
#处理内容
dfall=pd.concat([dfall,df],ignore_index=True)#竖向拼接 重新分配索引
…
return dfall
5)文件内部调用:df=get_data()
运行文件后,总的数据df就存在了工作区中。本文转载自http://www.biyezuopin.vip/onews.asp?id=14768以后调用其他的函数文件处理数据,直接在命令行窗口将df作为输入参数,不需要重新生成。这样增加了计算效率(生成df需要几秒钟时间)。
def draw(df):
import pandas as pd
from matplotlib import pyplot as plt
import pylab as pyl #使matplotlib可显示中文
pyl.mpl.rcParams['font.sans-serif'] = ['SimHei'] #使matplotlib可显示中文
date=df.drop_duplicates('indate').loc[:,['indate','inweek']]#去重
#类型dataframe 两列存不重复的日期和相应的星期
date=date.sort_values('indate')#按日期排序
for id in date.index: #画九月每天的不同车开始停车时刻与停车时长散点图
d=date.loc[id,'indate']
w=date.loc[id,'inweek']
fig1=df.loc[(df['indate']==d)&(df['type']=='业主')\
&(df['length']<24),:]#忽略停车时长大于一天的
fig2=df.loc[(df['indate']==d)&(df['type']=='临时')\
&(df['length']<24),:]
title=str(d)[:11]+str(w) #日期星期几
plt.title(title)
plt.xlabel("开始停车时刻/点(h)")
plt.ylabel("停车时长/h")
plt.xticks(range(0,24))#横坐标 0:23 步长1
plt.yticks(range(0,24))
plt.grid()
plt.plot(fig1['intimedig'],fig1['length'],'r.',markersize=3)
plt.plot(fig2['intimedig'],fig2['length'],'b.',markersize=3)
plt.savefig('./fig开始停车/'+title+'.jpg',dpi=100)#指定分辨率100
plt.clf()#清空画布
#plt.show()
date=df.drop_duplicates('outdate').loc[:,['outdate','outweek']]#去重
#因为excel表数据本身是根据离开时刻排的,不需要排序日期
for id in date.index: #画九月每天的不同车离开时刻与停车时长散点图
d=date.loc[id,'outdate']
w=date.loc[id,'outweek']
fig1=df.loc[(df['outdate']==d)&(df['type']=='业主')\
&(df['length']<24),:]
fig2=df.loc[(df['outdate']==d)&(df['type']=='临时')\
&(df['length']<24),:]
title=str(d)[:11]+str(w) #日期星期几
plt.title(title)
plt.xlabel("离开时刻/点(h)")
plt.ylabel("停车时长/h")
plt.xticks(range(0,24))
plt.yticks(range(0,24))
plt.grid()
plt.plot(fig1['outtimedig'],fig1['length'],'r.',markersize=3)
plt.plot(fig2['outtimedig'],fig2['length'],'b.',markersize=3)
plt.savefig('./fig离开时刻/'+title+'.jpg',dpi=100)#指定分辨率100
plt.clf()#清空画布