寒假数据处理任务总结

任务描述

本次任务要处理的数据共101227行,样例如下:

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

Step 1

将数据集中所有信息异常的行删除。
比如上面的样例中第4行数据只有3个元素,而其他行都有6个元素,所以第4行是信息异常的行,将其删除。再如第12行数据的第3个元素明显也是有问题的,所以它也是信息异常的行,将其删除。
数据集中可能还会存在一些其他异常。
将全部信息处理之后,每行的元素以逗号为分隔符,写入文件test1
文件test1共100471行,样例如下:

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
...
Step 1思路

这一个问题类似于书中讲到的筛选特定行。 这类处理异常行的操作思路基本上是大同小异的。以每行的特征为判断依据。例如,在本任务中,第一个特征就是,每一行有六个元素,所以少于六个元素的行即为异常行;第二个特征就是,通过观察,每一行第三个元素不为零,所以在该位置上元素为零的行为异常行。

test1.py实现
#!/usr/bin/env/ python3

import csv

with open('OriginalData.csv', 'r', newline='') as csv_in_file:
    with open('test1_1.csv', 'w', newline='') as csv_out_file:
        filereader = csv.reader(csv_in_file)
        filewriter = csv.writer(csv_out_file)
        for row_list in filereader:
            if len(row_list) == 6 and int(row_list[2]) != 0:
                filewriter.writerow(row_list)
test1.py注释
with open('OriginalData.csv', 'r', newline='') as csv_in_file:
    with open('test1_1.csv', 'w', newline='') as csv_out_file:
        filereader = csv.reader(csv_in_file)
        filewriter = csv.writer(csv_out_file)

这部分代码就是运用with语句和csv模块函数创建输入输出文件对象。

for row_list in filereader:
            if len(row_list) == 6 and int(row_list[2]) != 0:
                filewriter.writerow(row_list)

这三行是step1的核心处理代码,在遍历每一行代码的同时,运用核心特征去筛选符合条件的行,并将其写入输出文件。

test1.csv

在这里插入图片描述
记事本格式

Step 2

统计文件test1的数据中所有动作的数目并打印到屏幕,然后将动作数目对100取整后写入test2文件,多余的信息行抛弃。比如统计出Jogging的数量为3021次,则在屏幕上打印Movement: Jogging Amount: 3021,然后将前3000行信息写入test2文件。 文件test2共100200行。

Step 2思路

小编认为Step 2核心思路在于字典的运用。字典是一种动态结构,可以随时添加键值对。正因如此,在统计动作数目时,可以将动作与之数目构建成键值对。在将取整后的数据写入输出文件时,亦可使用字典的方法,因为此时动作与其数量是紧密相连的。

test2.py实现
#!/usr/bin/env/ python3

import csv

motion_dict = {}

with open('test1.csv', 'r', newline='') as csv_in_file:
    with open('test2_1.csv', 'w', newline='') as csv_out_file:
        filereader = csv.reader(csv_in_file)
        filewriter = csv.writer(csv_out_file)
        for row in filereader:
            motion_dict[row[1]] = motion_dict.get(row[1],0)+1
        for motion, motion_dict[motion]  in motion_dict.items():
            print('Movement: %5s\t'% motion, end= '')
            print('Amount: %d'%motion_dict[motion])
        for motion in motion_dict.keys():
            motion_dict[motion] = motion_dict[motion] // 100 * 100
with open('test1.csv', 'r', newline='') as csv_in_file:
    with open('test2_3.csv', 'w', newline='') as csv_out_file:
        filereader = csv.reader(csv_in_file)
        filewriter = csv.writer(csv_out_file)
        motion_dict_1 = {'Walking': 0, 'Jogging': 0, 'Sitting': 0, 'Upstairs': 0, 'Downstairs': 0, 'Standing': 0}
        for row in filereader:
            if row[1] in motion_dict_1.keys():
                motion_dict_1[row[1]] += 1
                if motion_dict_1[row[1]] <= motion_dict[row[1]]:
                    filewriter.writerow(row)
test2.py注释
motion_dict = {}

这一行代码建立了用于统计动作的字典。

 for row in filereader:
            motion_dict[row[1]] = motion_dict.get(row[1],0)+1

这两行代码,是对每种动作数量进行统计。在遍历输入文件的每一行的同时,进行键值对的添加。row[1]是每一行第二个元素,即为动作的名称。在这里运用了字典中get函数的方法进行数据统计。在这里简单介绍一下,get函数的用法。get函数的本质是通过键访问对应的值。

dict.get(key,default)

例如,运用get函数取处理dict字典。get函数的第一个参数key为要查找的键,当key存在于dict字典中时,返回其对应的键值,而当其不存在时,则返回第二个参数default。

 for motion in motion_dict.keys():
            motion_dict[motion] = motion_dict[motion] // 100 * 100

这部分代码是处理将动作数目对100取整,在这里需要清楚运算符的应用。

 motion_dict_1 = {'Walking': 0, 'Jogging': 0, 'Sitting': 0, 'Upstairs': 0, 'Downstairs': 0, 'Standing': 0}

这一行代码建立了动作字典的一个副本,用于辅助判断写入输出文件的动作数目。

for row in filereader:
            if row[1] in motion_dict_1.keys():
                motion_dict_1[row[1]] += 1
                if motion_dict_1[row[1]] <= motion_dict[row[1]]:
                    filewriter.writerow(row)

最后这部分代码实现了控制数量写入输出文件的功能。通过对每行动作的判断,在动作字典的副本中,进行数据统计并写入输出文件,当动作数量达到所要求的上限时则停止写入。

test2.csv

在这里插入图片描述
在这里插入图片描述

Step 3

读取文件test2的数据,取每行的后3列元素,以空格为分隔符写入文件test3
文件test3共100200行,样例如下:

-0.72 9.62 0.14982383
-4.02 11.03 3.445948
0.95 14.71 3.636633
...
Step 3思路

这一step与书中的筛选特定列思路相似,可以运用列索引值进行列的筛选。当然在写入输出文件时,需要注意以空格为分隔符。

test3.py实现
#!/usr/bin/env python3

import csv
import sys

my_column = [3,4,5]
with open('test2.csv', 'r', newline='') as csv_in_file:
    with open('test3.csv', 'w', newline='') as csv_out_file:
        filereader = csv.reader(csv_in_file)
        filewriter = csv.writer(csv_out_file, delimiter=" ")
        for row in filereader:
            row_list_output = []
            for index_value in my_column:
                row_list_output.append(row[index_value])
            filewriter.writerow(row_list_output)
test3.py注释
my_column = [3,4,5]

这一行代码,创建了需要保留列的列表,并写入需保留列的索引值。

filewriter = csv.writer(csv_out_file, delimiter=" ")

这一行代码重点说一下delimiter分隔符的用法。delimiter默认为逗号分隔符。例如将这行代码写成如下:

filewriter = csv.writer(csv_out_file, delimiter=" ,")

其输出文件中的效果与下面一行代码相同:

filewriter = csv.writer(csv_out_file)

这二者的输出文件效果如下图:
在这里插入图片描述
在这里插入图片描述

如果想要以空格为分隔符,那么需要将代码写成如脚本中所示。其输出文件效果如此:
在这里插入图片描述
在这里插入图片描述
很明显看见这两者的差别,其本质原因是脚本是按照行中的逗号进行分析数据的。

 for row in filereader:
            row_list_output = []
            for index_value in my_column:
                row_list_output.append(row[index_value])
            filewriter.writerow(row_list_output)

这一部分代码,是逐行逐列将想要保留的行写入输出文件。

test3.csv

在这里插入图片描述
在这里插入图片描述

Step 4

读取文件test3的数据,每行数据为一组,每组组内的元素以空格为分隔符,组与组之间的数据以逗号为分隔符,每20组元素为一行,写入文件finally
文件finally共5010行,样例如下:

-0.72 9.62 0.14982383,-4.02 11.03 3.445948,0.95 14.71 3.636633,-3.57 5.75 -5.407278,-5.28 8.85 -9.615966,-1.14 15.02 -3.8681788,7.86 11.22 -1.879608,6.28 4.9 -2.3018389,0.95 7.06 -3.445948,-1.61 9.7 0.23154591,6.44 12.18 -0.7627395,5.83 12.07 -0.53119355,7.21 12.41 0.3405087,6.17 12.53 -6.701211,-1.08 17.54 -6.701211,-1.69 16.78 3.214402,-2.3 8.12 -3.486809,-2.91 0 -4.7535014,-2.91 0 -4.7535014,-4.44 1.84 -2.8330324
Step 4思路

如果理解了step3的格式内涵,step4就可以想到运用“大列表套小列表”的思想,当然此小列表非彼小列表,当然还需要一些处理操作。

test4.py实现
#!/usr/bin/env/ python3

import sys
import csv

with open('test3.csv', 'r', newline='') as csv_in_file:
    with open('test4.csv', 'w', newline='') as csv_out_file:
        filereader = csv.reader(csv_in_file)
        filewriter = csv.writer(csv_out_file)
        all_data = []
        row_data = []
        output_list = []
        sum = 0
        for row in filereader:
            row_str = ''.join(row)
            all_data.append(row_str)
        for data in all_data:
            if sum < 19:
                row_data.append(data)
                sum += 1
            else:
                row_data.append(data)
                output_list.append(row_data)
                row_data = []
                sum = 0
        for row_list in output_list:
            filewriter.writerow(row_list)

test4.py注释
 all_data = []
 row_data = []
 output_list = []
 sum = 0

all_data = [ ]相当于刚刚提到的大列表,那么小列表就是test3文件中的每一行,其实就是第一列每一个单元格。 row_data = [ ]用于暂时存放,每一组元素。 output_list = [ ]是存放test4的每一行的列表。

 for row in filereader:
            row_str = ''.join(row)
            all_data.append(row_str)

这部分代码是将test3的每一行进行字符化操作,然后添加进add_data列表中。但这里需要注意一点,添加进该列表中的元素应该是字符串形式,而不是列表形式。如果是列表形式,那么最后的输出文件格式就不符合题意了。如图:

在这里插入图片描述
在这里插入图片描述

 for data in all_data:
            if sum < 19:
                row_data.append(data)
                sum += 1
            else:
                row_data.append(data)
                output_list.append(row_data)
                row_data = []
                sum = 0

这部分代码是对all_data列表进行遍历,每20组为一行,添加入output_list列表中。

test4.csv

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值