最近在学利用python进行数据分析,发现pandas这个库对数据的处理非常灵活,
而且号称python的maltlab的.其在图形绘制也非常方便

在Windows下安装python关于科学计算的库非常不方便,还好有一些公司做好了关于python计算库在Windows安装的安装文件,这里我推荐anaconda,我推荐安装32位包,因为64位有很多库不支持.

pandas内部是使用numpy做存贮结构的,所以我们必须先了解一下numpy

下面是numpy的简析

关于pandas的DataFrame和Series的理解

管线命令 (pipe):

  1. 撷取命令: cut, grep
  2. 排序命令: sort, wc, uniq
  3. 双向重导向: tee
  4. 字符转换命令: tr, col, join, paste, expand
  5. 分割命令: split
  6. 参数代换: xargs

    分割文档

长长的一大片文档有时我们并不愿意看到全部内容,我们只想关注
部分内容的时候了可以考虑使用分割文档命令

cut是一个很好的分割文档工具

vi常用命令

  1. [Ctrl] + [u] 屏幕『向上』移动半页
    • 光标移动到非空格符的下一列
    • 光标移动到非空格符的上一列
  2. n那个 n 表示『数字』,例如 20 。按下数字后会向右移动这一行的n 个字符。例如 20<spac移动 20 个字符距离。
  3. 0 这是数字『0 』:移动到这一行的最前面字符
  4. $ 移动到这一行的最后面字符处(常用)
  5. H 光标移动到这个屏幕的最上方那一行
  6. M 光标移动到这个屏幕的中央那一行
  7. L 光标移动到这个屏幕的最下方那一行
  8. G 移动到这个档案的最后一行(常用)
  9. nG n 为数字。移动到这个档案的第 n 行。例如 2档案的第 20 行(可配合 :set nu)
  10. gg 移动到这个档案的第一行,相当于 1G 啊! (
    n n 为数字。光标向下移动 n 行(常用)

泛型对于解决面对对象编程的算法设计可以提高其运算速度,但是对于引用类型来说还是没什么差别,因为引用类型只是指针的地址的调用,简单来说泛型还是挺好理解的,但是对于泛型、非泛型、继承和接口的融合就有些迷惑了。

比如说这种接口
public interface IEnumeratot<T>:IDisposable,IEnumerator,ICompare<T>

这个泛型接口继承了两个非泛型接口,和一个泛型接口。


我一开始理解泛型就是一个个模型,只要我们把类型一个参数赋给他,他就能生成一个标准的类型,他缺少的只是一个参数而已,我们引用的时候感觉就像我们引用一个“全体方法”,把参数赋给类型后就可以一直调用类中的方法了,但是对于接口的继承如何理解?

对于泛型类的继承,继承的类必须实现泛型的参数或者保留泛型的参数,比如下面

  public class A<T>
{
    public T tt;
}
public class C<T> : A<T>
{
    public T tt;
}

或者是这样

  public class A<T>
{
    public T tt;
}
public class C : A<string>
{
    C cc;
}

对于泛型继承非泛型类,比如下面

public class A 
{
     A aa;
 }

 public class B<T>:A
{
    B<T> bb;
}

基类是非泛型,而继承的是泛型类,我感觉这种构造就是让泛型类多了一种包容性,比如下面的链表实现的代码,让基类是非泛型,而继承是泛型,就能让链表可以连起很多种类型的数据,而本身的类型安全没有丢失。

public class Node
{
        pretected Node next;
          public Node(Node next){
            this.next=next;
            }
}
public class TypeNode<T>:Node
{
    public T data ;
    public TypeNode(T data):this(data ,null){
        }
    public TypeNode(T data,Node next):base(next){
        this.data=data;
        }

    }

泛型的约束

申请了一个阿里的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

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

基于python2

scrapy是一款非常轻量级的爬虫框架,但是由于它隐藏了太多关于网络请求的细节,所以我们有时候会遭遇到一下很尴尬的bug,当然这主要是因为碰到一些不规范的网站。

python的编码转码网上有很多文章,如果你不了解这个你可以参考下面了解。

Ned Batchelder 关于python unicode和str的理解,通俗易懂

关于scrapy 入门

关于 encode的认识

通过上面我们可以很好的理解python的转码译码,在这里我想谈一下我自己对其的认识吧,我一开始接触的c语言序列的基本上都是强类型,比如C里面假如我想写一个函数每个传人的参数都得是有类型的,但是python弱化了类型这一点,python也是面对对象的,但是他的对象就是鸡同鸭讲,照猫画虎就能运行,弱类型适合动态语言,我们不确定下一行代码输入的是什么,自从学python起,一直感觉python对类型一直不严格,这样就给了我一种错觉,只要长得差不多就能一样的比划,比如在两个string,'中国',u'中国',看起来差不多但是如果你把u'中国'存入文件中就会出错(假如你没定义编码规则)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 344-351: ordinal not in range(128)
unicode字符编码错误,要想理解这个要对unicode字符集和unicode编码有一定的理解,推荐你读一下这篇博客字符编码的知识,python内部使用unicode字符集存贮所以的编码的字符,为什么要用unicode字符集举个栗子吧:

A是米国的程序员,他使用asicc编码的文件上传了一封邮件,
B是中国的程序员他使用gbk编码的文件上传了一封邮件,
现在C要用程序同时处理A和B的邮件,有两种解决方法他把A的文件译码再编码成B的gbk,或者将B的文件译码成asicc但是中文无法处理,那么只能使用第一种方法将A的文件编码成gbk,但是改天D又来啦,他是俄国人,天啊噜gbk可能没有把俄语编进去,那肿么办,我们迫切需要一种编码可以把所以的字符放进去,所以unicode出现了,Unicode中将字符集按照一定的类别划分到0~16这17个层面(Planes)中,每个层面中拥有216=65536个字符码,因此Unicode总共拥有的字符码,也即是Unicode的字符空间总共有17*65536=1114112,一共有1114112这么多的字符可以用,这下我们不用担心了吧,太好了这下不用愁了,

python 内部使用unicode字符集作为一个译码中转站,因为他编码了所以的字符集,只要你能在自己编码方案上找到自己的字,我就能在unicode字符集找到你的位置,所以使用unicode可以很好的解决多种编码方案产生的问题(比如gbk,utf-8)
当然其他编码方案如果想使用unicode解码成其他的必须同unicode有一一对应关系,不过现在主流的编码方案如gbk,gb2312,utf-8都是unicode系的。

了解了这些基础知识就可以知道了为什么存贮u'中国'存不进文件里面去了,因为unicode并不提供给当今字符解析器的方法,就是\u234e一个16进制数字,屏幕上不知道他对应什么图形,所以python系统要求存进文件的必须是字节流,也就是可以unicode是一种更高级的字符流,这个字符流能存贮当今世界所以定义的字符,但是他只是一个规定字符集合,我们只需要把发现的字符放进去占据一个位置,但是我们不需要考虑屏幕是否认识这个字符,这个字符的存贮由编码方案负责,如utf-8这些,假如没有字符编码方案可以存贮这些,我们虽然在unicode上有这个字符但是我们无法print出来,所以我们必须将unicode转换成普通字符流,有人就会问了,假如我真的没有找到一个合适编码方案可以存贮所有语言,我们可以将他编码成unicode—escape类型,这里我们不多讲。

这就可以解释我们大部分碰到的错误unicodedecodeerror和unicodeencodeerror错误,都是因为字符编码方案不了解造成的,网上很多说碰到这种错误就encode,decode搞一下就行但是不弄清楚这背后的知识就会犯迷糊。

接下来我谈谈我遇到的错误吧,在爬取http://yjsy.ncu.edu.cn/yjs_showmsg.asp?id=2770这个页面时(这是一个不规范的页面没有设置charset),因为每个spider调用的

response.xpath('//xpath').extract()    

选择器返回的是一个unicode编码的字符集,但是他是接受的是一个字符流,spider可能调用了
response.body.decode(response.encoding)进行转码,但是这个response.encoding有时候会判断错误,比如将我一个gbk编码的文件判断成cp1253,这个时候假如我把他解码成encode成其他编码方式的话,我们就会得到乱码,那怎么纠正呢,我们可以这样干
先将得到的列表中每个content取出来,然后使用content.encode(resonse.encoding)转码成原始字符流,现在你可以将它用正确的编码转换成unicode了

下面是我github上的关于这个scrapy的项目,在coding_pitch.py文件里面就是对于这个乱码的处理

南昌大学教务处公告爬取

最近从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.

pandas的基本数据结构是DataFrame和Series,DataFrame可以看做是一张表
,Series可以看做一个有序队列,我们队数据的处理就通过操作者两个东西来
实现的

对于

由于有其他编程语言基础,所以对于python的学习并不吃力,但是整体感觉python的确与前面学习c、c———

1. 实时编译VS静态编译

不需要输入任何前缀,直接将代码放在python解释器上面就能运行,虽然window下不支持直接点开文件就能使用,但是只要安装了python解释器就能很轻松的运行。

分量轻是他的特点吧!相比打开vs等半天然后,编译连接最后执行。python是一门很轻巧的语言,没有满屏的分号,大括号,基本类型比如int、string、float不区分直接拿来用就可以了,任何一个变量都是一个对象,对象可以千变万化,感觉python是一门很野的熊孩子什么都不在乎,比如说你什么了相同的两个变量

这门强类型语言则不允许,在同级作用域内他只允许声明一次,python或许已经没有声明了,每个名字只是一个对象而已并没有他的归属。

2.动态语言VS静态语言

给我感受是一颗静止的树的话,那么python就是一匹‘野马’,C

学了鸟哥的书前面基础后,突然想在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可以用了。。。。。。

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

起因

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

买了两本书

大数据时代

失控

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

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

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

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

但是现在不同.

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

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

用混杂性而不是精确性

用相关关系而不是因果性