寒假的练习任务
寒假学习了Python数据分析基础这本书,然后在学习完之后为了检验学习进度,布置了分析10万条数据的任务。
要求是这样的:
数据样例:
18 Jogging 102271561469000 -13.53 16.89 -6.4
18 Jogging 102271641608000 -5.75 16.89 -0.46
18 Jogging 102271681617000 -2.18 16.32 11.07
18 Jogging 3.36
18 Downstairs 103260201636000 -4.44 7.06 1.95
18 Downstairs 103260241614000 -3.87 7.55 3.3
18 Downstairs 103260321693000 -4.06 8.08 4.79
18 Downstairs 103260365577000 -6.32 8.66 4.94
18 Downstairs 103260403083000 -5.37 11.22 3.06
18 Downstairs 103260443305000 -5.79 9.92 2.53
6 Walking 0 0 0 3.214402
处理一:
将数据中所有的行信息有问题的那行信息删除,如样例中第四条数据
这一行数据只有三个元素,而其他行都有六个元素,所以删除第四条即可
再如最后一行第三个信息明显有问题所以该行也是问题行,删除即可
其他问题自己去找
将全部数据处理完之后,每行单个元素以逗号为分隔,写入文件test1
test1中样例:
6,Walking,23445542281000,-0.72,9.62,0.14982383,
6,Walking,23445592299000,-4.02,11.03,3.445948,
6,Walking,23470662276000,0.95,14.71,3.636633,
这个处理一要求的是将数据样例中的错误信息删除,错误有两处,第一就是有的数据只有3行,第二就是有的数据从第三行开始都是0。这就是这个数据处理中的第一步,代码如下`
#!/usr/bin/env python3
import sys
import csv
input_file=sys.argv[1]
output_file=sys.argv[2]
a_len=6
with open(input_file,'r',newline='')as csv_in_file:
with open(output_file,'w',newline='')as csv_out_file:
filereader=csv.reader(csv_in_file,delimiter=' ')
filewriter=csv.writer(csv_out_file)
for row_list in filereader:
if len(row_list) == a_len and row_list[2] != '0':
filewriter.writerow(row_list)
思路很简单,先看正常数据它的长度为6,那我我给他定义一个a_len=6,然后在数据中循环,如果等于6那么就输出,如果小于6那么就不输出,这样便可以清理掉第一部分错误数据。然后之前说从第三行开始,数值为0,那么我们就可以让第三行不等于0的数据输出,这样处理一就解决了。而要注意的是首先0在这里不是数字0,而是‘0’,如果你按照数字0来处理的话,是解决不了的,其次注意的是row[2]代表的意思是第3行,因为他是从0算起的。最后也是最重要的,是我刚开始做怎么也得不到正确的答案的地方,就是delimiter,delimiter=‘,’是默认分隔符,所以如果你的输入文件和输出文件都是用逗号分隔的,就不需要这个指定参数。而这个初始数据是以空格分隔得,所以必须要delimiter=‘ ’,才可以正常输出。
处理二:
将test1数据中所有动作的数目统计出来,将动作数目打印到屏幕,
后将动作数目变为100的倍数,多余的删除,
比如你统计出Jopping地数量为3021次
那么打印出3021后只往文件写入3000条,写入文件test2
处理二是让将所有的动作数据统计出来,并且变为100的倍数输出。这个我分了两步,第一,先统计所有动作的数目,第二,将他们变为100的倍数输出。
import csv
input_file="text1answer.csv"
output_file="text2.csv"
with open(input_file ,'r',newline='')as csv_in_file:
with open(output_file,'w',newline='')as csv_out_file:
filereader = csv.reader(csv_in_file)
a_dict={}
for row in filereader:
if row[1] in a_dict.keys():
a_dict[row[1]]+=1
else:
a_dict[row[1]]=1
for values in a_dict.keys():
print(values," : ",a_dict[values])
这行代码的意义便是将所有动作的数目统计出来并打印出来。这个代码很好想,不好想的是接下的步骤。
import csv
input_file="text1answer.csv"
output_file="text2.csv"
a_dict={"Walking":[0, 35000],"Jogging":[0, 31200],"Sitting":[0, 6500],"Upstairs":[0, 10400],"Downstairs":[0,9400],"Standing":[0,7700]}
with open(input_file, 'r', newline='')as csv_in_file:
with open(output_file, 'w', newline='')as csv_out_file:
filereader=csv.reader(csv_in_file)
filewriter=csv.writer(csv_out_file)
for row in filereader:
if row[1] in a_dict.keys():
a_dict[row[1]][0]+=1
if a_dict[row[1]][0] <= a_dict[row[1]][1]:
filewriter.writerow(row)
这行代码就是将动作统计出来后变为100的倍数,举个例子,walking的数目是35012,那他100的整数倍就是35000,这就是要统计walking的最后一个值,就这样以此类推,得到了处理二所要的结果,这里重点说的是keys()函数,它的意义是返回一个由字典所有键构成的列表,如果忘掉了这个函数,那么这个题很难做出来。