精华内容
下载资源
问答
  • 2021-06-05 11:03:35

    内容介绍

    数据分析师的 全部文章目录

    看懂Python数据分析师,清华大学技术顾问带你一起从零做起

    本文介绍 Python数据分析师 统计学中需要掌握数据种类方面的知识。

    不懂统计学的数据分析师都不是好的数据分析师,多数的数据分析师课程都讲Python的应用,又不是开发代码敲的那么好有什么用?不学统计的知识是没有办法做数据分析师的,本专栏的文章主要以概念和应用举例为主,跳过能让人劝退的学术推导的内容,让大家在愉快中学习统计知识。

    可以学习到以下知识:

    1. 分类数据和数值型数据的区分和判断。
    2. 分类数据和数值型数据的互相转化。

    分类数据和数值数据

    俗称离散型数据(分类数据)、连续型数据(数值数据)。

    例如一份问卷调查中

    更多相关内容
  • 最新版U盘数据恢复大师含注册码new

    千次下载 热门讨论 2013-09-17 11:59:41
    希望能对您有帮助,如果不是您想要的,也请您嘴下留情。eagle_wcy在此谢谢大家。 运行PowerDataRecovery,点注册,将KEY内的注册码复制到框内,注册成功后,执行下面步骤: 1. 请使用 Power Data Recovery的高级恢复...
  • 数据可视化主要是指借助于图形化手段,清晰有效地传达与沟通信息。简单来说,就是将数据进行图形化的表达。 相信很多人都看过可视化图表,如果没看过,上百度输入关键词“数据可视化”,可以搜到一大堆像下图这样的...

    文 | 利兄

    源 | 利兄日志

    数据可视化主要是指借助于图形化手段,清晰有效地传达与沟通信息。简单来说,就是将数据进行图形化的表达

    相信很多人都看过可视化图表,如果没看过,上百度输入关键词“数据可视化”,可以搜到一大堆像下图这样的可视化图表。

    如何用PPT制作一份可视化数据图表?

    如何用PPT制作一份可视化数据图表?

    如何用PPT制作一份可视化数据图表?

    看到这些图表,是不是觉得特别酷,想自己动手也做一个。但又感觉很难,不知道如何下手。

    之前,有分享过一篇文章,关于用报表工具FineReport制作数据可视化大屏《可视化大屏做成这样,领导不重视你都难》,今天突发奇想,如果用PPT做是否也会有同样的效果。

    所以这篇文章我们来聊聊如何用PPT制作一个可视化的数据图表。注意是用PPT制作,而不是借助第三方的绘图网站。

    现在,我们仔细看看这些可视化图表,他们是不是都是由一个个简单的折线图,柱状图,饼图,条形图,地图、表格等组成。

    如何用PPT制作一份可视化数据图表?

    所以,只要我们学会制作这些单独的图表,然后将他们放到一页PPT里面,是不是就可以组成一个很酷的可视化数据图表。

    可能很多人又有疑问了,为什么这些图表里面的折线图和柱状图这么好看,我们自己做的却很难看。

    如何用PPT制作一份可视化数据图表?

    如何用PPT制作一份可视化数据图表?

    是的,如果你不懂PPT图表美化,你做出来的,可能就是上面这样的。所以,我们必须要学习如何美化和设计PPT图表。

    01

    条形图的美化

    我们先来看看条形图的美化设计,比如下面这个条形图。

    我们如何设置条形图中色块的颜色?如何让所有的系列毫无缝隙的连在一起?

    如何用PPT制作一份可视化数据图表?

    操作都比较简单,条形图内部的颜色变化主要是因为设置了渐变填充,只要我们设置好方向和渐变光圈就可以了。

    如何用PPT制作一份可视化数据图表?

    所有数据毫无缝隙的连在一起,是因为我们设置了数据在间隙宽度,这个在数据系列格式的系列选项中可以看到。

    本来系统默认的是100%,只要我们设置为0%,数据之间的缝隙也就消失了。

    如何用PPT制作一份可视化数据图表?

    关于折线图的更多有趣玩法,在之前的文章中我都有讲,大家可以往前翻一翻。

    02

    折线图的美化

    我们再来看看折线图的美化设计,比如下面这个条形图。

    我们如何将折线图的线条变为虚线?如何更改折线图中标记的大小?如何将笔直的折线变成圆滑的曲线?

    如何用PPT制作一份可视化数据图表?

    设置比较简单,只要我们选中数据,然后右键设置数据系列格式,在跳出的窗口里,我们找到填充选项。

    里面左侧是线条,我们可以在里面设置线条的粗细,类型,填充的颜色,还可以将直线变成曲线

    右侧的标记,就是折线图上面的点,我们也可以设置它填充的颜色和大小

    如何用PPT制作一份可视化数据图表?

    解锁更多折线图的新技能,可以翻看以前的文章或者看我的视频教程。

    03

    柱状图的美化

    我们再来看看柱状图的美化设计,比如下面这个柱状图。我们是如何在上面加一个对比背景的?

    如何用PPT制作一份可视化数据图表?

    这并不是用形状工具画上去的,而是我们给原有数据添加的一组参考数据。

    我打开原始数据的EXCEL表格,可以看到,我们在月份和销售额之间添加了一组参考数据,这个数据就是右侧的深蓝色,它本身的是不存在的,只是作为参考而设置的。

    如何用PPT制作一份可视化数据图表?

    虽然作为参考,但是两组是如何合并到一起的呢?所以这里我们还需加设置一下数据的系列重叠

    原本是0%,也就是没有重叠,我们需要设置为100%,也就是完全重叠在一起,这样,深蓝色就可以作为浅蓝色的背景了。

    如何用PPT制作一份可视化数据图表?

    04

    圆环图的美化

    我们再来看看饼图或者圆环图的美化设计,比如下面这个圆环图。我们是如何将外面的圆环变成一个一个断开的小色块?

    如何用PPT制作一份可视化数据图表?

    上图有点小,我制作了一个,也就是说,我们该如何制作下面这种类型的圆环呢?

    如何用PPT制作一份可视化数据图表?

    思考:我们想要做出由好多色块组成的圆环,最重要的办法就增加数据,数据多了,圆环是不是也就多了,到时候我们只需要分离圆环就可以了。

    所以,第一步,我们先插入圆环图,然后打开图表的原始数据编辑区,将数据增加至20个,然后将数据的值,统一改成5。

    如何用PPT制作一份可视化数据图表?

    第二步,选择图表,设置数据系列格式,打开一个窗口,我们在这里设置圆环图的分离程度以及圆环内径的大小。

    如何用PPT制作一份可视化数据图表?

    第三步,选择图表,更改圆环的整体颜色,双击某个色块,可以单独更改局部颜色。

    05

    面积图的美化

    我们再来看看面积图的美化设计,比如下面这个面积图。我们是如何制作的?

    如何用PPT制作一份可视化数据图表?

    仔细观看这个数据图表,可以发现,这个图表由一个折线图和一个面积图组成。而且两者的数据是一样的,面积图只是作为折线图的参考数据存在。

    如何用PPT制作一份可视化数据图表?

    折线图的美化,可以参考上面的第二部分。而面积图,这里主要设置了渐变填充,只需要打开数据系列格式就可以设置。

    如何用PPT制作一份可视化数据图表?

    上面这些只是单独的图表美化,制作一个可视化的数据图,我们还需要按照一定的排版原则,将他们放到一起。

    这样,就可以得到下面这样一个可视化的数据图表。

    如何用PPT制作一份可视化数据图表?

    我这里制作的还不是完美版,仍然还有很多细节需要完善!

    总结

    总结下来,用PPT做这样的数据可视化也能实现,背景图什么的可以在PS里面修饰。但整体做下来,感觉自己成了一个美工(苦笑),侧重于“可视化”,而不是数据。更着重于数据的静态展现,且前提是数据已经在Excel中统计分析汇总好。所以,大家如果在实际工作中有需要,还是老老实实用BI工具或撸代码实现吧!

    以上的内容还不是完美版,仍然还有很多细节需要完善,提供一个思路,大家可自行研究!

    如果喜欢,记得收藏转发一下哦!

    展开全文
  • 前言 如果你有什么问题,希望跟我能够一起交流,除了通过博客交流外,欢迎你加入我的...YOLO有自己训练好的数据集,在YOLO v2 中,数据集可检测的类别达9000种以上,但是9000毕竟不是全部,它能涵盖大部分的物体识...

    前言

    如果你有什么问题,希望跟我能够一起交流,除了通过博客交流外,欢迎你加入我的QQ群,一起交流有关于机器学习、深度学习、计算机视觉有关内容。目前我并未确定具体的研究方向,所以现在 处于广泛涉猎阶段,希望我们能够一起沟通。下图是我的群二维码:

    一、综述

    YOLO有自己训练好的数据集,在YOLO v2 中,数据集可检测的类别达9000种以上,但是9000毕竟不是全部,它能涵盖大部分的物体识别,但是可能对于某些用户来说是不够的,所以我们需要学习它的数据集制作方法。

    我把数据集分为以下几个部分:

    1.数据集的搜集,这一部分主要是在网上搜集整理相关数据集的图片,比如我要做某种猫的数据集,我需要上网上查找这种猫的图片;我需要做自己做的手工艺品的数据集,那我需要自己拍摄等等。

    2.数据集的标注,计算机去认识一个物体,需要人去告诉他,哪个物体,是什么。就像我们在小时候,我们的父母会一点一点耐心教我们,什么是桌子,什么是椅子,什么是筷子,什么是树,什么是花……数据集的标注就是一个“教授”的过程。

    3.数据集的训练,不是别人一教,你就能学会的,你需要不断地练习,比如说话,小时候父母不厌其烦的教我们;比如写汉字,中国人最应该骄傲的就是我们学会了世界上最难的一门语言,并且能够熟练应用。这就是因为我们从上学开始,老师就教我们写字,一写就是好几十遍……计算机也是如此,想让计算机明白什么是花,什么是自行车,就要让他“训练”,让他学会。

    4.数据集的应用,我们学会说话,学会认识物体,目的就是为了应用,学会说话,我们可以交流,认识自行车,是我们能够方便交通……数据集也一样,训练好的数据集的目的就是为了应用,或者说,我们训练数据集是因为我们需要应用这个数据集,例如,我们需要检测人流量,首先我们需要识别人,当然现在就有很多人体识别的算法,如果我们要采用数据集来识别,我们需要先制作一个数据集,然后在应用数据集完成我们需要的功能。在我写的第一篇YOLO博客:《【YOLO学习笔记】之YOLO初体验》中就是对数据集的一个简单应用。

    在这篇博客中,主要讲述前两个方面:数据集搜集 数据集标注

    首先先声明几个问题,希望大家注意:

    1.我的所有操作都是在Windows系统上,不是Linux,不会Linux系统的同学无需担心。

    2.在图片搜集过程中,我用到了OpenCV和C++语言,用的是VS2015编辑器。相关安装教程请看:《【opencv学习笔记】001之opencv配置(win10+VS2015+OpenCV3.1.0)》,关于OpenCV版本,希望大家暂时使用3.4.0以内,3.0.0以上,防止出现因为版本问题引发的错误。我处理的是OpenCV获取的摄像头的视频,如果大家是自己下载的视频,对代码做一些简单修改就好。

    3.在图片标注过程中,我用到的软件是LabelImg,下载地址。有需要的同学自行下载。这个软件的好处是大家可以直接打开使用,无需要其他操作,以前有一种方法是用Python去操作,会有各种报错,比较麻烦,咱们用LabelImg的目的是为了做数据集,而不是为了去排错

    二、数据集搜集

    爬虫是个好东西,你要学着用,如果你会爬虫,会数据清洗,数据集搜集对你来说就是小kiss,当然这个难度是比较大的,我支持大家在学习人工智能的同时懂一点大数据,懂一点爬虫。但是我更希望大家如果真的想进军人工智能,那就专注人工智能,因为人工智能也是一个很庞大的体系,其他领域要广涉猎,但是不要学太深,专注最重要。剩下的靠团队协作,木桶原理依然很重要,但是内容要变一变:一个团队是一个木桶,这个木桶能盛多少水,一方面要看每一块木板是不是完好无损,这块木板有多长,另一方面要看每一块木板之间的契合度如何

    我以后可能会讲爬虫,简单的爬虫我们是需要会的,因为我们既要有专长,也要有广泛涉猎。但是在这篇博客中我不会讲,我希望能把这篇博客的重心放在数据集上,而不是爬虫,更不是数据清洗。

    我们在实际应用中,目的是为了识别物体,很少是为了去做一个完善的数据集,很多情况下,我们是在识别固定的几个物体,经常应用于视频实时监测跟踪。所以我讲的这种方法是针对这类情况的,因为这种情况应用在目前来说更为广泛。

    所以我们需要的是在视频中将包含所要截取的图片弄出来,为了做测试,我只好用自己的“丑照”,还可能有各种各样稀奇古怪的表情,还希望大家能够谅解。

    在学习之初,大家可以下载一段电影(录屏也可以),或者自己拍摄一段视频,这段视频中要有你的目标,现在,我假设你已经有一个后缀名为mp4的视频文件,并且,视频文件中已经有你的目标。

    接下来,我们需要对视频做处理,每隔几秒,或者几毫秒(大家根据自己的电脑性能做调整)截取一张包含目标的图像。(在OpenCV中,用帧来计数,所以用帧来控制截取速度)

    这段代码比较简单,我就直接在下面写出来,重要位置会加上注释。。

    #include"stdafx.h"
    #include<iostream>
    #include<opencv2\opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main()
    {
    	Mat frame;
    
    	int num = 0;
    	int n = 1;
    	string filename;
    
    	string Imagespath = "E:/img/";    // 保存图片的文件夹路径一定要有,因为OpenCV不会自动创建文件夹  
    	VideoCapture capture(0);//读取视频,存放视频的绝对路径
    
    	while (true)
    	{
    		capture >> frame;//将视频读入mat对象
    
    		if (frame.empty())
    		{
    			printf("read video error");
    			system("pause");
    		}
    		 /**************************定位验证**********************************/
    		rectangle(frame, Point(100,0), Point(580,480), Scalar(0, 0, 255), 1, 8, 0);
    		imshow("video", frame);
    		
    		/*********************保存图片*************************************/
    
    		//int_to_string
    		string string_temp;
    		stringstream stream;
    		stream << n;
    		string_temp = stream.str();
    
    		filename = Imagespath + string_temp + ".jpg";
    		num++;
    		if (num >= 3)//确定多少帧截取一张图片,10就是10帧截取一张
    		{
    			//截取指定位置
    			Rect rect(100, 0, 480, 480);//左上顶点坐标,宽高
    
    			Mat image_roi = frame(rect);
    
    			//可以在这加入仿射变换
    
    			cout << "now is writing:" << string_temp << ".jpg" << endl;
    			imwrite(filename, image_roi);
    			num = 0;
    			n++;
    		}
    		waitKey(30);
    
    	}//while()
    	return 0;
    }
    

    得到的图片如下

     注意,名字要从1开始一直往后,如果大家自己找的图片,不是这样批量生成的,大家可以用看图软件批量修改名称,小编用的是2345看图王。然后将图片放在一组文件夹下面,具体如下:

    在VOC 2018文件夹下有五个文件夹,搜集好的图片放在JPEGImages文件夹下;标注后数据保存在Annotations文件夹下;labels文件夹在数据集的训练时用到;在ImageSets文件夹下有下面三个文件夹,在Main文件夹中有一个train.txt文件,后面数据集训练会详细讲解。

    三、数据集标注

    接下来就是对20个图片做标注了,这一步,需要大家细心,一个图片都不能少,20个还好,如果是好几千甚至几万呢?

    我们用到的软件是LabelImg。

    大家直接点击打开使用即可。

    它会自动运行一个黑窗体,然后打开软件,不需要大家自己编译运行,不用担心有代码错误的问题。我个人习惯最大化,大家根据自己习惯调节。

    一般情况下,我们只需要做如下几个步骤。

    1.打开图片所在文件夹。选择图片文件夹,就会在右下角显示文件夹下所有的图片。

    2.修改输出文件夹,报错标注数据。

    3.图片标注。

    输入法切换为英文,然后按“W”,会出现下面的十字。

    然后按住鼠标左键,拖动,直到将全部目标包括在内,注意,选择区域尽量小。

    放开鼠标就是下面的样子,在文本框中输入目标名称,例如:head。

    在右上角就会多一个类别:

    然后依次点击-save保存-Next Image下一张

    再次按W的时候,他会显示,默认为head,如果你有多个类别,那就从下面选择即可。

    然后一直重复:W - 鼠标选择 - save - next image ;直到所有都标注完成。

    标注完成后,就会在Annotations文件夹下产生如下的xml文件。

    打开这个文件,就可以看到保存的就是我们标注好的信息。任意打开一个,文件内容如下:

     

    展开全文
  • 数据清洗- Pandas 清洗“脏”数据(一)

    万次阅读 多人点赞 2018-10-16 17:26:25
    Pandas 是 Python 中很流行的类库,使用它可以进行数据科学计算和数据分。他可以联合其他数据科学计算工具一块儿使用,比如,SciPy,NumPy 和 Matplotlib,建模工程师可以通过创建端到端的分析工作流来解决业务问...

    概要

    • 准备工作
    • 检查数据
    • 处理缺失数据
    • 添加默认值
    • 删除不完整的行
    • 删除不完整的列
    • 规范化数据类型
    • 必要的转换
    • 重命名列名
    • 保存结果
    • 更多资源

    Pandas 是 Python 中很流行的类库,使用它可以进行数据科学计算和数据分。他可以联合其他数据科学计算工具一块儿使用,比如,SciPy,NumPy 和
    Matplotlib,建模工程师可以通过创建端到端的分析工作流来解决业务问题。

     

    虽然我们可以 Python 和数据分析做很多强大的事情,但是我们的分析结果的好坏依赖于数据的好坏。很多数据集存在数据缺失,或数据格式不统一(畸形数据),或错误数据的情况。不管是不完善的报表,还是技术处理数据的失当都会不可避免的引起“脏”数据。

     

    庆幸的是,Pandas 提供功能强大的类库,不管数据处于什么状态,他可以帮助我们通过清洗数据,排序数据,最后得到清晰明了的数据。对于案例的数据,准备使用
    movie_metadata.csv(链接: https://pan.baidu.com/s/1i673EsPLY2iSQWXwKO_E_w 密码: dvqqhttps://pan.baidu.com/s/1i5zUvOD)。这个数据集包含了很多信息,演员、导演、预算、总输入,以及 IMDB 评分和上映时间。实际上,可以使用上百万或者更大的数据库,但是,案例数据集对于开始入门还是很好的。

     

    不幸的是,有一些列的值是缺失的,有些列的默认值是0,有的是 NaN(Nota Number)。

    下面我们通过使用 Pandas 提供的功能来清洗“脏”数据

     

    准备工作

    首先,第一次使用 Pandas 之前,我们需要安装 Pandas。安装命令如下:

    pip install pandas
    

    接下来,导入 Pandas 到我们的代码中,代码如下:

    #可以使用其他的别名, 但是,pd 是官方推荐的别名,也是大家习惯的别名
    import pandas as pd
    

    最后,加载数据集,代码如下:

    data = pd.read_csv('../data/tmdb_5000_credits.csv')
    

    注意,确保已经下载数据集,如果你的代码和数据集的存放结构与我的一样,直接运行就可以

    否则,要根据实际的情况,修改 read_csv() 的文件路径

     

    检查数据

    检查一下我们刚刚读入数据的基本结构,Pandas 提供了 head() 方法打印输出前五行数据。目的是让我们对读入的数据有一个大致的了解。

    data.head()

    我们可以通过上面介绍的 Pandas 的方法查看数据,也可以通过传统的 Excel 程序查看数据,这个时候,我们可以开始记录数据上的问题,然后,我们再想办法解决问题。

    Pandas 提供了一些选择的方法,这些选择的方法可以把数据切片,也可以把数据切块。下面我们简单介绍一下:

    • 查看一列的一些基本统计信息:data.columnname.describe()
    • 选择一列:data['columnname']
    • 选择一列的前几行数据:data['columnsname'][:n]
    • 选择多列:data[['column1','column2']]
    • Where 条件过滤:data[data['columnname'] >
      condition]

     

    处理缺失数据

    缺失数据是最常见的问题之一。产生这个问题可能的原因

    • 从来没有填正确过
    • 数据不可用
    • 计算错误

    无论什么原因,只要有空白值得存在,就会引起后续的数据分析的错误。下面介绍几个处理缺失数据的方法:

    • 为缺失数据赋值默认值
    • 去掉/删除缺失数据行
    • 去掉/删除缺失率高的列

     

    添加默认值

    我们应该去掉那些不友好的 NaN 值。但是,我们应该用什么值替换呢?在这里,我们就应该稍微掌握一下数据。对于我们的例子,我们检查一下“country”列。这一列非常简单,然而有一些电影没有提供地区,所以有些数据的值是
    NaN。在我们的案例中,我们推断地区并不是很重要,所以,我们可是使用“”空字符串或其他默认值。

    data.country= data.country.fillna('')
    

    上面,我们就将“country”整个列使用“”空字符串替换了,或者,我们也可以轻易地使用“None Given”这样的默认值进行替换。如果想了解更多 fillna() 的详细信息参考
    pandas.DataFrame.fillna

     

    使用数字类型的数据,比如,电影的时长,计算像电影平均时长可以帮我们甚至是数据集。这并不是最优解,但这个持续时间是根据其他数据估算出来的。这样的方式下,就不会因为像 0 或者 NaN这样的值在我们分析的时候而抛错。

    data.duration = data.duration.fillna(data.duration.mean())
    

     

    删除不完整的行

    假设我们想删除任何有缺失值得行。这种操作太据侵略性,但是我们可以根据我们的需要进行扩展。

    删除任何包含 NA 值的行是很容的:

    data.dropna()
    

    当然,我们也可以删除一整行的值都为 NA:

    data.dropna(how='all')
    

    我们也可以增加一些限制,在一行中有多少非空值的数据是可以保留下来的(在下面的例子中,行数据中至少要有 5 个非空值)

    data.drop(thresh=5)
    

    比如说,我们不想要不知道电影上映时间的数据:

    data.dropna(subset=['title_year'])
    

    上面的 subset 参数允许我们选择想要检查的列。如果是多个列,可以使用列名的 list 作为参数。

     

    删除不完整的列

    我们可以上面的操作应用到列上。我们仅仅需要在代码上使用 axis=1 参数。这个意思就是操作列而不是行。(我们已经在行的例子中使用了 axis=0,因为如果我们不传参数 axis,默认是axis=0。)

    删除一正列为 NA 的列:

    data.drop(axis=1, how='all')
    

    删除任何包含空值的列:

    data.drop(axis=1. how='any')
    

    这里也可以使用像上面一样的 threshold 和 subset,更多的详情和案例,请参考pandas.DataFrame.dropna

     

    规范化数据类型

    有的时候,尤其当我们读取 csv 中一串数字的时候,有的时候数值类型的数字被读成字符串的数字,或将字符串的数字读成数据值类型的数字。Pandas 还是提供了规范化我们数据类型的方式:

    data = pd.read_csv('../data/moive_metadata.csv', dtype={'duration': int})
    

    这就是告诉 Pandas ‘duration’列的类型是数值类型。同样的,如果想把上映年读成字符串而不是数值类型,我们使用和上面类似的方法:

    data = pd.read_csv('./data/moive_metadata.csv', dtype={'title_year':str})
    

    注意,需要记住的是,再次从磁盘上读取 csv ,确保规范化了我们的数据类型,或者在读取之前已经保存了中间结果。

     

    必要的变换

    人工录入的数据可能都需要进行一些必要的变换。

    • 错别字
    • 英文单词时大小写的不统一
    • 输入了额外的空格

    将我们数据中所有的 movie_title 改成大写:

    data['movie_title'].str.upper()
    

    同样的,干掉末尾空格:

    data['movie_title'].str.strip()
    

     

    这里并没有介绍关于英文的拼写错误的问题,可以参考模糊匹配

     

    重命名列名

    最终的数据可能是有计算机生成的,那么,列名有可能也是计算机按照一定计算规律生成的。这些列名对计算机没有什么,但是对于人来说可能就不够友好,这时候,我们就需要重命名成对人友好的列名,代码如下:

    data,rename(columns = {‘title_year’:’release_date’, ‘movie_facebook_likes’:’facebook_likes’})
    

    像上面这样,我们就完成了两个列的重命名。需要注意的是,这个方法并没有提供
    inpalce 参数,我们需要将结果赋值给自己才可以:

    data = data.rename(columns = {‘title_year’:’release_date’, ‘movie_facebook_likes’:’facebook_likes’})
    

     

    保存结果

    我们完成数据清洗之后,一般会把结果再以 csv 的格式保存下来,以便后续其他程序的处理。同样,Pandas 提供了非常易用的方法:

    data.to_csv(‘cleanfile.csv’ encoding=’utf-8’)
    

     

    更多资源

    这次介绍仅仅是冰山一角。有很多方式可能造成数据集变“脏”或被破坏:

    • 用户环境的不同、
    • 所使用语言的差异
    • 用户输入的差别

    在这里,我介绍了 Python 用 Pandas 清洗数据最一般的方式。

    概要

    • 了解数据
    • 分析数据问题
    • 清洗数据
    • 整合代码

    了解数据

    在处理任何数据之前,我们的第一任务是理解数据以及数据是干什么用的。我们尝试去理解数据的列/行、记录、数据格式、语义错误、缺失的条目以及错误的格式,这样我们就可以大概了解数据分析之前要做哪些“清理”工作。

    本次我们需要一个 patient_heart_rate.csv (链接:https://pan.baidu.com/s/1geX8oYf 密码:odj0)的数据文件,这个数据很小,可以让我们一目了然。这个数据是 csv 格式。数据是描述不同个体在不同时间的心跳情况。数据的列信息包括人的年龄、体重、性别和不同时间的心率。

    import pandas as pd
    df = pd.read_csv('../data/patient_heart_rate.csv')
    df.head()

     

     

    分析数据问题

    1. 没有列头
    2. 一个列有多个参数
    3. 列数据的单位不统一
    4. 缺失值
    5. 空行
    6. 重复数据
    7. ASCII 字符
    8. 有些列头应该是数据,而不应该是列名参数

     

    清洗数据

    下面我们就针对上面的问题一一击破。

    1. 没有列头

    如果我们拿到的数据像上面的数据一样没有列头,Pandas 在读取 csv 提供了自定义列头的参数。下面我们就通过手动设置列头参数来读取 csv,代码如下:

    import pandas as pd
    # 增加列头
    column_names= ['id', 'name', 'age', 'weight','m0006','m0612','m1218','f0006','f0612','f1218']
    df = pd.read_csv('../data/patient_heart_rate.csv', names = column_names)
    df.head()

    上面的结果展示了我们自定义的列头。我们只是在这次读取 csv 的时候,多了传了一个参数 names = column_names,这个就是告诉 Pandas 使用我们提供的列头。

     

    2. 一个列有多个参数

    在数据中不难发现,Name 列包含了两个参数 Firtname 和 Lastname。为了达到数据整洁目的,我们决定将 name 列拆分成 Firstname 和 Lastname

    从技术角度,我们可以使用 split 方法,完成拆分工作。

    我们使用 str.split(expand=True),将列表拆成新的列,再将原来的 Name 列删除

    # 切分名字,删除源数据列
    df[['first_name','last_name']] = df['name'].str.split(expand=True)
    df.drop('name', axis=1, inplace=True)

    上面就是执行执行代码之后的结果。

     

     3. 列数据的单位不统一

    如果仔细观察数据集可以发现 Weight 列的单位不统一。有的单位是 kgs,有的单位是 lbs

    # 获取 weight 数据列中单位为 lbs 的数据
    rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
    df[rows_with_lbs]

    为了解决这个问题,将单位统一,我们将单位是 lbs 的数据转换成 kgs。

    # 将 lbs 的数据转换为 kgs 数据
    
    for i,lbs_row in df[rows_with_lbs].iterrows():
    weight = int(float(lbs_row['weight'][:-3])/2.2)
    df.at[i,'weight'] = '{}kgs'.format(weight) 

     

    4. 缺失值

    在数据集中有些年龄、体重、心率是缺失的。我们又遇到了数据清洗最常见的问题——数据缺失。一般是因为没有收集到这些信息。我们可以咨询行业专家的意见。典型的处理缺失数据的方法:

     

    5. 空行

    仔细对比会发现我们的数据中一行空行,除了 index 之外,全部的值都是 NaN。

    Pandas 的 read_csv() 并没有可选参数来忽略空行,这样,我们就需要在数据被读入之后再使用 dropna() 进行处理,删除空行.

    # 删除全空的行
    df.dropna(how='all',inplace=True) 

     

    6. 重复数据

    有的时候数据集中会有一些重复的数据。在我们的数据集中也添加了重复的数据。

    首先我们校验一下是否存在重复记录。如果存在重复记录,就使用 Pandas 提供的 drop_duplicates() 来删除重复数据。

    # 删除重复数据行
    df.drop_duplicates(['first_name','last_name'],inplace=True)

     

    7. ASCII 字符

    在数据集中 Fristname 和 Lastname 有一些非 ASCII 的字符。

    处理非 ASCII 数据方式有多种

    • 删除
    • 替换
    • 仅仅提示一下

    我们使用删除的方式:

    # 删除非 ASCII 字符
    df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
    df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)

    8. 有些列头应该是数据,而不应该是列名参数

    有一些列头是有性别和时间范围组成的,这些数据有可能是在处理收集的过程中进行了行列转换,或者收集器的固定命名规则。这些值应该被分解为性别(m,f),小时单位的时间范围(00-06,06-12,12-18)

    复制代码

    # 切分 sex_hour 列为 sex 列和 hour 列
    sorted_columns = ['id','age','weight','first_name','last_name']
    df = pd.melt(df,
    id_vars=sorted_columns,var_name='sex_hour',value_name='puls_rate').sort_values(sorted_columns)
    df[['sex','hour']] = df['sex_hour'].apply(lambda x:pd.Series(([x[:1],'{}-{}'.format(x[1:3],x[3:])])))[[0,1]]
    df.drop('sex_hour', axis=1, inplace=True)
    ​
    # 删除没有心率的数据
    row_with_dashes = df['puls_rate'].str.contains('-').fillna(False)
    df.drop(df[row_with_dashes].index,
    inplace=True)
    
    

    复制代码

     

     整合代码

    复制代码

    import pandas as pd
    # 增加列头
    column_names= ['id', 'name', 'age', 'weight','m0006','m0612','m1218','f0006','f0612','f1218']
    df = pd.read_csv('../data/patient_heart_rate.csv', names = column_names)
    ​
    # 切分名字,删除源数据列
    df[['first_name','last_name']] = df['name'].str.split(expand=True)
    df.drop('name', axis=1, inplace=True)
    ​
    # 获取 weight 数据列中单位为 lbs 的数据
    rows_with_lbs = df['weight'].str.contains('lbs').fillna(False)
    df[rows_with_lbs]
    ​
    # 将 lbs 的数据转换为 kgs 数据
    for i,lbs_row in df[rows_with_lbs].iterrows():
    weight = int(float(lbs_row['weight'][:-3])/2.2)
    df.at[i,'weight'] = '{}kgs'.format(weight)
     
    # 删除全空的行
    df.dropna(how='all',inplace=True)
    ​
    # 删除重复数据行
    df.drop_duplicates(['first_name','last_name'],inplace=True)
    ​
    # 删除非 ASCII 字符
    df['first_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
    df['last_name'].replace({r'[^\x00-\x7F]+':''}, regex=True, inplace=True)
    ​
    # 切分 sex_hour 列为 sex 列和 hour 列
    sorted_columns = ['id','age','weight','first_name','last_name']
    df = pd.melt(df,
    id_vars=sorted_columns,var_name='sex_hour',value_name='puls_rate').sort_values(sorted_columns)
    df[['sex','hour']] = df['sex_hour'].apply(lambda x:pd.Series(([x[:1],'{}-{}'.format(x[1:3],x[3:])])))[[0,1]]
    df.drop('sex_hour', axis=1, inplace=True)
    ​
    # 删除没有心率的数据
    row_with_dashes = df['puls_rate'].str.contains('-').fillna(False)
    df.drop(df[row_with_dashes].index,
    inplace=True)
    ​
    # 重置索引,不做也没关系,主要是为了看着美观一点
    df = df.reset_index(drop=True)
    print(df)

    复制代码

     

    还有一些问题在本例中没有提及内容,下面有两个比较重要,也比较通用的问题:

    • 日期的处理
    • 字符编码的问题

    预览数据

    这次我们使用 Artworks.csv ,我们选取 100 行数据来完成本次内容。具体步骤:

    1. 导入 Pandas
    2. 读取 csv 数据到 DataFrame(要确保数据已经下载到指定路径)

    DataFrame 是 Pandas 内置的数据展示的结构,展示速度很快,通过 DataFrame 我们就可以快速的预览和分析数据。代码如下:

    复制代码

    import pandas as pd
    
    ​
    
    df = pd.read_csv('../data/Artworks.csv').head(100)
    
    df.head(10)

    复制代码

     

     

    统计日期数据

    我们仔细观察一下 Date 列的数据,有一些数据是年的范围(1976-1977),而不是单独的一个年份。在我们使用年份数据画图时,就不能像单独的年份那样轻易的画出来。我们现在就使用 Pandas 的 value_counts() 来统计一下每种数据的数量。

    首先,选择要统计的列,并调用 value_counts():

    df['Date'].value_counts()

     

     

     

    日期数据问题

    Date 列数据,除了年份是范围外,还有三种非正常格式。下面我们将这几种列出来:

    • 问题一,时间范围(1976-77)
    • 问题二,估计(c. 1917,1917 年前后)
    • 问题三,缺失数据(Unknown)
    • 问题四,无意义数据(n.d.)

    接下来我们会处理上面的每一个问题,使用 Pandas 将这些不规则的数据转换为统一格式的数据。

    问题一和二是有数据的只是格式上欠妥当,问题三和四实际上不是有效数据。针对前两个问题,我们可以通过代码将据格式化来达到清洗的目的,然而,后两个问题,代码上只能将其作为缺失值来处理。简单起见,我们将问题三和四的数据处理为0。

     

    处理问题一

    问题一的数据都是两个年时间范围,我们选择其中的一个年份作为清洗之后的数据。为了简单起见,我们就使用开始的时间来替换这样问题的数据,因为这个时间是一个四位数的数字,如果要使用结束的年份,我们还要补齐前两位的数字。

    首先,我们需要找到问题一的数据,这样我们才能将其更新。要保证其他的数据不被更新,因为其他的数据有可能是已经格式化好的,也有可能是我们下面要处理的。

    我们要处理的时间范围的数据,其中包含有“-”,这样我们就可以通过这个特殊的字符串来过滤我们要处理的数据,然后,通过 split() 利用“-”将数据分割,将结果的第一部分作为处理的最终结果。

    代码如下

    复制代码

    row_with_dashes = df['Date'].str.contains('-').fillna(False)
    
    for i, dash in df[row_with_dashes].iterrows():
    
        df.at[i,'Date'] = dash['Date'][0:4]
    
    df['Date'].value_counts()

    复制代码

     

     

    处理问题二

    问题二的数据体现了数据本身的不准确性,是一个估计的年份时间,我们将其转换为年份,那么,就只要保留最后四位数字即可,该数据的特点就是数据包含“c”,这样我们就可以通过这一特征将需要转换的数据过滤出来。

    复制代码

    row_with_cs = df['Date'].str.contains('c').fillna(False)
    
    for i,row in df[row_with_cs].iterrows():
    
        df.at[i,'Date'] = row['Date'][-4:]
    
    df[row_with_cs]

    复制代码

     

     

    处理问题三四

    将这问题三四的数据赋值成初始值 0。

    df['Date'] = df['Date'].replace('Unknown','0',regex=True)
    
    df['Date'] = df['Date'].replace('n.d.','0',regex=True)
    
    df['Date']

     

     

    代码整合

    复制代码

    mport pandas as pd
    
    ​
    
    df = pd.read_csv('../data/Artworks.csv').head(100)
    
    df.head(10)
    
    ​
    
    df['Date'].value_counts()
    
    ​
    
    row_with_dashes = df['Date'].str.contains('-').fillna(False)
    
    for i, dash in df[row_with_dashes].iterrows():
    
        df.at[i,'Date'] = dash['Date'][0:4]
    
    df['Date'].value_counts()
    
    ​
    
    row_with_cs = df['Date'].str.contains('c').fillna(False)
    
    for i,row in df[row_with_cs].iterrows():
    
        df.at[i,'Date'] = row['Date'][-4:]
    
    df['Date'].value_counts()
    
    ​
    
    df['Date'] = df['Date'].replace('Unknown','0',regex=True)
    
    df['Date'] = df['Date'].replace('n.d.','0',regex=True)
    
    df['Date'].value_counts()

    复制代码

    展开全文
  • Python不支持以下哪种数据类型?

    万次阅读 2019-04-26 15:54:57
    Python不支持以下哪种数据类型? A . char B . list C . complex D . float E. varchar 正确答案:A E python的变量没有固定的类型,可以用字符串表示 友情链接: python中break和continue的用法和区别详解 ...
  • 下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。问在键盘上如何输入。 #include<stdio.h> int main() { int a, b; float x, y; char c1, c2; scanf("a=...
  • TCP 为什么三次握手而不是两次握手(正解版)

    万次阅读 多人点赞 2018-09-19 19:10:58
    TCP 数据包结构图 为什么 TCP 需要握手这个操作 在解答为什么 TCP 需要三次握手, 而不是两次之前, 首先需要回答的问题是: 为什么需要握手这个操作, 能不能不握手? 如果读者对比一下 UDP 的通信流程和 TCP 的通信...
  • 简介数据采集就是搜集符合数据挖掘研究要求的原始数据(Raw Data)。原始数据是研究者拿到的一手或者二手资源。数据采集既可以从现有、可用的无尽数据中搜集提取你想要的二手数据,也可以经过问卷调查、采访、沟通等...
  • java使用多线程查询大批量数据

    万次阅读 热门讨论 2019-12-11 18:18:22
    前言 在某些时候,一旦单表数据量过大,查询数据的时候就会变得...这个查询的过程,数据量一旦过大,单线程查询数据将会成为瓶颈,下面尝试使用多线程来尝试查询一张数据量较大的表 由于代码逻辑不是很难,直接上...
  • 谈的数据中心等级,很多人对数据中心等级划分并不了解。今天给大家普及一下数据中心等级划分。...下面,我会解释目前世界上出现的5大数据中心等级。相信,你会对数据中心等级会有一个更好的理解。 数据中心
  • Python3实现常用数据标准化方法

    万次阅读 多人点赞 2018-06-16 12:32:50
    常用数据标准化方法python实现 数据标准化是机器学习、数据挖掘中常用的一种方法。...下面是从李宏毅教授视频中截下来的两张图。 左图表示未经过数据标准化处理的loss更新函数,右图表示经过数...
  • 数据清理中,处理缺失值的方法是?

    万次阅读 2018-02-22 13:03:43
    感想最近做机器学习的题目的时候,偶尔会蹦出一个数据挖掘的题目,让我措手不及,看来我现在的学艺不精,需要努力一点。problem数据清理中,处理缺失值的方法是?A 估算B 整例删除C 变量删除D 成对删除答案为:A B C ...
  • 如何入门数据分析?

    万次阅读 2020-05-16 12:54:41
    可以了解之前讲解的《数据分析为什么火了》。 如果你刚开始学习数据分析,那么怎么入门呢?其实各大招聘网站的数据分析职位就是一个很好的参考。那么数据分析师究竟需要哪些技能呢? 数据分析必备技能: Excel SQL...
  • 数据科学导论期末试题

    万次阅读 2018-11-08 16:41:26
    上午刚考完数据科学导论,这里回忆下题目...数列 0, 3, 2, 5 中间缺失一个,问下面哪个补进去最合适。 选项有7, 8, 4, 12。瞬间懵逼了两分钟,最终选择了4. 因为2-0 = 2, 5 -3 = 2, 4 - 2 = 2, 不知道对不...
  • 大智慧股票本地数据读取接口(含源码)

    千次下载 热门讨论 2009-03-22 13:45:51
    /*请确认要转换的数据,在下面语句的%后加*变为注释取消转换*/ /*沪市*/ %FxjData2FinData(sh,dm,FinData); /*dm--证券代码,原数据集将保存为xxDM_bak*/ %FxjData2FinData(sh,cq,FinData); /*cq--除权数据*/ %FxjData...
  • 点击进入_更多_Java千百问1、null属于哪种数据类型首先,在java中,null本身不是对象,也不是Objcet的实例。那么他属于哪种数据类型呢? 了解数据类型看这里:java中数据类型是什么 java基本数据类型看这里:[java...
  • Hadoop系列之MapReduce 数据本地化 (29)

    万次阅读 2021-02-20 08:32:26
    数据本地化是指把计算移动到数据所在节点上进行执行的过程,也就是通常所说的 “移动计算而不是移动数据”。移动计算比移动数据具有更大的优势,它可以降低网络开销,增加系统的整体吞吐量。 数据本地化的概念 让...
  • 通过观察数字和统计数据的转换以获得清晰的结论并不是一件容易的事。必须用一个合乎逻辑的、易于理解的方式来呈现数据。谈谈数据可视化。人类的大脑对视觉信息的处理优于对文本的处理——因此使用图表、图形和设计...
  • 栅格数据添加属性表

    千次阅读 2021-04-01 15:24:20
    但他不是浮点数值,一个值对应一种类型,可采用下面的方法: 1.打开工具箱中的栅格创建属性表工具 Data Management Tools(数据管理工具)->Raster(栅格)->Raster Properties(栅格属性)中选择Build Raster...
  • 使用R读取并查看数据

    万次阅读 2018-05-20 15:06:52
    本篇文章介绍如何使用R读取并查看数据,包含一些最基础的函数使用方法和说明。后面还会陆续介绍数据清洗,匹配和提取等相关的操作。查看函数帮助对于新手来说,在使用R时最重要的是了解不同函数的使用方法。很多时候...
  • 倾斜摄影测量数据的一些简析

    千次阅读 热门讨论 2017-10-27 23:09:19
    1.国内倾斜摄影数据大多是以.osgb格式保存数据,osgb格式,是OSG三维引擎定义的数据格式,首先介绍osg格式,.osg数据是OSG定义的格式,为二进制格式,可以加快计算机读取。.osg格式可以通过OSG库自带的数据转换工具z...
  • 数据(MetaData)的简单理解

    万次阅读 多人点赞 2018-09-27 17:07:13
    数据是用来描述数据数据(Data that describes other data)。单单这样说,不太好理解,我来举个例子。 下面是契诃夫的小说《套中人》中的一段,描写一个叫做瓦莲卡的女子: (她)年纪已经不轻,三十岁上下...
  • 注:本篇文章参考《Pentaho Kettle解决方案:使用PDI构建开源ETL解决方案》数据清洗步骤 利用Calculator计算器进行数据清洗工作相关的选项 Replace in string字符串替换步骤 Fuzzy match模糊匹配步骤 Kettle里的字符...
  • R语言将数据框中的字符类型数字转换为数值

    万次阅读 多人点赞 2019-10-17 14:55:48
    场景1 我现在有一个数据框datexpr,里面的数字都是以字符型表示的,像这样 > datexpr[1,1] [1] " 1.143773961" 1 2 现在我想把这个数据框中的字符型数字全部转为数值型...使用下面语句即可 datexpr2=as.data...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,491,996
精华内容 996,798
关键字:

下面什么不是数据