你的数据根本不够爱和不爱的区别大,别老扯什么Hadoop了

 本文原名出自有着多年从业经驗的数据科学家,纽约大学柯朗研究所博士后搞过高频交易平台,当过创业公司的CTO更习惯称自己为统计学者。对了他现在自己创业,提供数据分析、推荐优化咨询服务他的邮件是:

      有人问我,“你在大数据和Hadoop方面有多少经验”我告诉他们,我一直在使用Hadoop但是很尐处理几TB以上数据的任务 。我基本上只是一个大数据新手——知道概念写过代码,但是没有大规模经验

      他们又问我,“你能使用Hadoop做简單的group by(分组)和sum(统计)吗”我说当然可以,但我会说需要看具体的文件格式

他们给我一个U盘,里面存储600MB数据(他们所有的数据而不是样本數据)。不知道为什么

我用是一Python数据分析库)解决方案,而不是Hadoop完成了这个任务后他们显得很不满意。

      Hadoop实际上是有很多局限性的Hadoop可以运行一个通用的计算,下面我用伪码进行说明:

Scala风格的伪码:

使用SQL风格的伪码表示:

  1. 目标:统计计算图书馆书籍的数量  
  2. Map:你统计奇數书架上书的数量我统计偶数书架上书的数量。(做统计的人越多统计出结果越快,就是机器越多效率越高)  
  3. Reduce:把我们每个人单独統计的结果数据加在一起。  

by、一个aggregate或者这种计算序列来写这和穿上紧身衣一样,多憋得慌啊许多计算用其他模型其实更适合。穿上紧身衣(使用)的唯一原因就是可以扩展到极大的数据集。可大多数情况你的数据集很可能根本远远够不上那个数量级。

    可是呢因为Hadoop囷是热词,世界有一半的人都想穿上紧身衣即使他们实际不需要Hadoop。

对于Excel来说的“很大的数据”并非大数据其实还有其它极好的工具可鉯使用——我喜欢的是基于Numpy库之上Pandas。它可以将几百MB数据以高效的向量化格式加载到内存在我购买已3年的笔记本上,一眨眼的功夫Numpy就能唍成1亿次浮点计算。Matlab和R也是极好的工具

      Pandas构建于Numpy库之上,可以以矢量格式的方式有效地把数百兆的数据载入到内存中在我购买已3年的笔記本上,它可以用Numpy在一眨眼的功夫把1亿的浮点数乘在一起Matlab和R也是极好的工具。
       因此对于几百兆的数据量,典型的做法是写一个简单的Python腳本逐行读取处理,然后写到了一个文件就行了

 我买了台新笔记本它有16GB的内存(花$141.98)和256GB的SSD(额外200美元)如果在Pandas里加载一个10GB的csv文件,实際在内存里并没有那么大(内存不是占有10G)——可以将 “” 这样的数值串存为4位或者8位整数“35723”存为8位双精度。

    最坏的情况下你还可以鈈同时将所有数据都一次加载到内存里


 SQL是一个直观的查询语言,适合做业务分析业务分析师和程序员都很常用。SQL查询非常简单而且還非常快——只有数据库使用了正确的索引,要花几秒钟的sql查询都不太常见
     Hadoop没有索引的概念,Hadoop只有全表扫描而且Hadoop抽象层次太多了——峩之前的项目尽在应付Java内存错误( )、内存碎片和集群竞用了,而这些时间远多于实际的数据分析工作

如果你的数据并不是像SQL表那样的結构化数据(比如纯文本、JSON对象、二进制对象),通常是直接写一个小的Python脚本或者Ruby脚本逐行处理更直接保存到多个文件,然后逐个处理即可SQL不适用的情况下,从编程来说Hadoop也没那么糟糕但相比Python脚本仍然没有什么优势。

  除了难以编程Hadoop还一般总是比其他技术方案要慢。只偠索引用得好SQL查询非常快。比如要计算joinPostgreSQL只需查看索引(如果有),然后查询所需的每个键而Hadoop呢,必须做全表扫描然后重排整个表。排序通过多台机器之间分片可以加速但也带来了跨多机数据流处理的开销。如果要处理二进制文件Hadoop必须反复访问namenode。而简单的Python脚本只偠反复访问文件系统即可

    你的命可真苦——只能苦逼地折腾Hadoop了,没有太多其他选择(可能还能用许多硬盘容量的高富帅机器来扛)而苴其他选择往往贵得要命(脑海中浮现出IOE等等字样……)。

    用Hadoop唯一的好处是扩展如果你的数据是一个数TB的单表,那么全表扫描是Hadoop的强项此外的话(果你没有这样大数据量的表),请关爱生命尽量远离Hadoop。它带来的烦恼根本不值用传统方法既省时又省力。

六、Hadoop是一个極好的工具

进群:  即可获取数十套PDF或者零基礎入门教程一套哦!

这里我们从csv文件中读取到了数据并将他们存入了dataframe中。我们只需要调用read_csv函数并将csv文件的路径作为函数参数即可header关键芓告诉Pandas这些数据是否有列名,在哪里如果没有列名,你可以将其置为NonePandas非常智能,所以你可以省略这一关键字

当你在Pandas中查找列时你通瑺需要使用列名。这样虽然非常便于使用但有时候,数据可能会有特别长的列名例如,有些列名可能是问卷表中的某整个问题把这些列名变短会让你的工作更加轻松:

我们也可以使用这些条件表达式来过滤一个已知的dataframe。

这将返回一个仅仅包含9、10月降雨量低于1000mm的条目的dataframe

你也可以使用多条条件表达式来进行过滤:

值得注意的是,由于操作符优先级的问题在这里你不可以使用关键字‘and’,而只能使用’&’与括号

好消息是如果在你的数据中有字符串,你也可以使用字符串方法来过滤数据

注意到你必须使用.str.[string method],你不能直接在字符串上直接調用字符串方法这一语句返回1990年代的所有条目。

在上面这个例子中我们把我们的索引值全部设置为了字符串。这意味着我们不可以使鼡iloc索引这些列了这种情况该如何?我们使用loc

这里,loc和iloc一样会返回你所索引的行数据的一个series唯一的不同是此时你使用的是字符串标签進行引用,而不是数字标签

ix是另一个常用的引用一行的方法。那么如果loc是字符串标签的索引方法,iloc是数字标签的索引方法那什么是ix呢?事实上ix是一个字符串标签的索引方法,但是它同样支持数字标签索引作为它的备选

正如loc和iloc,上述代码将返回一个series包含你所索引的荇的数据

既然ix可以完成loc和iloc二者的工作,为什么还需要它们呢?最主要的原因是ix有一些轻微的不可预测性还记得我说数字标签索引是ix的备選吗?数字标签可能会让ix做出一些奇怪的事情例如将一个数字解释成一个位置。而loc和iloc则为你带来了安全的、可预测的、内心的宁静然洏必须指出的是,ix要比loc和iloc更快

通常我们都希望索引是整齐有序地。我们可以在Pandas中通过调用sort_index来对dataframe实现排序

有时候你会想以某些方式改变戓是操作你数据集中的数据。例如如果你有一列年份的数据而你希望创建一个新的列显示这些年份所对应的年代。Pandas对此给出了两个非常囿用的函数apply和applymap。

你也可以对多行进行分组操作:

接下来的unstack操作可能起初有一些困惑它的功能是将某一列前置成为列标签。我们最好如下看看它的实际效果

这个操作会将我们在上面小节创建的dataframe转变成如下形式。它将标识‘year’索引的第0列推起来变为了列标签。

pivot实际上是在夲文中我们已经见过的操作的组合首先,它设置了一个新的索引(set_index())然后它对这个索引排序(sort_index()),最后它会进行unstack操作组合起来就是一个pivot操作。看看你能不能想想会发生什么:

如下你可以看到两个数据集在年份这一类上已经合并了。rain_jpn数据集仅仅包含年份以及降雨量当我们以姩份这一列进行合并时,仅仅’jpn_rainfall’这一列和我们UK雨量数据集的对应列进行了合并

采用Pandas快速绘制图表

Matplotlib很好用,但是想要画出一个中途下降嘚图表还是需要费一番功夫的而有的时候你仅仅想要快速画出一个数据的大致走势来帮助你发掘搞清这些数据的意义。Pandas提供了plot函数满足伱的需求:

这里非常轻松快速地利用plot画出了一个你的数据的图表利用这个图表,你可以紧接着直观地发现深入挖掘的方向例如,如果伱看我画出的我数据的图表你可以看到1995年英国可能发生了干旱。

你也能发现英国的降雨量明显低于日本然而人们却说英国雨下得很多!

是不是很牛逼,是不是很神奇?学到了吗

我要回帖

更多关于 不够爱和不爱的区别 的文章

 

随机推荐