已知客户需求:
在本文档所在的压缩文件中包括上学期期末实习对小白鼠视频处理后的文件,要求对这些文件中的内容用pandas进行数据处理,然后使用百度开源的可视化工具Echart对处理结果进行可视化展示。
1、数据说明
要处理的数据包含在TextResult1.zip和TextResult2.zip中。解压缩后的文件名类似ch01_20180116002121(1-2).txt的格式,每个对应的文本文件中的内容如下图。
文件的内容解释如下:
变化点:表示把视频每10帧截取一个画面,比较前后两个画面的像素点的变化。视频一段时间内前后截图的画面像素点变化的总和就是文件中的像素点。
帧数:表示视频总共截取了多少帧的画面。
时间:表示视频总共有多长时间,单位为秒。
文件名中包含了要对数据进行处理的信息。文件名的结构类似ch01_20180116002121(1-2).txt,需要提取的信息如下。(备注:压缩文件中的文件名没有ch01_这样的文件名我们不做处理,忽略掉)
ch01:可以抽象为“ch0?”,“?”通常表示一个任意字符,在我们这个实验里表示一个数字。具体的含义表示录制小白鼠视频的一个摄像头的编号。
20180116:这是一个日期,格式是“YYYYMMDD”,四位年度,两位月份,两位天数,表示2018年01月16日。是录制小白鼠视频的日期。
002121:这是时间,格式是“HHMMSS”,格式是小时、分钟、秒,表示录制小白鼠视频的时间。
(1-2):小白鼠笼子的编号,通常是(1-1)、(1-2)、(1-3)、(1-4)这样的。没有笼号的文件名,在下面的处理中,默认笼号填写为字符“1”。
2、数据处理的第一步
要求从文件名中提取四位的摄像头编号,格式为字符串;八位的日期,格式为字符串;6位的时间,格式为字符串;3位的笼子编号,把括号去掉,数据的格式是字符串,类似这样“1-2”。
从对应文件名的内容中提取变化点数、帧数、时间。这三个我们作为数值型数据看待。
把上面提取到的六个数据项写入到一个新的文本文件中,这个文本文件命名为:“学号+姓名.txt”。这个文件的内容看起来是这样的(有一个表头),数据之间使用空格分割,不要求表头和数据在格式上对齐。
摄像头编号 摄像日期 摄像时间 笼号 变化点数 帧数 视频时间长度
ch01 20180116 002121 1-2 212573 33890 1412.083
把所有上学期实习计算出来的小白鼠的视频处理数据(文件名为:ch0?YYYYMMDDHHMMSS(??).txt 的文件,两个压缩包中的文件)都按照附加到这个文件中,每个文件的内容处理为这里的一行数据。
3、数据处理的第二步
重新建立一个新的文本文件,命名为“学号+姓名+结果1.txt”。
这个文件的主要目的是把小白鼠的活动变化点数按照小时作为分割来做数据清洗,每天24小时,从00-23把它们分别处理在不同的时间单元内(一小时看做一个时间单元),这里处理的基本方法如下。
视频录制的时间我们提取出来是HHMMSS的格式,我们的视频大部分在23分钟(1412秒),规则如下:
(1)从HHMMSS中提取分钟,如果MM>=40,则把这段视频计入下一个小时,即HH记为HH+1;如果HH=23,则日期要加1,HH记为下一天的00时段。
(2)HHMMSS中提取分钟,如果MM<40,则把这段视频计入本小时,即HH。
(3)如果HH
“学号+姓名+结果1.txt”的文件内容如下:
摄像头编号 摄像日期 摄像时间 笼号 变化点数 帧数 视频时间长度 时段
ch01 20180116 002121 1-2 212573 33890 1412.083 00
这个文件的结果就是用来按照时段的不同,我们来对比不同笼子里面的小白鼠的活跃程度。
第二部分 数据分析和统计
问题描述:每个笼子里面的小白鼠用不同浓度的普洱茶进行喂养。我们的目标是对比不同笼子里面的小白鼠用不同浓度的普洱茶喂养之后他们的活跃程度。
以下每个分析统计的结果要求保存在一个文本文件中,按照顺序分别命名为“学号+姓名+统计结果(序号).txt”。
(1)按照摄像头编号、笼子编号统计拥有的视频录像的天数
(2)对2018年1月16日到2018年2月4日之间不同摄像头编号,不同笼子编号,不同小时(每天24小时,从00-23)的变化点数进行分组统计。统计结果的格式如下:
摄像头编号 笼子编号 时段 变化点数
(3)把2018年1月16日到2018年2月4日之间共20天分为三个日期段,第一个日期段7天,第二个日期段7天,第三个日期段6天(分别编号为日期段1、日期段2、日期段3)。对不同摄像头编号,不同笼子编号,不同小时(每天24小时,从00-23)的变化点数进行分组统计。统计结果的格式如下:
摄像头编号 笼子编号 日期段 时段 变化点数
代码一:
# -*- coding: UTF-8 -*-
_author_ = ''
_date_ = '2019/1/18 0018 13:56'
path=r'C:\Users\83804\Desktop\作业\TextResult'
import os
import pandas as pd
from dateutil.parser import parse
def file_name(file_dir):
list=[]
for files in os.walk(file_dir):
list.append(files)
#print(root) # 当前目录路径
#print(dirs) # 当前路径下所有子目录
#print(files) # 当前路径下所有非目录子文件
return list[0][2]#读取文件目录下所有文件存为数组
def get_data(data,filename):
with open(filename, mode='w+', buffering=-1, encoding='utf-8', errors=None, newline=None, closefd=True, opener=None) as f:
f.write('摄像头编号 摄像日期 摄像时间 笼号 变化点数 帧数 视频时间长度')
f.write('\n')
for i in data:
if i[0:2]=='ch':
path_file='C:\\Users\\83804\\Desktop\\作业\\TextResult\\'+str(i)
length=len(i)
r = open(path_file, "r")
if length==28:#此时是处理有摄像头编号的数据
id=i[0:4]
date=i[5:13]
time=i[13:19]
cage=i[20:23]
r.readline()
str1 = r.readline() # 读取第二行
ss = str1.split(' ')
ss = list(filter(None, ss))
try:
change_point = ss[0]
frame_number = ss[1]
second_time = ss[2]
except:
print(path_file)
# 有报错的跳出
data_line = id + ' ' + date + ' ' + time + ' ' + cage + ' ' + change_point + ' ' + frame_number + ' ' + second_time # 这里用了table键分割
f.write(data_line)
if length==23:#此时处理无摄像头编号数据
id = i[0:4]
date = i[5:13]
time = i[13:19]
cage = '1'
r.readline()
str1 = r.readline() # 读取第二行
ss = str1.split(' ')
ss = list(filter(None, ss))
try:
change_point = ss[0]
frame_number = ss[1]
second_time = ss[2]
except:
print(path_file)
#有报错的跳出
data_line = id + ' ' + date + ' ' + time + ' ' + cage + ' ' + change_point + ' ' + frame_number + ' ' + second_time # 这里用了table键分割
f.write(data_line)
r.close()
# 关闭打开的文件
def step_two():
file='学号+姓名+结果1.txt'
#data = pd.read_csv('学号.txt',engine='python',encoding='UTF-8')#, header=None不要把第一行作为header,这里需要
#print(data.head())
w=open(file,mode='w+',encoding='utf-8')
w.write('摄像头编号 摄像日期 摄像时间 笼号 变化点数 帧数 视频时间长度 时段')
w.write('\n')
with open ('学号.txt','r+', encoding='utf-8') as f:
f.readline()
ss=f.readline()
while ss!='':
ss=ss.split(' ')
if len(ss)==7:
date=ss[1]#8位数字
day=int(date[6:8])
#进行要求的日期编辑操作
time=ss[2]
hh=int(time[0:2])
mm=int(time[2:4])
if mm <40:
hh=hh
if mm>=40:
hh=hh+1
if hh==23:
day=day+1
hh=00
template=ss[1][0:6]+str(day)
if len(template)==7:
template=ss[1][0:6]+'0'+str(day)
video_time=ss[6]
video_time=video_time.strip( '\n' )
write_str=str(ss[0]+' '+template+' '+ss[2]+' '+ss[3]+' '+ss[4]+' '+ss[5]+' '+video_time+' '+str(hh))
#print(write_str)
w.write(write_str)
w.write('\n')
ss = f.readline()
w.close()
# print(data['摄像日期'])
# print(type(data['摄像日期']))
def step_three():#将其数据存入pandas的dateframe进行操作
file='学号 + 姓名 + 统计结果(1).txt'
data = pd.read_csv('学号+姓名+结果1.txt',sep=' ',engine='python',encoding='UTF-8')#, header=None不要把第一行作为header,这里需要
#print(type(data))
rowNum = data.shape[0] # 不包括表头
colNum = data.columns.size
#sorted_df = data.sort_index('摄像日期')
#print((data['摄像日期']))
sxt=data.groupby('摄像头编号').sum()
lzbh=data.groupby('摄像头编号').sum()
f=open(file,mode='w+',encoding='utf-8')
l=['ch01','ch02','ch03','ch04']
for i in l:
col = data[data["摄像头编号"]==i]
print((col['摄像日期'].value_counts()).shape[0])
f.write(str(i)+' '+str((col['摄像日期'].value_counts()).shape[0]))
f.write('\n')
cage_id=[]
for i in data['笼号']:
if i not in cage_id:
cage_id.append(i)
print(cage_id)
for i in cage_id:
col = data[data["笼号"]==i]
print((col['摄像日期'].value_counts()).shape[0])
f.write(str(i)+' '+str((col['摄像日期'].value_counts()).shape[0]))
f.write('\n')
def step_two_two():
data = pd.read_csv('学号+姓名+结果1.txt', sep=' ', engine='python', encoding='UTF-8') # , header=None不要把第一行作为header,这里需要
file = '学号 + 姓名 + 统计结果(2).txt'
data.sort_values("摄像日期",inplace=True)
print(data.head())
print(data[data['摄像日期']>=20180116].head())#and data['摄像日期']<=20180204
df=data[data['摄像日期']<=20180204]
print(df[df['摄像日期']<=20180204].tail())#摄像头编号 笼子编号 时段 变化点数
f = open(file, mode='w+', encoding='utf-8')
f.write('摄像头编号 笼子编号 时段 变化点数')
f.write('\n')
for index, row in df.iterrows():
print(row["摄像头编号"], row['笼号'],row["时段"],row['变化点数'])
f.write(str(row["摄像头编号"])+' '+str(row['笼号'])+' '+str(row["时段"])+' '+str(row['变化点数']))
f.write('\n')
f.close()
#index=0
# for i in data['摄像日期']:
# df.iloc[index,1]=str(i)
# index=index+1
# print(data.head())
def step_two_three():#摄像头编号 笼子编号 日期段 时段 变化点数
data = pd.read_csv('学号+姓名+结果1.txt', sep=' ', engine='python', encoding='UTF-8') # , header=None不要把第一行作为header,这里需要
file = '学号 + 姓名 + 统计结果(3).txt'
data.sort_values("摄像日期", inplace=True)
# print(data.head())
print(data[data['摄像日期'] >= 20180116].head()) # and data['摄像日期']<=20180204
df = data[data['摄像日期'] <= 20180204]
print(df[df['摄像日期'] <= 20180204].tail()) # 摄像头编号 笼子编号 时段 变化点数
f = open(file, mode='w+', encoding='utf-8')
f.write('摄像头编号 笼子编号 日期段 时段 变化点数')
f.write('\n')
for index, row in df.iterrows():
date_period=None
if row['摄像日期']>=20180116 and row['摄像日期']<=20180122:
date_period=1
if row['摄像日期'] >= 20180123 and row['摄像日期'] <= 20180129:
date_period=2
if row['摄像日期'] >= 20180130 and row['摄像日期'] <= 20180204:
date_period=3
if date_period!=None:
f.write(str(row["摄像头编号"]) + ' ' + str(row['笼号']) +' '+ str(date_period)+' '+ str(row["时段"]) + ' ' + str(row['变化点数']))
f.write('\n')
f.close()
#parse(data.iloc[:,1]) # 将数据类型转换为日期类型
#data = data.set_index('date') # 将date设置为index
#print(data.head())
#col=df2.iloc[:,2] 处理行列
#col=data
#col.index =col.iloc[:,1]#进行切片操作
# 把index处理为datetime格式
# col.index = pd.to_datetime(col.index, unit='ns')
#print(sxt)
#print(data)
if __name__ == '__main__':
result=file_name(path)
get_data(result,r'学号.txt')
step_two()
step_three()
step_two_two()
step_two_three()
代码2:
# -*- coding: UTF-8 -*-
_author_ = ''
_date_ = '2019/1/18 0018 20:51'
import pandas as pd
import os
filecsv_list=[]
for root, dirs, files in os.walk('C:\\Users\\83804\\Desktop\\作业\\TextResult\\'):
for file in files:
if os.path.splitext(file)[1] == '.txt':
filecsv_list.append(file)
for i in filecsv_list:
print(i)
def file_one():
f = open('学号+姓名.txt', mode='w+', encoding='utf-8')
f.write('摄像头编号 摄像日期 摄像时间 笼号 变化点数 帧数 视频时间长度')
f.write('\n')
for i in filecsv_list:
file_dir='C:\\Users\\83804\\Desktop\\作业\\TextResult\\'+str(i)
r = open(file_dir, mode='r',encoding='ANSI')
r.readline()
string = r.readline()
s = string.split(' ')
s = list(filter(None, s))#处理列表空白数据
length = len(i)
result=None
if length == 28:
id = i[0:4]
date = i[5:13]
time = i[13:19]
cage = i[20:23]
try:
change_point = s[0]
frame_number = s[1]
second_time = s[2]
result = id + ' ' + date + ' ' + time + ' ' + cage + ' ' + change_point + ' ' + frame_number + ' ' + second_time
except:
pass
if length == 23: # 此时处理无摄像头编号数据
id = i[0:4]
date = i[5:13]
time = i[13:19]
cage = '1'
try:
change_point = s[0]
frame_number = s[1]
second_time = s[2]
result = id + ' ' + date + ' ' + time + ' ' + cage + ' ' + change_point + ' ' + frame_number + ' ' + second_time
except:
pass
if result != None:
if result[0:2]=='ch':
f.write(result)
f.write('\n')
f.close()
#-----------------------进行文件读写----------------------
def file_two():
file = '学号+姓名+结果1.txt'
w = open(file, mode='w+', encoding='utf-8')
w.write('摄像头编号 摄像日期 摄像时间 笼号 变化点数 帧数 视频时间长度 时段')
w.write('\n')
with open('学号+姓名.txt', 'r+', encoding='utf-8') as f:
f.readline()
ss = f.readline()
while ss!= '':
ss = ss.split(' ')
if len(ss) == 7:
date = ss[1] # 8位数字
day = int(date[6:8])
time = ss[2]
hh = int(time[0:2])
mm = int(time[2:4])
if mm < 40:
hh = hh
if mm >= 40:
hh = hh + 1
if hh == 23:
day = day + 1
hh = 00
template = ss[1][0:6] + str(day)
if len(template) == 7:
template = ss[1][0:6] + '0' + str(day)
video_time = ss[6]
video_time = video_time.strip('\n')
write_str = str(ss[0] + ' ' + template + ' ' + ss[2] + ' ' + ss[3] + ' ' + ss[4] + ' ' + ss[5] + ' ' + video_time + ' ' + str(hh))
w.write(write_str)
w.write('\n')
ss = f.readline()
w.close()
#--------------------生成第一个任务---------------------------
def file_three():
file='学号 + 姓名 + 统计结果(1).txt'
data = pd.read_csv('学号+姓名+结果1.txt',sep=' ',engine='python',encoding='UTF-8')
f=open(file,mode='w+',encoding='utf-8')
camera=[]
for i in data['摄像头编号']:
if i not in camera:
camera.append(i)
for i in camera:
col = data[data["摄像头编号"]==i]
f.write(str(i)+' '+str((col['摄像日期'].value_counts()).shape[0]))
f.write('\n')
cage_id=[]
for i in data['笼号']:
if i not in cage_id:
cage_id.append(i)
for i in cage_id:
col = data[data["笼号"]==i]
f.write(str(i)+' '+str((col['摄像日期'].value_counts()).shape[0]))
f.write('\n')
#--------------------------生成第二个任务-------------------------------
def file_four():
data = pd.read_csv('学号+姓名+结果1.txt', sep=' ', engine='python', encoding='UTF-8') # , header=None不要把第一行作为header,这里需要
file = '学号 + 姓名 + 统计结果(2).txt'
data.sort_values("摄像日期", inplace=True)
df = data[data['摄像日期'] <= 20180204]
f = open(file, mode='w+', encoding='utf-8')
f.write('摄像头编号 笼子编号 时段 变化点数')
f.write('\n')
for index, row in df.iterrows():
print(row["摄像头编号"], row['笼号'], row["时段"], row['变化点数'])
f.write(str(row["摄像头编号"]) + ' ' + str(row['笼号']) + ' ' + str(row["时段"]) + ' ' + str(row['变化点数']))
f.write('\n')
f.close()
#---------------------------------读写获取第三个任务---------------------------
def file_five():
data = pd.read_csv('学号+姓名+结果1.txt', sep=' ', engine='python', encoding='UTF-8') # , header=None不要把第一行作为header,这里需要
file = '学号 + 姓名 + 统计结果(3).txt'
data.sort_values("摄像日期", inplace=True)
df = data[data['摄像日期'] <= 20180204]
f = open(file, mode='w+', encoding='utf-8')
f.write('摄像头编号 笼子编号 日期段 时段 变化点数')
f.write('\n')
for index, row in df.iterrows():
date_period = None
if row['摄像日期'] >= 20180116 and row['摄像日期'] <= 20180122:
date_period = 1
if row['摄像日期'] >= 20180123 and row['摄像日期'] <= 20180129:
date_period = 2
if row['摄像日期'] >= 20180130 and row['摄像日期'] <= 20180204:
date_period = 3
if date_period != None:
f.write(
str(row["摄像头编号"]) + ' ' + str(row['笼号']) + ' ' + str(date_period) + ' ' + str(row["时段"]) + ' ' + str(
row['变化点数']))
f.write('\n')
f.close()
#pandas读写文件,处理数据的效率高,尽量使用pandas的进行输出 df.to_csv('my_csv.csv', mode='a', header=False)
if __name__ == '__main__':
file_one()
file_two()
file_three()
file_four()
file_five()#利用pandas进行日期判断,切片操作