最近在学习大数据,书看了不少,但是总是觉得很迷茫,不知道怎么学下去,今天
突然想写点什么来
总结一下这些天.

起因

逛博客的时候看到一篇分享如何修炼成大数据高手感觉很有趣

买了两本书

大数据时代

失控

这两本书都是很多年前写的,但是最近这几年随着”大数据”被大家越炒越热,随即被大家所看重.

这两个作者很牛,在30年前大数据还只是萌芽的时候就提出未来大数据的重要性和价值.

大数据是什么了,现在为什么这么火,以前没有大数据吗?

大数据的产生就像是科技带来的附带品一样,原来我们把信息存贮在图书馆里面,因为人类的活动产生的信息越来越多,图书馆也越来越大,但是由于管理和存贮的成本越来越多,我们被迫要缩减浓缩我们的信息,我们想出了很多很方法来对付这种情况,比如抽样,只要抽取一部分的代表信息存在图书馆里面然后记录主要特征和平均分量,我们就可以把信息降低几个数量级.

但是现在不同.

芯片做的越来越小,容量做的越来越大,我们有能力存贮所以的信息,一些先驱发现我们用另一种思维去对待信息.

用全体数据而不是随机样本

用混杂性而不是精确性

用相关关系而不是因果性

最近从python2转到python3,发现还是有一些不同,一些库改名字很好解决,但是这个import机制不了解原理是不好理解的.

python2是默认相对路径导入,python3是默认绝对路径导入

首先这个包的导入机制,就是你在一个module里面引用另一个module,python运行文件有两种方式,一种是直接以主文件运行(默认以这种方式运行,同下面一种有点区别),一种是以module形式运行,就是用python -m filename方式调用.

以module的方式运行

####### 什么是相对导入和绝对导入呢
相对导入是用一个.来声明的,相当于Unix上的选择当前文件夹.

假设你的文件目录为下面的

main
|    main.py
|     __init__py
|   momod+
|      | __init__.py
|      | pack.py
|       | flask
|      |    |  __init__.py
|       |    |  myflask.py
--------------------
python里面的module分三种,一种是build-in module(内建库),一种是第三方库,还有一种是你自己写的库(如上面的flask).

在python2里面,当你import 一个module时,搜索的顺序是 内建库,自己的库,第三方库.

####### 而在python3里面顺序为 内建库,第三方库,你自己的库.

我自己感觉python3的import的机制更为清晰,因为当你import一个库时,假如你写的库和第三方库重合时,你优先导入第三方库,如果你不适用声明相对导入的话,你无法正确的导入自己的库,而使用.来声明库来自自己的代码让代码的结构更加清晰了.所以如果你想让你的代码兼容py2和py3,你自己的库都要采用相对导入方法来导入.
比如在momod 里面的pack.py假如想引用flask的myflask.py要这样写

from .flask import myflask

########### 假如你在py2中写了 from flask import myflask(并且你安装了flask库),这个是可以成功运行但是在py3中就会报错,因为他会优先导入flask库假如你没有显示声明相对导入的话.


上面成立的前提是将pack.py以module方式运行,或者运行main.py在其中引入pack.py.接下来讲讲以主文件运行的不同.

当你直接使用

python pack.py

你假如在pack.py里面使用了这个

from .flask import myflask

引用了自己的myflaskmodule,在py2和py3中都会下面报这个错

SystemError: Parent module '' not loaded, cannot perform relative import

因为当你以主文件方式运行 pack.py ,python会吧pack.py重命名为__main__,所以用.相对路径也不会是当前文件.所以全部都只能用绝对引用.所以在主文件运行在python3里面有个问题,假如你自己的库与第三方库有重名.

python3默认绝对路径,自己的库不会优先于第三方库被扫描.有两个解决方法,把自己的库重命名,第二个方法就是把包含主文件的文件夹加上init.py,你可以在sys.path的路径里加上..或者具体上一个上一个文件夹的路径.怪绕口的,其实你只要python能找到你的上一个文件夹,就行.

说到这里顺便插一句对doctest和集成测试的理解.

由于我平时喜欢一边写代码一遍测试功能,图方便就使用doctest直接插在方法里面,在代码后面加上

if __name__ == '__main__':
        import doctest
        doctest.tesmod()

平时写小module的时候没有问题,在将python2转python3时候,出现问题,因为我要测试这个module时,会报上面的那个错,因为我要测试他的话必须将它作为主文件.查了资料知道,其实doctest虽然在当前页面代码测试,但是对于module的话,最好采用集成测试,一是module很多,假如一个一个运行很麻烦,二是有时候module必须多个一起测试,所以测试module时要用集成测试来取代doctest.

Pillow 是 PIL的对Python3支持的另外一个分支,当然他对Python2也兼容,由于PIL安装起来比较烦,而使用pip可以很轻松的安装Pillow,所以我选择Pillow使用,但是其核心还是PIL库的。


Python的图形处理库如PIL一直很强大,但是要想使用好它必须对图片有一定的知识储备。
使用起来很简单

from PIL import Image

引用Image包

im = Image.open('1.png')

打开图片,得到一个im对象,我们接下来就可以对这个对象进行操作(前提有这个1.png图片)

我们先看一下他的一些属性

>>> print im.format, im.size, im.mode
PNG (83, 81) RGB

第一个我们输出图片的格式,图片有很多种格式,常用的有jpg、png还有gif动图啊,PIL支持很多种格式,我们可以使用PIL轻松的将格式转换,im.save('1.jpg'),当然你可以选择格式假如你没选好后缀名的话,im.size就是图片大小,他返回的是一个元组第一个长度第二个是宽度,单位是像素。
现在就谈谈 这三个属性对应的关系吧
首先我们使用一张像素图来说吧

我们存贮图片的时候是将整个图像分成很多个相同的小方块,每个小方块我们称为像素,当然一张图片分的越小,像素越多,那么图片就越接近真实图片,上面的im.size属性就告诉我们,这张图片分成了,长为83px,宽为81px的图片,那么一共有83*81=6723个像素点,每个像素点里面存什么呢,这就是im.mode属性告诉我们的,贴一下属性有什么吧

  1. 1 (1-bit pixels, black and white, stored with one pixel per byte)
  2. L (8-bit pixels, black and white)
  3. P (8-bit pixels, mapped to any other mode using a color palette)
  4. RGB (3x8-bit pixels, true color)
  5. RGBA (4x8-bit pixels, true color with transparency mask)
  6. CMYK (4x8-bit pixels, color separation)
  7. YCbCr (3x8-bit pixels, color video format)
  8. I (32-bit signed integer pixels)
  9. F (32-bit floating point pixels)

像素存贮就是涉及到颜色的存贮,在早期的黑白游戏机,只有黑和白两种,那么每个像素点就只有1位颜色来存贮,1位只能存贮两种颜色,八位色就能存256种颜色,像八位我们能用256个油漆桶/256色调色板来形容,像上面我们使用的RGB是由三种三原色红绿蓝混合而成,我们知道大自然所有的颜色都可以用红绿蓝三种颜色调配出来,所以RGB又被称为真彩(true color),每种颜色我们都分成256种,所以我们一共有256256256=16777216种颜色可以调配,像素的其他模式我们不介绍太多,有兴趣的可以自己钻研。
那么我们知道每个像素占多少字节,又知道共有多少个像素,那我们是不是就可以直接计算出来图片大小,来验证一下

以第一张图片为例,共有8381=6723个像素点,用RGB模式,每个像素三个字节,共有67233=20667b=20kb,但是我这张图片只有11.6kb,误差太大了吧,这时候我们就要介绍一下上面那个im.format属性了,这张图片采用png格式,我们先尝试一下把他转成JPG格式吧

im.save('1.jpg')

我们再查看一下这个1.jpg的大小,只有2.24kb了,我们用PIL打开这张图片

>>> im2 = Image.open('1.jpg')
>>> print im2.format, im2.size, im2.mode 
JPEG (83, 81) RGB

图片大小没有改变,但是format变成了JPEG,而且文件大小变成原来的1/5,
JPEG和GIF和PNG是三种图片压缩技术,他们使用压缩算法把图片压缩成很小,当我们打开图片时,解密算法把他还原出来,所以我们算出来的大小与压缩后的大小是不一样的。
有了这些概念我们就能更好的使用PIL提供给我们的magic方法,下次在谈我对PIL的高级应用吧。

numpy简单来说就是python的C版数组实现,因为python原生列表虽然好使,但是生成大量数据时开销很大,而numpy是基于C的,生成大量数组非常简单,而且操作他们速度非常快.

由于numpy是基于C的,所以numpy是一种强类型的,当然numpy是可以判断数组里面是数据类型,但是我们可以显示声明他们,dtype是声明的参数,一般我们通过下面的方式简单声明一个narray

import numpy as np
arr = np.array([1, 2, 3], dtype=np.int32)

numpy还有一个强大的地方是多维数组,numpy对多维数组的支持很好.只要简单的使用嵌套序列就能被转化成多维数组.
比如
arr2 = np.array([[1, 2], [3, 4]])

numpy另一个强大的地方是矢量化,这对于科学计算来说非常有用

比如前面的arr,
我们可以简单使用

arr3 = arr * arr

得到另外一个序列 [1, 4, 9],数组间的运算应用到了元素级.

numpy之所以成为数据分析的基本数据结构,还在用取数据的灵活性

对于一维数组来说,python自身的列表就支持切片处理,numpy不仅支持切片处理,还支持列表取出,比如:

>>> num =  np.arange(10)
>>> num[[3, 1, 0]]
array([3, 1, 0])
在一维数组里面这个并没有什么优势,因为我们可以通过数据简单一个构造器[num[x] for x in [3, 1, 0]]构造出来.

当但在多维数组我们使用构造器非常繁琐了, numpy使用了很多技术使我们很方便的取出多维数组

我们先创建一个多维数组

arr = np.arange(32).reshape((8, 4))

生成的arr是

array([[ 0,  1,  2,  3],
   [ 4,  5,  6,  7],
   [ 8,  9, 10, 11],
   [12, 13, 14, 15],
   [16, 17, 18, 19],
   [20, 21, 22, 23],
   [24, 25, 26, 27],
   [28, 29, 30, 31]])

现在像一维数组一样的取出数据

In[13]: arr[[0, 3]]
Out[13]: 
array([[ 0,  1,  2,  3],
   [12, 13, 14, 15]])

我们取出了一个二维数组

试试用这个

In[14]: arr[arr > 8]
Out[14]: 
array([ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
   26, 27, 28, 29, 30, 31])

我们取出一个一维数组,这个arr > 8 是也是一个二维数组对应原来数组的每个位置都有一个布尔值代替,当numpy判断得到是一个array数组时会广播每个值来判断是否获取,这个可比你用for循环快了很多.

array([[False, False, False, False],
   [False, False, False, False],
   [False,  True,  True,  True],
   [ True,  True,  True,  True],
   [ True,  True,  True,  True],
   [ True,  True,  True,  True],
   [ True,  True,  True,  True],
   [ True,  True,  True,  True]], dtype=bool)
numpy很善于处理不同的选择,当你直接给一个数组时,如上面的arr[[0, 3, 4]],它默认第二维为全部选择也就是想当与arr[[0, 3, 4], :],当你给确定的值时,他就会在第二维上取响应的值,比如
arr[[0, 3, 4], 1] 或 arr[[0, 3, 4], [1, 1, 1]]

从上面你可以看到,如果第二维你每个都想取第二个,你可以直接写一个整数就行,numpy会广播过去,假如想你分别再第一维的每个上分别对应取哪个你就可以用数组来分别选择.

有时候我们想在二维数组上面取出一个矩形块,直接使用 arr[[0, 3, 4], [1, 2, 3]]只能取出二维数组矩形块的对角线,我们这时候就可以先取出第一维的矩形列,然后再在取出的列中取出矩形行
arr[[0, 3, 4]][:, [1, 2, 3]]

当然我们还可以用二维数组来取出数据
arr[[[0], [3], [4]], [[1, 2, 3]]]

[[0], [3], [4]]代表第一维的1, 4, 5列, [[1, 2, 3]]代表第二维的2, 3, 4行.

numpy给我们提供一个函数将一维数组转换成二维数组我们可以简单使用
np.ix_([0, 3, 4], [1, 2, 3])

生成二维数组,这样我们使用

arr[np.ix_([0, 3, 4], [1, 2, 3])]

就可以取出矩形块了.

学了鸟哥的书前面基础后,突然想在Linux下用gcc玩C语言,然后了解到了Vim这个神一样的编译器,接下来经过超长时间虐心的安装无数插件无数依赖包,突然有种打自己一顿的感觉,还好终于把Vim装的和VS差不多了,接下来我介绍我安装Vim的经验吧。

我虚拟机下的Linux原来是红旗6的,但是我改了一下yum的包源成CentOS的并且全部update一下后就神奇的变成了CentOS6,虽然他们两个是同一家公司,但是总给我一种由盗版成了正版的感觉。。

闲话不多说,刚开始装第一个插件是Ctags

刚开始装的时候我是在X-Windows里面的这里下载再转回shell敲

$ tar -xzvf ctags-5.6.tar.gz
$ cd ctags-5.6
$ make

make install

后来我发现不用这么复杂直接在X-Window下面复制到Terminal里面就可以了,毕竟后面安装的代码都是十几行,根本扛不住。。。。

装完三个感觉整个我太苦逼,简直是辛苦啊,不是说好的敲几下键盘就可以吗。
后来了解到linux有几个软件可以帮忙安装而且解决依赖性,比如ubuntu的apt-get,redhat的rmp,yum,但是问题来了,我的黄狗(yum:yellow dog)怎么没用啊,全都装不上,一查错误提示,原来我没用被授权,原来RedHat更新软件是要收钱的,但是CentOS不用,然后我就用了CentOS的源,当时我就想只想装个git,然后就没用然后了。终于全部更新完了,yum也可以用了,用yum果然爽多了,直接

yum install git    

git就装好了。如果想知道怎么改源,点击这里


好了装好了源接下来装软件就敲一敲代码就行,不用去网上找包下载再安装。

装好一些热门的插件后,我碰到了第一个最难装的插件YouCompleteMe(YCM),装完之后感觉就是神器一般的存在,但是装完之前一直在感慨,我去怎么没个卵用啊,而且装llvm(安装YCM必须先安装的软件)时,我用编译安装方法因为一些库的缺失一直报错,后面采用二进制安装方法安装完llvm才成功按上YCM。
推荐新手采用二进制安装方法安装llvm,想知道怎么安装YCM这些点击这里

安上一些实用的插件后,最后安装调试神器gdb,有三种方式使vim可以调试程序(与gdb一起工作),

vimgdb,pyclewn,clewn,三个我都试了,第一个要编译一下vim,我失败了,第二个要用python2.4+支持,我python2.6然并卵,每次都说不支持python2,第三个是用c写的,终于成功,安装非常简单,
点击这里了解详情.
装完了,我终于可以使用clewn打开gdb和gvim,然并卵,我写的程序并不能在gdb里面运行,一直说无法识别。。。。。。搜了一下原来是编译的时候的问题,用gcc编译的程序要带上-g参数才能在gdb里面用(我还以为我clewn没装好)
例如

gcc -g test.c -o test

加上-g参数就行了。终于我的vim可以用了。。。。。。


string

原来的很多函数都逐渐迁移到strunicode对象上去了,
不过有两个函数没有迁移出去


第一个是capwords

个人觉得没什么卵用
就是将英文单词首字母大写

比如

string.capwords('this are some words')

输出为 This Are Some Words


第二个我觉得挺有趣,他可以帮你把对应的文字换成你设定的

我们可以用它来设计出莫斯密码’=’.

"""create a table"""
table = string.maketrans('abc','123')
print 'abc123'.translate(table)

输出为123123成功把abc转成了123


string还有一个模板类型Template
这个类型同我们转义差不多(%),不过能够实现的
更加自主化
我们可以继承这个类来修改模板类的具体实现
而且这个模板类有一个


textwrap

由于sublime输出一个很长的字符串很卡,这个格式化字符串的类能够帮我们
解决很多问题

我一般去除整体缩进然后去填充字符串

dedented_text = textwrap.dedent('...a long word...')
print textwrap.fill(dedented_text, width=50)

申请了一个阿里的15体验的云服务器,同自己玩的虚拟机还是有点不同的。

1.用户名和密码

找了半天没有找到那个是用户名,试了实例的id,没有用,最后终于在登录帮助名里面找到了,用户名竟然是root!!!!,我用的是Ubuntu系统,说好的Ubuntu不提供root权限的呢,阿里还真会改造Linux系统
,但是我觉得用root登录还是不安全,我觉得新建一个用户吧

在root权限下

useradd -s /bin/bash -r -m yourname

解释一下,本来直接useradd yourname 就可以新建一个yourname账号,但是如果用你新建的用户登录的话,你无法使用Tab键和上下左右键 ,你键入 echo $SHELL,会发现是/bin/sh,因为Ubuntu默认创建账号使用/bin/sh,假如你没加这个可以删掉 用这个userdel yourname重新来一遍,搞完这个只是创建了一个普通用户,你使用不了sudo获取最高权限,这个怎么办,很简单在/etc/sudoers里面找到
root ALL=(ALL:ALL) ALL

模仿它加上自己的账号名就可以