使用Python进行数据清洗工作记录

  • Safecast 数据集介绍
    • 数据初始格式
    • 数据精处理

Safecast 数据集介绍

Safecast由一个公益组织发起旨在让人们关注身边环境的组织而创造的数据集,这个数据集通过众包的方式收集人们周围的辐射值信息然后由服务器汇总处理后显示在地图上,本文旨在处理从safecast官网中下载下来的数据集,去除其中的异型数据,方便进行机器学习操作。

数据初始格式

从官网下载的数据集大小为16G,共有13亿条数据,这些数据的表头如下如下所示:

Captured Time,Latitude,Longitude,Value,Unit,Location Name,Device ID,MD5Sum,Height,Surface,Radiation,Uploaded Time,Loader ID

因为数据量太大,在windows环境中使用split这个工具将打文件切分成小文件,切分后的结果中,除了第一个文件,其余文件都没有带上表头,因此使用如下Python代码为其余的文件加上表头:

 with open(filename, 'r', encoding='ISO-8859-1') as f:content = f.read()f.seek(0,0)f.write("Captured Time,Latitude,Longitude,Value,Unit,Location Name,Device ID,MD5Sum,Height,Surface,Radiation,Uploaded Time,Loader ID\n"+content)

这个数据集使用Loader ID和Device ID 两者作为标记这条数据的用户标记,跑过代码发现Loader ID和Device ID在同一条数据之中并不会同时存在,因此我们根据Loader ID和Device ID作为用户的ID标识。先要进行一次去重处理,因为可能存在Loader ID和Device ID相同的状况:以下代码求出两个表头下的最大数值:

#!/usr/bin/python
# -*- coding:utf-8 -*-
# coding:utf-8import pandas as pd
import numpy as npnumL = 0
numD = 0
for i in range( 135):# if(i == 0):# continuefilename = 'measurements-out_'+str(i)+'.csv'print(filename)data = pd.read_csv(filename, usecols=['Loader ID', 'Captured Time', 'Latitude', 'Longitude','Value', 'Unit', 'Device ID'],encoding='ISO-8859-1')# pd.to_numeric(data['Device ID'], errors='coerce').fillna(0)order = ['Device ID', 'Captured Time', 'Latitude', 'Longitude','Value', 'Unit']data1 = data[order]data1['Device ID'] = pd.to_numeric(data1['Device ID'], errors = 'coerce')data2.dropna(axis = 0, how = 'any',subset = ['Loader ID','Captured Time','Latitude','Longitude','Value','Unit'], inplace = True)if(len(data2['Loader ID']) != 0):data2['Loader ID'] = data2['Loader ID'].astype(int)if(len(data1['Device ID']) != 0):D = np.argmax(data1['Device ID'], axis = 1)else:D = 0if(D > numD):numD = Dif(len(data2['Loader ID']) != 0):L = np.argmax(data2['Loader ID'], axis = 1)else:L = 0if(L > numD):numL = L#print("numD = " + str(numD))print("numL = " + str(numL))
print("numD = " + str(numD))

数据精处理

在获得了两个label下的最大value之后,接着来转换每个数据集中的数据的格式,具体运行代码如下所示:

# -*- coding:utf-8 -*-
import pandas as pd
from datetime import datetime
from datetime import timedelta
from timezonefinder import TimezoneFinder
import numpy as np
import datetime
from pytz import timezonedef datetime_as_timezone(date_time, time_zone):if(time_zone == None):return date_timetz = timezone(time_zone)utc = timezone('UTC')if(time_zone == 'UTC'):return date_timereturn date_time.replace(tzinfo=tz).astimezone(utc)def datetime_to_str(date_time, local):date_time_tzone = datetime_as_timezone(date_time, local)return '{0:%Y-%m-%d %H:%M:%S}'.format(date_time_tzone)def clean_data(filenum):open_file = '/home/tony/data/measurements-out_' + str(filenum) + '.csv'print(open_file)# 读取文件中的几个列data_sum = pd.read_csv(open_file, usecols=['Loader ID', 'Captured Time', 'Latitude', 'Longitude','Value', 'Unit', 'Device ID'], encoding='ISO-8859-1')# 按照要求排序order = ['Loader ID', 'Captured Time', 'Latitude', 'Longitude', 'Value', 'Unit', 'Device ID']data = data_sum[order]# 将loader ID转换为User IDdata.columns = ['User ID', 'Captured Time', 'Latitude', 'Longitude', 'Value', 'Unit', 'Device ID']#删去有缺失值的行data['User ID'] = pd.to_numeric(data['User ID'], errors = 'coerce')data.dropna(axis = 0, how = 'any',subset = ['User ID','Captured Time','Latitude','Longitude','Value','Unit'], inplace = True)#data['User ID']  = data['User ID'].astype(str)data['User ID'] = data['User ID'].astype(int)#获取Loader Id中有值的数据集order2 = ['User ID', 'Captured Time', 'Latitude', 'Longitude', 'Value', 'Unit']data_user = data[order2]#data_user.dropna(axis = 0,how = 'any',  inplace = True)# data_user = data_user.dropna(subset = ['User ID'])order3 = ['Captured Time', 'Latitude', 'Longitude', 'Value', 'Unit', 'Device ID']data_device = data_sum[order3]
# print(data_device)#data_device.dropna(axis = 0, how = 'any', subset = ['Device ID'], inplace = True)data_device = data_device.dropna(subset = ['Device ID'])# 将Device ID 改为 User IDdata_device = data_device.rename(columns={'Device ID':'User ID'})data_device['User ID'] = pd.to_numeric(data_device['User ID'], errors = 'coerce')data_device.dropna(axis = 0, how = 'any',subset = ['User ID','Captured Time','Latitude','Longitude','Value','Unit'], inplace = True)data_device = data_device[order2]data_device['User ID'] = data_device['User ID'].astype(int)data_device['User ID'] = data_device['User ID'].map(lambda x: (x + 985729))# 合并两个表data_user = data_user.append(data_device)# 将表中的User ID都转换为整形data_user['User ID'] = data_user['User ID'].astype(int)# 将列名中的空格由下划线所代替data_user.columns = data_user.columns.str.replace(' ', '_')# 将行中不合法的Caputered Time的数据去掉# 其中取时间范围2011-01-01 到2019-10-01之间的数据data_user[u'Captured_Time'] = pd.to_datetime(data_user[u'Captured_Time'], format='%Y-%m-%d %H:%M:%S',errors='coerce')data_user.dropna(inplace = True)begin_date = pd.to_datetime('2011-01-01 00:00:00')end_date = pd.to_datetime('2018-01-01 00:00:00')data_user = data_user[(data_user[u'Captured_Time'] > begin_date)&(data_user[u'Captured_Time'] < end_date)]# 删除单位不是cpm的行data_user = data_user[data_user['Unit'].isin(['cpm'])]# 增加offset在对应的列的位置data_user['offset'] = Nonedata_user.columns = ['User ID', 'Captured Time', 'Latitude', 'Longitude', 'Value', 'Unit', 'Offset']# 最后用来增加行数在数据集中data_user.to_csv('result.csv', index = False)'''筛选东京和福岛地区的'''#筛选东京地区的数据data1 = pd.read_csv('result.csv')data1 = data1.drop(data1[(data1.Latitude > 36.2) | (data1.Latitude < 34.8) ].index)data1 = data1.drop(data1[(data1.Longitude > 139.8) | (data1.Longitude < 138.4) ].index)data1['ID'] = range(len(data1))order_1 = ['ID','User ID', 'Captured Time', 'Latitude', 'Longitude', 'Value', 'Unit', 'Offset']data1 = data1[order_1]data1.to_csv('Tokyo_'+ str(filenum) +'_.csv', index = False)#筛选福岛地区的数据data2 = pd.read_csv('result.csv')data2 = data2.drop(data2[(data2.Latitude > 37.9766) | (data2.Latitude < 36.7981) ].index)data2 = data2.drop(data2[(data2.Longitude > 141.053) | (data2.Longitude < 139.157983) ].index)data2['ID'] = range(len(data2))order_2 = ['ID','User ID', 'Captured Time', 'Latitude', 'Longitude', 'Value', 'Unit', 'Offset']data2 = data2[order_2]data2.to_csv('Fukushima_'+str(filenum)+'_.csv', index = False)# 转换时区,将所有地区的时间转换为UTC时间# Find timezone based on longitude and latitudetf = TimezoneFinder(in_memory=True)data3 = pd.read_csv('result.csv')#print(len(data3))# 此函数根据经纬度获得节点所在的时区my_func = TimezoneFinder().timezone_at  # Note the no parenthesis on the function call!# 在表中增加一列用来存储转换时间data3['convert_time'] = None#print(data3['Longitude'])num = 0# 获取地一个经纬度所在的时区if(len(data3) == 0):order3 = ['User ID', 'convert_time', 'Latitude', 'Longitude', 'Value', 'Unit']data3 = data3[order3]data3.columns = ['User ID', 'Captured Time', 'Latitude', 'Longitude', 'Value', 'Unit']data3['Offset'] = Nonedata3.to_csv('world_'+str(filenum)+'_.csv',index = False)returnlocal = my_func(lng = data3['Longitude'][0], lat = data3['Latitude'][0])print(data3['Longitude'][0], data3['Latitude'][0], local)# 根据时区转换时间start = datetime.datetime.now()for i in range(len(data3)):if (num == 0):num = data3['User ID'][i]data3['convert_time'][i] = datetime_to_str(datetime.datetime.strptime(data3['Captured Time'][i].split(".")[0],'%Y-%m-%d %H:%M:%S'), local)else:if(num == data3['User ID'][i]):# print(data3['Longitude'][i], data3['Latitude'][i], local)data3['convert_time'][i] = datetime_to_str(datetime.datetime.strptime(data3['Captured Time'][i].split(".")[0].strip(' \t\r\n'),'%Y-%m-%d %H:%M:%S'), local)else:num = data3['User ID'][i]local = my_func(lng = data3['Longitude'][i], lat = data3['Latitude'][i])# print(data3['Longitude'][i], data3['Latitude'][i], local)data3['convert_time'][i] = datetime_to_str(datetime.datetime.strptime(data3['Captured Time'][i].split(".")[0].strip(' \t\r\n'),'%Y-%m-%d %H:%M:%S'), local)end = datetime.datetime.now()print((end - start).seconds)order3 = ['User ID', 'convert_time', 'Latitude', 'Longitude', 'Value', 'Unit']data3 = data3[order3]data3.columns = ['User ID', 'Captured Time', 'Latitude', 'Longitude', 'Value', 'Unit']data3['Offset'] = Nonedata3.to_csv('world_'+str(filenum)+'_.csv',index = False)if __name__== "__main__":for t in range(0,135):clean_data(t)

在精处理的过程中熟悉了pandas库的使用,对于一些库内部的函数有了比较清晰的认识和了解。值得注意的是,timezonefinder只能在python3的环境中运行。

针对safecast数据集的数据清洗相关推荐

  1. 朴素贝叶斯(NaiveBayes)针对小数据集中文文本分类预测

    转自相国大人的博客, http://blog.csdn.net/github_36326955/article/details/54891204 做个笔记 代码按照1 2 3 4的顺序进行即可: 1. ...

  2. 学习weka(2):weka软件使用实例:针对kdd99数据集进行训练和测试

    前言 kdd99 数据集之前介绍过,没有看的可以参考:KDD CUP99数据集预处理(Python实现) 这里拿 kdd99 数据集练练手,主要目的是熟悉一下 weka 的使用. 1.数据集准备 使用 ...

  3. 深度学习-Tensorflow2.2-预训练网络{7}-迁移学习基础针对小数据集-19

    使用预训练网络(迁移学习) 预训练网络是一个保存好的之前已在大型数据集(大规模图像分类任务)上训练好的卷积神经网络 如果这个原始数据集足够大且足够通用,那么预训练网络学到的特征的空间层次结构可以作为有 ...

  4. 爆破登录测试网页_预测危险的地震爆破第一部分:EDA,特征工程和针对不平衡数据集的列车测试拆分

    爆破登录测试网页 介绍: (Introduction:) The seismic bumps dataset is one of the lesser-known binary classificat ...

  5. 泰坦尼克号数据集_机器学习-预测泰坦尼克号生存概率

    一.项目背景概述 泰坦尼克号沉船是历史上最有名的沉船事件之一:1912年4月15日,在她的第一次航行中,泰坦尼克号与冰山相撞后沉没.船上乘客和机组人员2224名,其中1502人死亡.这场耸人听闻的悲剧 ...

  6. 第二章:第一节数据清洗及特征处理-自测

    回顾&引言]前面一章的内容大家可以感觉到我们主要是对基础知识做一个梳理,让大家了解数据分析的一些操作,主要做了数据的各个角度的观察.那么在这里,我们主要是做数据分析的流程性学习,主要是包括了数 ...

  7. AJ-Report 数据源、数据集用法总结

    项目地址:https://gitee.com/anji-plus/report 数据源 配置数据源是获取数据的第一步,项目maven默认只集成了mysql驱动, 发行版lib文件夹中集成了oracle ...

  8. 结构化、非结构化和半结构化数据 数据清洗

    结构化数据 **  结构化数据可以使用关系型数据库来表示和存储,如MySQL.Oracle.SQL Server等,表现二维形式的数据.可以通过固有键值获取相应信息.一般特点是:数据以行为单位,一行数 ...

  9. 图像分类经典项目:基于开源数据集Fashion-MNIST的应用实践

    Datawhale 作者:何新,Datawhale优秀学习者 简介:何新,武汉理工大学硕士 https://github.com/whut2962575697 图像分类是计算机视觉和数字图像处理的一个 ...

最新文章

  1. TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable
  2. 论“性能需求分析”系列专题(一)之 性能需求剖析
  3. python 常用 time, datetime处理
  4. 火柴人小程序linux,火柴人你瞅啥小程序
  5. 设计模式之蝉——代理模式上中
  6. 头条三面: String.valueOf、toString()、(String)强转,有啥区别?
  7. 半小时训练亿级规模知识图谱,亚马逊这个 AI 框架要火!
  8. java基本框架代码_Rxjava 源码系列 - 基础框架分析
  9. zabbix server is not running解决办法
  10. HTTP 的概念、原理、工作机制、数据格式和REST(HenCoder学习总结,待整理中...)
  11. 计算机常见故障判断方法,电脑故障判断-计算机常见故障判断方法
  12. Terrasolid安装
  13. uib-datepicker-popup使用
  14. “开心偷菜”一梦8年终成空,终究还是输给了时间和规则!
  15. phalcon mysql_Phalcon 数据库操作总结
  16. 打印一本400页的书多少钱?哪里打印书本比较便宜
  17. 【VOLTE】VOLTE的注册和去注册过程
  18. CVF2020邻域自适应/语义分割:FDA: Fourier Domain Adaptation for Semantic SegmentationFDA:用于语义分割的傅立叶域自适应算法
  19. 创建两个线程,其中一个输出1-52,另外一个输出A-Z。输出格式要求:12A 34B 56C 78D 依次类推
  20. 百分点技术负责人:我们为什么需要大数据操作系统

热门文章

  1. 摄像头参数D、H、V 分别代表的意思
  2. 汽车之家运维团队倾力打造的配置管理系统AutoCMS
  3. Centos7 配置阿里云的 base 和 epel 源
  4. 他司四大名著(zz)
  5. 神奇粪菌移植技术挽救垂危妙龄女
  6. 计算机学院年会,我校计算机学院应邀出席全国职业院校计算机系主任年会并作报告...
  7. 《数据结构实践》设计报告---迷宫求解
  8. 人行征信第三张报告的信息提取
  9. 一、JDK 1.8源码分析-源码结构介绍篇
  10. 【python】argv的用法