导图社区 Python基础(全)
一篇思维导图带你详细了解Python基础知识点。共包括六个方面的内容,框架清晰,知识点全面。适合知识点整理以及背诵的小伙伴哟!
编辑于2023-02-25 08:39:26Python基础(全)
指南
Python-从入门到精通
参考
----Bioinformation--博客园
http://www.cnblogs.com/leezx/p/6385327.html 数据挖掘和机器学习
生物信息Python从入门到精通
https://mp.weixin.qq.com/s?__biz=MzAxMDkxODM1Ng==&mid=2247484004&idx=1&sn=84c121c8af32a2a07e52d2c96f56dd24&chksm=9b4842dfac3fcbc9859a4f7bc2d7d4e6a9d22422199a922d2b51ccfe2b96d2ec2c6a7fb2d9d3&scene=21#wechat_redirect
基本知识点
1 基本语法
缩进:4个空格
版本问题:建议3
文件编码声明:python会去环境变量里寻找python解释器。如果代码里有中文,则要以utf-8编码
#!/usr/bin/env python
#-*- coding: utf-8 –*-
变量定义:使用前要先定义
dir():列出一个数据类型或对象的所有方法,非常好用,同help()
文件操作:f = open(),f.close();with open() as f: ,os.path.exists(),os.path.isfile(),os.path.abspath()
目录操作:os.mkdir(),os.rmdir(),os.listdir(),os.chdir()
开发环境选择:
Sublime Text 对Python支持挺好,轻量级生化武器(推荐)
PyCharm
2 处理数据
2.1 基本数据类型:布尔;整型;浮点型;字符串
# 字符串的内置函数,都比较有用
'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'
2.2 基本数据结构:列表、元组、字典、集合。数据结构就是一种容器,用于在内存中存放我们的数据。
列表:任意元素组成的顺序序列,以位置为索引。
# 列表的内置函数
'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'
元组:相当于不可变的列表,防止错误修改,节省内存开销。元组解包
# 元组的内置函数
'count', 'index'
字典:键值对,没有顺序,键必须是常量。
# 字典内置函数
'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'
集合:没有顺序,元素之间没有重复,相当于舍弃了值的字典。集合操作(&,|,-,^,<,<=,>,>=)
# 集合内置函数
'add', 'clear', 'copy', 'discard', 'pop', 'remove', 'update''isdisjoint','issuperset','issubset','symmetric_difference','difference','union', 'intersection', 'symmetric_difference_update','intersection_update','difference_update',
2.3 控制语句
条件:if…else…
循环:for,while,break,continue
2.4 模块使用
Python有着非常友好的模块安装方法,一个pip install命令几乎可以安装绝大多数的模块。建议使用模块前多看相关API文档。
最常用的模块有:sys,os,re,csv,gzip,fileinput,random,collections,time;百度上有很多很好的模块使用入门教程。
正则表达式 re
有序字典 collections.OrderedDict()
调用系统命令 subprocess.call()
http://www.jb51.net/article/48086.htm
精通标准
当然这只是个噱头,精通的道路是无止境的,下面只是罗列了一些常见的高级特性。
切片,推导式,生成器,异常处理
高级模块:threading(多线程),ctypes(调用C程序优化性能),logging(日志)
专业模块:pysam - 处理基因组数据(fasta/fastq/bam/vcf)的Python模块
pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)
http://pysam.readthedocs.io/en/latest/api.html
https://www.cnblogs.com/leezx/p/5908767.html
Biopython:Python的计算分子生物学和生物信息学工具包
http://biopython-cn.readthedocs.io/zh_CN/latest/
编写自己的package:解决某个特定需求,上传到 PyPI,然后你就成为大神了
编程规范:写出规范化的代码 Google Python coding style
https://zh-google-styleguide.readthedocs.io/en/latest/
函数式编程:即使代码量暴增也不会影响代码的可读性,调试和Debug也会变得非常简单。
面向对象编程:最高级的编程方法,对函数进行分类和封装,让开发“更快更好更强...”
最后,Python只是一门编程语言,一种实现工具。如果你想深入某个领域,其实真正重要的是技术背后的算法
推荐资源
Python教程 - 廖雪峰的官方网站
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
python初级教程:入门详解
http://www.crifan.com/files/doc/docbook/python_beginner_tutorial/release/html/python_beginner_tutorial.html
Python 面向对象(初级篇)
http://m.blog.csdn.net/article/details?id=50760467
Python | Codecademy
https://www.codecademy.com/zh/learn/python
Google Python编码风格
http://www.yeolar.com/note/2013/01/10/python-style-guide/
Python正则表达式指南
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
《Python学习手册》
《Python编程金典》
《Bioinformatics Programming Using Python》
基础
基础语法
参考:
菜鸟教程
编码
# -*- coding: cp-1252 -*-
标识符
第一个字符必须是字母表中字母或下划线'_'
标识符的其他的部分有字母、数字和下划线组成。
标识符对大小写敏感。
Python保留字
保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字。
注释
单行注释
多行注释
行与缩进
同一个代码块的语句必须包含相同的缩进空格数
多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠(\)来实现多行语句
在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(\)
数据类型
整数, 如 1
长整数 是比较大的整数
浮点数 如 1.23、3E-2
复数 如 1 + 2j、 1.1 + 2.2j
字符串
python中单引号和双引号使用完全相同。
使用三引号('''或""")可以指定一个多行字符串。
转义符 '\'
自然字符串, 通过在字符串前加r或R。 如 r"this is a line with \n" 则\n会显示,并不是换行。
python允许处理unicode字符串,加前缀u或U, 如 u"this is an unicode string"。
字符串是不可变的。
按字面意义级联字符串,如"this " "is " "string"会被自动转换为this is string
空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。
同一行显示多条语句
Python可以在同一行中使用多条语句,语句之间使用分号(;)分割
多个语句构成代码组
缩进相同的一组语句构成一个代码块,我们称之代码组。
像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。
我们将首行及后面的代码组称为一个子句(clause)。
Print 输出
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""
import 与 from...import
在 python 用 import 或者 from...import 来导入相应的模块。
将整个模块(somemodule)导入,格式为: import somemodule
从某个模块中导入某个函数,格式为: from somemodule import somefunction
从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
将某个模块中的全部函数导入,格式为: from somemodule import *
等待用户输入
详细版
第一行注释
#!/usr/bin/python3
#!/usr/bin/env python3
推荐写法
在 Windows 下可以不写第一行注释
编码(第二行)
默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。当然你也可以为源码文件指定不同的编码:
# -*- coding: cp-1252 -*-
标识符
第一个字符必须是字母表中字母或下划线'_'。
标识符的其他的部分有字母、数字和下划线组成。
标识符对大小写敏感。
在Python 3中,非-ASCII 标识符也是允许的了。
保留字
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
http://blog.csdn.net/jingwuge/article/details/48519689
and del from not while as elif global or with assert else if pass yield break except import print class exec in raise continue finally is return def for lambda try
注释
Python中单行注释以 # 开头
多行注释可以用多个 # 号
行与缩进
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。
多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠(\)来实现多行语句
total = item_one + \
item_two + \
item_three
在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(\)
数据类型
python中数有四种类型:整数、长整数、浮点数和复数。
整数, 如 1
长整数 是比较大的整数
浮点数 如 1.23、3E-2
复数 如 1 + 2j、 1.1 + 2.2j
字符串
python中单引号和双引号使用完全相同。
使用三引号('''或""")可以指定一个多行字符串。
转义符 '\'
自然字符串, 通过在字符串前加r或R。 如 r"this is a line with \n" 则\n会显示,并不是换行。
python允许处理unicode字符串,加前缀u或U, 如 u"this is an unicode string"。
字符串是不可变的。
按字面意义级联字符串,如"this " "is " "string"会被自动转换为this is string。
空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。
空行与代码缩进不同,空行并不是Python语法的一部分。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
记住:空行也是程序代码的一部分。
等待用户输入
input("\n\n按下 enter 键后退出。")
同一行显示多条语句
Python可以在同一行中使用多条语句,语句之间使用分号(;)分割
多个语句构成代码组
缩进相同的一组语句构成一个代码块,我们称之代码组。
Print 输出
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""
import 与 from...import
在 python 用 import 或者 from...import 来导入相应的模块。
将整个模块(somemodule)导入,格式为: import somemodule
从某个模块中导入某个函数,格式为: from somemodule import somefunction
从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
将某个模块中的全部函数导入,格式为: from somemodule import *
模块调用详情
知识背景
Python 是一种“面向对象编程语言。”而里面最重要的结构之一 class(类),可视 程序架构更为整齐。
面向对象编程的起步知识就是模块的调用。
关键词:模块的定义、模块的如何调用、模块如何创建
1.模块的基本属性:
模组是包含函数和变量的 Python 文件
你可以 import(导入)这个文件
然后你可以使用'.'操作符访问到模组中的函数和变量。{模块名.函数名}
2.模块的导入
2.1.采用关键词"import"来引入某个模块。(import 模块名)
栗子:引用 math 模块,即可用 import math 来导入。
2.2.调用模块中的函数格式: 模块名.函数名
Q: 如何必须加上模块名来调用函数
A:因为不同模块存在同名称函数,解释器就分别不清是谁家的孩子了.
思考:若两个模块都有 open 函数,如何导入呢?
{ module1.open(···) module2.open(···) }
#由此可见带上模块名调用函数名就很容易解析出是那家的孩子了。
栗子:
import math #导入函数模块 print sqrt(2) #错误,(× )无法识别! print (math.sqrt(9))(√)
2.3.从模块中调用某个函数常用语句:
from 模块名 import 函数名 1,函数名 2,······
注意:
1.通过这种方式的导入函数,不能给出模块名,但当引入两个模块含有同一名称函数的时候,后一次模块的函数会覆盖前者。
2.这种通常用于单一几个函数的调用。
3.小栗子:
from math import sqrt sqrt(9)
2.4.重命名:可以在语句末尾增加一个 as 子句,在该子句后给出想要使用的别名
2.4.1 给整个模块重命名
import math as foobar foobar.sqrt(4) 2.0
2.4.2 为函数提供别名
from math import sqrt as foobar foobar(4)
3.模块的通用模式
3.1 常见模块导入模式的形式(复习)
import 模块名 from 模块名 import 函数名 from 模块名 import 函数名 1,函数名 2,···· from 模块名 import * (不常用) (只有确定自己想要从给定的模块导入所有功能时,才应该使用最后一个模板)
3.2 模块的通用模式思路(2 步走)
1.拿(导入)一个模块容器
2.通过模块名称从而获取其中的函数
命令行参数
很多程序可以执行一些操作来查看一些基本信,Python可以使用-h参数查看各参数帮助信息
命令行参数设置
getopt 模块来获取命令行参数
Python 中也可以所用 sys 的 sys.argv 来获取命令行参数:
sys.argv 是命令行参数列表。
len(sys.argv) 是命令行参数个数。
注:sys.argv[0] 表示脚本名。
$ pythontest.pyarg1 arg2 arg3
getopt模块
getopt模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式(-)和长选项模式(--)。
该模块提供了两个方法及一个异常处理来解析命令行参数。
getopt.getopt 方法
getopt.getopt 方法用于解析命令行参数列表,语法格式如下:
getopt.getopt(args, options[, long_options])
方法参数说明:
args: 要解析的命令行参数列表。
options: 以字符串的格式定义,options后的冒号(:)表示该选项必须有附加的参数,不带冒号表示该选项不附加参数。
long_options: 以列表的格式定义,long_options 后的等号(=)表示如果设置该选项,必须有附加的参数,否则就不附加参数。
该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有'-'或'--'的参数。
Exception getopt.GetoptError
在没有找到参数列表,或选项的需要的参数为空时会触发该异常。
异常的参数是一个字符串,表示错误的原因。属性 msg 和 opt 为相关选项的错误信息。
http://www.runoob.com/python3/python3-command-line-arguments.html
数据类型
简述
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。
等号(=)用来给变量赋值。
等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。
多个变量赋值
a = b = c = 1
标准数据类型
Number(数字)
int、float、bool、complex(复数)
String(字符串)
Python 字符串不能被改变。向一个索引位置赋值,比如word[0] = 'm'会导致错误。
List(列表)
列表是写在方括号([])之间、用逗号分隔开的元素列表
列表截取的语法格式如下:变量[头下标:尾下标]
列表中的元素是可以改变的
和字符串一样,list可以被索引和切片
List可以使用+操作符进行拼接
Tuple(元组)
元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号(())里,元素之间用逗号隔开。
Sets(集合)
集合(set)是一个无序不重复元素的序列。
基本功能是进行成员关系测试和删除重复元素。
Dictionary(字典)
字典(dictionary)是Python中另一个非常有用的内置数据类型。
列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是一种映射类型,字典用"{ }"标识,它是一个无序的键(key) : 值(value)对集合。
键(key)必须使用不可变类型。
在同一个字典中,键(key)必须是唯一的。
Python数据类型转换
数据内置的类型进行转换将数据类型作为函数名
详细版 基本数据类型:布尔;整型;浮点型;字符串
不需要声明必须赋值赋值以后该变量才会被创建
它没有类型
给变量赋值
等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。
多个变量赋值
Python允许你同时为多个变量赋值。
a = b = c = 1
a, b, c = 1, 2, "runoob"
标准数据类型
Number(数字)
Python3 支持 int、float、bool、complex(复数)
在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
type()
或者 isinstance(a, int)
区别就是:
type()不会认为子类是一种父类类型。
isinstance()会认为子类是一种父类类型。
del语句删除一些对象引用
del var1[,var2[,var3[....,varN]]]]
您可以通过使用del语句删除单个或多个对象。例如:
del var
del var_a, var_b
数值运算
注意:
多个变量赋值
2、一个变量可以通过赋值指向不同类型的对象。
数值的除法(/)总是返回一个浮点数,要获取整数使用//操作符。
在混合计算时,Python会把整型转换成为浮点数。
Python还支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型
String(字符串)
Python中的字符串用单引号(')或双引号(")括起来,同时使用反斜杠(\)转义特殊字符。
字符串的截取的语法格式如下:
变量[头下标:尾下标]
0-1
加号 (+)星号 (*)
反斜杠(\)一个 r
续行符
没有单独的字符类型长度为1
字符串不能被改变。
注意:
使用r可以让反斜杠不发生转义。
用+用*
从左往右以0开始,从右往左以-1开始。
不能改变
List(列表)
最频繁的数据类型
可以不相同数字,字符串甚至可以包含列表(所谓嵌套)
方括号([])逗号
可以被索引和截取包含所需元素的新列表
列表截取的语法格式如下:
变量[头下标:尾下标]
0-1
加号(+)星号(*)
可以改变
append()、pop()
注意:
方括号之间逗号
索引和切片
用+
可以改变的
Tuple(元组)
不能修改小括号(())里逗号
也可以不相同
下标索引从0开始
字符串看作一种特殊的元组
可以包含可变的对象
构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则:
tup1 = () # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号
string、list和tuple都属于sequence(序列)
注意:
元组的元素不能修改
索引和切片
0或1个元素
+操作符
Sets(集合)
一个无序不重复元素的序列
基本功能是进行成员关系测试和删除重复元素。
set()
输出集合,重复的元素被自动去掉
print(a - b) # a和b的差集
print(a | b) # a和b的并集
print(a & b) # a和b的交集
print(a ^ b) # a和b中不同时存在的元素
Dictionary(字典)
字典(dictionary)是Python中另一个非常有用的内置数据类型。
有序的对象结合无序的对象集合键来存取
"{ }"标识无序的键(key) : 值(value)对集合。
键(key)必须使用不可变类型
键(key)必须是唯一
print (dict['one']) # 输出键为 'one' 的值
print (dict[2]) # 输出键为 2 的值
print (tinydict) # 输出完整的字典
print (tinydict.keys()) # 输出所有键
print (tinydict.values()) # 输出所有值
构造函数 dict() 可以直接从键值对序列中构建字典
另外,字典类型也有一些内置的函数,例如clear()、keys()、values()等。
注意:
映射类型键值对
不可变类型不能重复
{ }
Python数据类型转换
数据内置的类型进行转换将数据类型作为函数名
以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。
函数描述
int(x [,base]) 将x转换为一个整数
long(x [,base] ) 将x转换为一个长整数
float(x) 将x转换到一个浮点数
complex(real [,imag]) 创建一个复数
str(x) 将对象 x 转换为字符串
repr(x) 将对象 x 转换为表达式字符串
eval(str) 用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s) 将序列 s 转换为一个元组
list(s) 将序列 s 转换为一个列表
set(s) 转换为可变集合
dict(d) 创建一个字典。d 必须是一个序列 (key,value)元组。
frozenset(s) 转换为不可变集合
chr(x) 将一个整数转换为一个字符
unichr(x) 将一个整数转换为Unicode字符
ord(x) 将一个字符转换为它的整数值
hex(x) 将一个整数转换为一个十六进制字符串
oct(x) 将一个整数转换为一个八进制字符串
2 基本数据结构:列表、元组、字典、集合。数据结构就是一种容器,用于在内存中存放我们的数据。
列表:任意元素组成的顺序序列,以位置为索引。
# 列表的内置函数
'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'
元组:相当于不可变的列表,防止错误修改,节省内存开销。元组解包
# 元组的内置函数
'count', 'index'
字典:键值对,没有顺序,键必须是常量。
# 字典内置函数
'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'
集合:没有顺序,元素之间没有重复,相当于舍弃了值的字典。集合操作(&,|,-,^,<,<=,>,>=)
# 集合内置函数
'add', 'clear', 'copy', 'discard', 'pop', 'remove', 'update''isdisjoint','issuperset','issubset','symmetric_difference','difference','union', 'intersection', 'symmetric_difference_update','intersection_update','difference_update',
3 控制语句
条件:if…else…
循环:for,while,break,continue
4 模块使用
Python有着非常友好的模块安装方法,一个pip install命令几乎可以安装绝大多数的模块。建议使用模块前多看相关API文档。
最常用的模块有:sys,os,re,csv,gzip,fileinput,random,collections,time;百度上有很多很好的模块使用入门教程。
正则表达式 re
有序字典 collections.OrderedDict()
调用系统命令 subprocess.call()
http://www.jb51.net/article/48086.htm
其他
参考
生信宝典陈同
极简教程 (一)
只要在终端输入python test.py并回车就可以运行这个文件。
chmod 755 test.p./test.py
层级缩进
“unexpected indent”
expected an indented block”
“unindent does not match any outer indentation level”
变量、数据结构、流程控制
type(a)
"这是保留节目,通常判断变量的类型使用的不是type是isinstance."
isinstance(a,int)
True
#a
#占位符print#占位符print
"The length of this string <%s> is %d" % (a, len(a))
The length of this string <Hello, welcome to Python> is 24
%f浮点数
%d整数
%s字符串
利用split分割字符串
str1 = "a b c d e f g"
strL = str1.split(' ')
c = a + ', ' + b
考虑到字符串是不可修改的,每次连接操作都是新开辟一个内存空间,把字符串存到里面,这样的连接操作执行几十万次会很影响运行速度。''
\\转义字符
linux下为 \n
去除字符串中特定的字符。通常我们在文件中读取的一行都包含换行符
strip()
方法用于移除字符串头尾指定的字符(默认为空格)。
str.strip([chars]);
a.replace
字符串的替换
a = "Hello, Python"
b = a.replace("Hello","Welcome")
help(str)
print "字符串帮助"
大小写判断和转换
判断
(a, a.islower())
转换
(a, a.lower())
(a, a.upper())
字符串是不可修改的
同一个变量名字赋不同的值实际是产生了多个不同的变量。不同的变量名字赋同样的值,用于比较时相等,但引用不同的区域
list()
字符串转数组
元组转换为列表
join()
join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
连接数组的每个元素(每个元素必须为字符串)
最合适的连接大量字符串的方式
语法: 'sep'.join(seq)
参数说明
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串
os.path.join(): 将多个路径组合后返回
语法: os.path.join(path1[,path2[,......]])
返回值:将多个路径组合后返回
数字字符串转数值
int(a)+1
float(a)+1
从文件或命令行参数中取出的数字都是字符串形式出现,做四则运算时要先用int 或 float转换
数组操作
#向数组中增加元素
aList.append(6)
向数组中增加一个数组
aList.extend(bList)
在数组中删除元素
#只删除第一个匹配的
#移除元素的下标为3的字符
pop和remove是不一样的,remove是移除等于给定值的元素,pop是移除给定位置的元素
#遍历数组的每个元素
for ele in aList:
print ele
数组元素排序
aList.sort()
数组反序
a.reverse()
翻转
元组操作
增加一个元素
aSet.add(4)
Range使用
使用range,产生一系列的字符串
for i in range(16):
通过指定步长产生4的倍数的数
for i in range(0,16,4):
字典操作
输出字典的键值对(key-value)
for key, value in aDict.items():
print key,value
有序输出字典的键值对(key-value)
keyL = aDict.keys()
keyL.sort()
for key in keyL:
print key, aDict[key]
字典的value可以是一个列表
字典的value也可以是字典
学习教程
输入输出
交互式输入输出
文件读写
写入
以写入模式(w)打开一个文件并命名为(Test_file.txt)"
fh = open("Test_file.txt","w")
print >>fh, context
#fh
#文件操作完成后必须关闭文件句柄
只读
以只读模式(r)读入一个名为(Test_file.txt)的文件
printfor line in open("Test_file.txt"):
print line
避免中间空行的输出
在print语句后加上逗号(,)可以阻止Python对每次输出自动添加的换行符
print line,
去掉每行自身的换行符
print line.strip()
函数操作
def
内建的函数
len
range
模块
Python内置了很多标准库,如做数学运算的 math, 调用系统功能的 sys, 处理正则表达式的 re, 操作系统相关功能的 os等
sys
sys.argv 处理命令行参数
sys.argv是一个列表,存储了包含程序名字在内的传给程序的命令行参数。
sys.exit() 退出函数
sys.stdin 标准输入
sys.stderr 标准错误
os
os.system()或os.popen() 执行系统命令
os.getcwd() 获取当前目录
os.remove() 删除文件
关于Python中的__main__和编程模板
参考
关于Python中的__main__和编程模板
https://mp.weixin.qq.com/s?__biz=MzI5MTcwNjA4NQ%3D%3D&mid=2247484893&idx=1&sn=a79e37c46dea9af66d59fa87dcd9e742#wechat_redirect
简单的说,每当运行一个python脚本的时候,都会自动生成一个variable叫__name__。
如果直接运行此脚本,__name__ 的值则自动为 __main__。如果此脚本是在其它脚本中被作为一个包导入运行的 (每个python脚本都可以直接作为一个包来使用),__name__的值会自动为其所在文件的文件名。
因此,if__name__ == ' _ _ main _ _':可用来限定脚本读取的环境,从而保证该脚本在做为包被导入时不会直接启动程序的执行。
一个模板
IO编程
Input输入流:从磁盘外设读取文件到内存
Output输出流:从内存写入磁盘文件
IO同步:CPU等待IO执行结果再继续执行程序
IO异步:CPU不等待IO执行结果去做其他计算
读写 Input/Output (内置open()调用操作系统接口函数)
StringIO/BytesIO
>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'
1.如果文件很小,read()一次性读取最方便;
with open('/path/to/file', 'r') as f:
print(f.read())
2.如果不能确定文件大小,反复调用read(size)比较保险;
3.如果是配置文件,调用readlines()最方便:
for line in f.readlines():
print(line.strip()) # 把末尾的'\n'删掉
In [1]: f = open('/home/wuchaochao/python/chuang.jpeg','rb')
In [2]: f.read()
Out[2]: b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x02\x01\x00H\x00H\x00\x00\xff\xe1\x1a\x7fExif
字符编码(非UTF-8编码的文本文件)
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
>>> f.read()
'测试'
写文件
要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
操作文件和目录 (内置os模块调用操作系统接口函数)
路径操作(规避不同操作系统分隔符号)
合成路径os.path.join()
拆分路径os.path.split()
>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
#os
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
#列出当前目录下py文件
>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']
目录操作
# 查看当前目录的绝对路径: >>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')
序列化(pickle模块)
序列化与反序列
In [4]: d = dict(name='Bob',age=20,score=90)
In [5]: pickle.dumps(d)
Out[5]: b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00Bobq\x02X\x05\x00\x00\x00scoreq\x03KZX\x03\x00\x00\x00ageq\x04K\x14u.'
In [6]: with open('/home/wuchaochao/test.txt','wb') as f:
...: f.write(pickle.dumps(d))
...:
In [7]: f = open('/home/wuchaochao/test.txt','rb')
In [8]: d = pickle.load(f)
In [9]: f.close
Out[9]: <function BufferedReader.close>
In [10]: f.close()
In [11]: d
Out[11]: {'age': 20, 'name': 'Bob', 'score': 90}
1.JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。
2.JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
In [12]: import json
In [13]: d = dict(name='Bob',age=20,score=90)
In [14]: json.dumps(d)
Out[14]: '{"name": "Bob", "score": 90, "age": 20}'
In [15]: json_str = json.dumps(d)
In [16]: json.loads(json_str)
Out[16]: {'age': 20, 'name': 'Bob', 'score': 90}
详细版
文件处理--慕课网
概念:文件是对象
属性:用户,读,写,执行权限;
操作:
打开 f = open(name[,mode[buf]]) 文件路径 打开方式 缓冲大小
mode打开方式
r 只读 文件必须存在
w 只写 文件不存在创建 文件存在先清空内容
a 追加 文件不存在创建
r+/w+ 读写
r+ 从文件头写
w+ 清空文件再写
a+ 追加读写
二进制方式 加b 如 rb 只读
读取 read([size]) readline([size])--一行 readlines([size])--每行组成的列表
readlines的size和前面的size不一样 并且最多读到buff8198
iter 迭代器--推荐
写入
write(str) 字符串写入
writelines(sequence of strings) 写入多行 参数为可迭代的对象
文件缓冲到buffer
主动调用close或flush方法
大于缓存 写缓存自动同步到磁盘
关闭 close()
进程最大限制:1024个
文件指针
操作:
seek(offset[,whence]):移动文件指针;
偏移量(可以为负),
偏移相对位置
os.SEEK_SET/CUR/END 相对文件起始/当前/结尾位置
tell() 返回当前文件偏移
文件属性编码格式
文件属性
file.fileno() 文件描述符
file.mode 文件打开权限
file.encoding 文件编码格式
file.closed 文件是否关闭
标准文件
sys.stdin 文件标准输入
sys.stdout 文件标准输出
sys.stderr 文件标准错误
文件命令行参数
sys.argv属性 字符串组成的列表,通过它可得到命令行参数
编码格式
1. a=unicode.encode(u'中文','utf-8')
2. codecs模块 创建编码格式文件
open(fname,mode,encoding,errors,buffering)
os模块对文件和目录操作
它的每一个方法都是一个系统调用
os.open(filename,flag[,mode])打开文件
flag 打开文件方式 os_....
os.read(fd,buffersize) 读取
os.write(fd,string) 写入
os.iseek(fd,pos,how) 指针
os.close(fd) 关闭
目录操作
os.mkdir(),os.rmdir(),os.listdir(),os.chdir(),
os.path
os.path.exists(),os.path.isfile(),os.path.abspath(),os.path.isdir(),os.path.getsize(filename),os.path.dirname(p),os.path.basename()
ConfigParser模块--管理ini文件
代码编写前提
面向对象编程基本方法 对类和对象有一定了解
对文件有基本的认识 能正常操作文件
掌握ConfigParser模块基本使用
技巧
文件打开:with open('/path/file','r') as f: 推荐使用,减少代码量,处理一些异常情况
写入
with open("download.url","w") as f:
for i in path:
print(i,file=f)
f.close()
文件格式
生物信息中一般主流的文件格式有fasta、fastq、sra、Genebank、gtf、gff3、sam、bam等。
CSV CSV 表示“逗号分隔值(Comma Separated Value)”每一行代表一个单独的记录
文本处理目录操作常用函数
os.listdir(dirname):列出dirname下的目录和文件
os.getcwd():获得当前工作目录
os.curdir:返回但前目录(’.’)
os.chdir(dirname):改变工作目录到dirname
os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false
os.path.isfile(name):判断name是不是一个文件,不存在name也返回false
os.path.exists(name):判断是否存在文件或目录name
os.path.getsize(name):获得文件大小,如果name是目录返回0L
os.path.abspath(name):获得绝对路径
os.path.normpath(path):规范path字符串形式
os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
os.path.splitext():分离文件名与扩展名
os.path.join(path,name):连接目录与文件名或目录
os.path.basename(path):返回文件名
os.path.dirname(path):返回文件路径
数据分析
数据运算符
算术运算符
+
-
*
/
%
**
//
比较运算符
==
!=
>
<
>=
<=
赋值运算符
= 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c
+= 加法赋值运算符 c += a 等效于 c = c + a
-= 减法赋值运算符 c -= a 等效于 c = c - a
*= 乘法赋值运算符 c *= a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c **= a 等效于 c = c ** a
//= 取整除赋值运算符 c //= a 等效于 c = c // a
位运算符(难点)
二进制
逻辑运算符(and, or, not)
成员运算符
in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。
身份运算符
身份运算符用于比较两个对象的存储单元
is 判断两个标识符是不是引用自一个对象
is 与 == 区别:is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
is not 判断两个标识符是不是引用自不同对象
数据操作
变量(也叫“名字”或“变量名”)
定义:变量简单来讲就是编程中最基本的存储单元,变量就是会暂时性地存储你放进去的东西。
比如说 name = "沐风",就是一个叫做name的变量被赋值为"沐风"。就像每个人都有名字一样,变量的名字叫做标识符
命名规则
变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头,但不能以数字打头
比如name、name1、my_name、_name这些命名都是合法的,而1name不是合法的
变量名不能包含空格,区分大小写字母
变量名尽量简洁和有描述性。例如name比n好
尽量的使用驼峰写法,比如myName,studentName
http://baike.baidu.com/link?url=_yX_wxW_J2ILcK-6CWDf9ppTL1qvsUQuRyiRgIUvxApjWQ15fEpbwwHokg3hOxZp7UdundwDWbd3q80cpXRcHzPJANOdZtKMLH3tipzHzywyGT-9dTg2vlfkKPK6-_R8FC5UlHfiUPwy7Re25YbTT2Myj51Kp-oI7yjdjrgzmJ02DpfdDRAq_pmrTKjFIgdcAH0FjaFoIWiecvWR-5X_xow6Cyha7LTClWiwc5MveFe
字符串
定义:字符或字符序列(字幕、数字或标点符号)称为一个字符串
在创建一个字符串时,在字符量变加上引号(单引号双引号都可以),如“5”
>>> first = '5'
>>> second = '3'
>>> first + second
'53'
如果是数字没有加入引号,表示数值,而不是字符,比如5和“5”是不一样的
>>> first = 5
>>> second = 3
>>> first + second
8
如果两个字符串相加会生成一个新的字符串。比如"cat"+"dog",会打印出catdog
>>> print "cat" + "dog"
catdog
三个引号被用于过于长段的文字或者说明,只要三引号不完,就可以随意换行写下文字
使用
修改字符串的大小写
首字母大写:name.title()
全部大写:name.upper()
全部小写:name:lower()
拼接字符串 (把字符或字符串放在一起构成更长的字符串,叫拼接)
a +""+b
a+b
使用换行符添加空白
\n 换行
\t 缩进
删除空格
rstrip() //删除尾部的空格
lstrip()//删除头部
strip()//删除两端
使用字符串避免语法错误
例如'what's your name'
基本运算
加减乘除(+、-、*、/)
例如:1+1、2-1、1*2、2/1
tips:如果需要整除 3/2为整除,如需要求小数点则需要3.0/2
>>> print 3 / 2
1
>>> print 3.0 / 2
1.5
在 Python 2 中,做除法的方式为“整除”
>>> print 3/2
1.5
要在 Python 3 中做整除,要使用两个前斜杠(//)
>>> print 3//2
1
取余(求余数)%
>>> print 7 % 2
1
tip: 同时使用/和%,如,7除以2得3,余数是1
>>> print 7 / 2
3
>>> print 7 % 2
1
指数(求幂)**
指数用双型号表示 ** ,把3乘5次,读作“3 指数 5”
>>> print 3 * 3 * 3 * 3 * 3
243
>>> print 3**5
243
非整数作为指数,把3乘5.5次也可以
>>> print 3 ** 5.5
420.888346239
数据类型
主要讲解整数和小数(也称浮点数)(Int和float)
Int为整数类型。如1、2、3、4
float 为浮点数。比如 1.1、1.01等
运算顺序
运算顺序会按照数学的规则来运算
比如 2+3*2 = 8 而不是等于10
当然也可以这样运算:(2+3)*2 = 10
两种操作
自增 += ( 例如,score = score + 1 )
>>> number = 7
>>> number += 1
>>> print number
8
自减-= ( L例如,score = score – 1)
number increased by 1
>>> number = 7
>>> number -= 1
>>> print number
E记法 (类似科学计数法)
3.8 e 16,就是3.8乘以10的16次方,
1.752e–13,就是1.752乘以10的负13次方
注释
注释是对代码逻辑的表述,用来表达带来代码要做什么以及是如何是做的
注释也可以作为“伪代码”,来阐述你的编程逻辑
在Python中,注释用井号(# )标识。井号后面的内容都会被Python解释器忽略
本周碰到单词列表
Python [ˈpaɪθən]
GUI 图形用户界面
文本模式 text-mode [tekst məʊd]
控制台 console-mode [kən'səʊl]
命令行 command-line [kə'mɑ:ndl'aɪn]
输入 input [ˈɪnpʊt]
处理 process [ˈprəʊses]
输出 output [ˈaʊtpʊt]
整数 integer [ˈɪntɪdʒə(r)]
小数 decimal number [ˈdesɪml]
浮点数 floating-point number
实数 real number [riəl ˈnʌmbə]
整除 floor division [flɔ:(r) dɪˈvɪʒn]
赋值 assignment [əˈsaɪnmənt]
赋值操作符 assignment operator
操作符 operator [ˈɒpəreɪtə(r)]
操作数 operand [ˈɒpərænd]
提示符 prompt [prɒmpt]
分数 score [skɔ:(r)]
运算顺序 order of operation [ˈɔ:də ɔv ˌɔpəˈreiʃən]
自增 incrementing [ˈɪŋkrəməntɪŋ]
自减 decrementing ['dekrɪməntɪŋ]
求幂 exponentiation [ˌekspəʊˌnenʃɪ'eɪʃən]
科学计数法 scientific notation [ˌsaiənˈtifik nəuˈteiʃən]
上标 superscript [ˈsu:pəskrɪpt] 下标 subscript ['sʌbskrɪpt]
本周总结
如何使用变量
如何创建描述性变量名以及如何消除名称错误和语法错误
字符串是什么
以及如何使用小写、大写和首字母大写方式显示字符串
使用 空白来显示整洁的输出,以及如何剔除字符串中多余的空白
如何使用整数和浮点数
使用数值数据时需要注意的意外行为
如何编写说明性注释
python数据分析与展示1
维度:一组数据的组织形式
一维
二维
多维
一维数据
由对等关系的有序或无序的数据构成,采用线性方式组织
使用列表和集合类型
列表有序,集合无序
二维和多维
使用多维列表
高维数据
字典或数据表示格式
数据表示格式
json,xml,yaml
列表与数组
列表和数组都是一组数据的有序结构
列表数据类型可以不同
数组数据类型必须相同
Numpy
开源的python科学计算基础库
引用方法:import numpy as np
N维数组对象
数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据
设置专门属于对象,可以提高运算速度
科学计算中,一维数组所有数据类型往往相同
数组对象使用相同数据类型,可以节约内存和运算时间
ndarray
是一个多维数组对象,由两部分构成
实际的数据
描述这些数据的元数据(数据维度,数据类型等)
ndarray数组一般要求所有元素类型相同,数组下标从0开始
轴(axis)保存数据的维度,秩(rank)轴的数量
对象的属性
.ndim秩,即轴的数量或维度的数量
.shape表示ndarray对象的尺度,对于矩阵,n行m列
.size表示ndarray对象元素的个数
.dtype表示ndarray对象的元素类型
.itemsize表示ndarray对象中每个元素的大小,以字节为单位
ndarray数组创建方法
从python的列表、元组等类型型创建ndarray数组
x=np.array(list/tuple)
x=np.array(list/tuple,dtype=np.float32)
当np.array不指定dtype时,Numpy将根据数据情况关联一个dtype类型
使用Numpy中函数创建ndarray数组,如:arange,ones,zeros等
np.arange(n),类似range()函数,返回ndarray类型,元素从0到n-1
np.ones(shape),根据shape生成一个全1的数组,shape是元组类型
np.zeros(shape),根据shape生成一个全0的数组,shape是元组类型
np.full(shape,val),根据shape生成一个数组,每个元素值都是val
np.eye(n),创建一个正方n*n单位矩阵,对角线为1,其余为0
np.ones_like(a),根据数组a的形状生成一个全1的数组
np.zeros_like(a),根据数组a的形状生成一个全0的数组
np.full_like(a),根据数组a的形状生成一个数组,每个元素值都是val
使用Numpy中其他函数创建ndarray数组
np.linspace(),根据起止数据等间距的填充数据,形成数组
np.concatenate(),将两个或多个数组合并成一个新的数组
ndarray数组的变换
ndarray数组的维度变换
.reshape(shape),不改变数组类型,返回一个shape形状的数组,原数组不变
.resize(shape),与.reshape( )功能一致,但修改原数组
.swapaxes(ax1,ax2),将数组n个维度中的两个维度进行调换
.flatten(),对数组进行降维,返回折叠后的一维数组,原数组不变
ndarray数组的类型变换
new.a=a.astype(new_type)
ndarray数组向列表转换
a.tolist()
数组的索引和切片
一维数组的索引和切片:与python的列表类似
多维数组的索引
每个维度一个索引值,逗号分割
多维数组的切片
ndarray数组的运算
数组与标量之间的运算:作用于数组每一个元素
对ndarray中数据执行元素级运算的函数
np.abs(x)/np.fab(x),计算数组各元素的绝对值
np.sqrt(x),计算数组各元素的平方根
np.square(x),计算数组各元素的平方
np.log(x)/np.log10(x)/np.log2(x),计算数组各元素的自然对数、10底对数和2底对数
np.ceil(x)/np.floor(x),计算数组各元素的ceiling值或floor值
np.rint(x),计算数组各元素的四舍五入值
np.mod(x),将数组各元素的小数和整数部分以两个单独的数组形返回
np.exp(x),计算数组各元素的指数值
np.sign(x),计算数组各元素的符号值,1(+),0,-1(-)
csv文件只能存取一维和二维数组
多维数组存取
a.tofile(frame,sp='',format='%s')
frame:文件、字符串
sep:数据分割字符串,如果是空串,写入文件为二进制
format:写入数据的格式
np.fromfile(frame,dtype=float,count=-1,sep='')
frame:文件,字符串
dtype:读取的数据类型
count:读入元素的个数,-1表示读入整个文件
数据分割字符串,如果是空串,写入文件为二进制
Numpy的随机数函数
np.random()的随机函数1
rand(d0,d1,...,dn),根据d0-dn创建随机数数组,浮点数,[0,1),均匀分布
randn(d0,d1,...,dn),根据d0-dn创建随机数数组,标准正态分布
randint(low,[,high,shape]),根据shape创建随机整数或整数数组,范围是[low,high)
seed(s),随机数种子,s是给定的种子值
np.random()的随机函数2
shuffle(a),根据数组a的第一轴进行随排列,改变数组x
permutation(a),根据数组a的第一轴产生一个新的乱序数组,不改变数组x
choice(a[,size,replace,p]),从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认为False
np.random()的随机函数3
uniform(low,high,size),产生具有均匀分布的数组,low起始值,high结束值,size形状
normal(loc,scale,size),产生具有正态分布的数组,loc均值,scale标准差,size形状
poisson(lam,size),产生具有泊松分布的数组,lam随机事件发生率,size形状
Numpy的统计函数
np.random()的统计函数1
sum(a,axis=None),根据给定轴axis计算数组a相关元素之和,axis整数或数组
当axis=0时,求矩阵每一列上的元素的和
当axis=1时,求矩阵每一行上的元素的和
当axis=2时,求矩阵每个元素的和,即矩阵中每个数组的和
前提是有一个三维数组,且axis的值必须小于数组的维度
这里把生成的数组理解为矩阵,矩阵的每个元素为一个数组
mean(a,axis=None),根据给定轴axis计算数组a相关元素的期望(算数平均和),axis整数或数组
average(a,axis=None,weights=None),根据给定轴axis计算数组a相关元素的加权平均值
std(a,axis=None),根据给定轴axis计算数组a相关元素的标准差
var(a,axis=None),根据给定轴axis计算数组a相关元素的方差
np.random()的统计函数2
min(a)/max(a),计算数组a中元素的最小值,最大值
argmin(a)/argmax(a),计算数组a中元素的最小值,最大值的降一维后下标
unravel_index(index,shape),根据shape将一维下标index转换成多维下标
ptp(a),计算数组a中元素最大值与最小值的差
media(a),计算数组a中元素的中位数(中值)
Numpy的梯度函数
梯度:连续值之间的变化率,即斜率
np.random的梯度函数
np.gradient(f),计算数组f中元素的梯度,当f为多维时,返回每个维度梯度
只有一侧值时,梯度为(n-(n-1))/1
python数据分析与展示2
图像的数组表示
PIL库
图像是一个三维数组,维度分别为高度,宽度和像素RGB值
Matplotlib库介绍
Matplotlib库的使用
matplotlib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式
使用方法:import matplotlib.pyplot as plt
pyplot的plot()函数
plt.plot(x,y,format_string,**kwargs)
x:X轴上的数据,列表或数组
y:Y轴上的数据,列表或数组
format_string:控制曲线的格式字符串,可选
**kwargs:第二组或更多(x,y,format_string)
绘制多条曲线时,x必须有
format_string:控制曲线的格式字符串,可选
由颜色字符、风格字符和标记字符组成
pyplot的中文显示方法
pyplot默认不支持中文显示,需要使用reParams修改字体实现
改变全局字体
用法:matplotlib.rcParams['font.family']='SimHei'
plt.ylabel('纵轴(值)')
font.family:用于显示字体的名字
font.style:字体风格,正常'normal'或斜体“italic”
font.size:字体大小,整数字号或者“large/x-small”
第二种办法:在有中文输入的地方,增加一个属性:fontproperties
plt.xlabel('横轴:时间',fontproperties='SimHei')
pyplot的文本显示方法
plt.xlable(),对X轴增加文本标签
plt.ylable(),对Y轴增加文本标签
plt.title(),对图形整体增加文本标签
plt.text(),在任意位置增加文本
plt.annotate(),在图形中增加带箭头的注释
pyplot基础图表函数概述
pyplot基础图表函数
plt.plot(x,y,formstring),绘制一个坐标图
plt.boxplot(data,notch,position),绘制一个箱形图
plt.bar(left,height,width,bottom),绘制一个条形图
plt.barh(width,bottom,left,height),绘制一个横向条形图
plt.polar(theta,r),绘制极坐标图
plt.pie(data,explode),绘制饼图
pyplot直方图绘制
plt.hist()
bins参数:生成的直方图中,直方条的个数
pyplot散点图绘制
pandas库介绍
使用方法:import pandas as pd
pandas库的理解
两个数据类型:Series,DataFrame
基于上述类型的各类操作
基本操作、运算操作、特征类操作、关联操作等
pandas库的Series类型
Series类型由一组数据及与之相关的数据索引构成
从python列表创建:b=pd.Series([9,8,7,6],index=['a','b','c','d'])
从字典类型创建:d=pd.Series({'a':9,'b':40,'c':66})
从ndarray类型创建:d=pd.Series(np.arrange(25))
Series是一维带标签数组
Series类型基本操作
索引方法与ndarray类型相同,采用[]
Numpy中运算和操作可用于Series类型
可以通过自定义索引的列表进行切片
可以通过自动索引进行切片,如果存在自定义索引,则一同被切片
运算是基于索引的运算
对象和索引都可以有一个名字,存储在属性.name内
pandas库的DataFrame类型
简介
由共用相同索引的一组列构成
是一个表格型的数据类型,没列值类型可以不同
既有行索引,也有列索引。列称为index,axis=0;行称为coulum,axis=1
常用于表达二维数据,但可以表达多维数据
创建方法
二维ndarray对象
d=pd.DataFrame(np.arange(10).reshape(2,5))
由一维ndarray、列表、字典、元组或Series构成的字典
对象字典:e=pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([9,8,7,6],index=['a','b','c','d'])})
Series类型
其他的DataFrame类型
DataFrame是二维带标签数组
pandas库的数据类型操作
改变Series和DataFrame结构:增加和重排-重新索引.reindex()
参数index,columns新的行列自定义索引
参数fil_value重新索引中,用于填充缺失位置的值
参数method填充方法,ffill当前值向前填充,bfill向后填充
limit最大填充量
copy默任True,生成新对象,False时,新旧相等不复制
pandas库的数据类型运算
运算规则
算术运算根据行列索引,补齐后运算,运算默认产生浮点数
补齐时缺项填充NAN(空值)
二维和一维、一维和零维间为广播运算
不同维度间为广播运算,一维Series默认在轴1参与运算
使用运算方法可以领一维Series参与0轴运算:b.sub(c.axis=0)
采用+-*/符号进行的二元运算产生新的对象
比较运算法则
比较运算只能比较相同索引的元素,不进行补齐
二维和一维、一维和零维间为广播运算
采用><>=<===!=等符号进行的二元运算产生布尔对象
pandas库的数据排序
.sort_index(axis=1,ascending=True),对轴排序,默认以0轴排序
.sort_values(by,axis=0,ascending=True),真正的对数据排序
NaN统一放到排序末尾
pandas库的基本统计分析
适用于Series和DataFrame类型
.sum()计算数据的总和,按0轴计算,下同
.count()非NaN值的数量
.mean().median()计算数据的算数平均值,算数中位数
.var().std(),计算数据的方差,标准差
.min().max()计算数据的最小值,最大值
适用于Series类型
.argmin().argmax()计算数据最大值、最小值所在位置的索引位置(自动索引)
.idxmin().idxmax(),计算数据最大值、最小值所在位置的索引(自定义索引)
pandas库的累计统计分析
适用于Series和DataFrame类型
.cumsum(),依次给出前1,2,.。。。,n个数的和
.cumprod(),依次给出前1,2,.。。。,n个数的积
.cummax(),依次给出前1,2,.。。。,n个数的最大值
.cummin(),依次给出前1,2,.。。。,n个数的最小值
适用于Series和DataFrame类型,滚动计算
.rolling(w).sum(),依次计算相邻w个元素的和
.rolling(w).mean(),依次计算相邻w个元素的算术平均值
.rolling(w).var(),依次计算相邻w个元素的方差
,rolling(w).std(),依次计算相邻w个元素的标准差
.rolling(w).min().max(),依次计算相邻w个元素的最小值,最大值
pandas库的相关分析
X增大,Y增大,两个变量正相关
pandas
导入数据
pd.read_csv(filename):从CSV文件导入数据
pd.read_table(filename):从限定分隔符的文本文件导入数据
pd.read_excel(filename):从Excel文件导入数据
dtype 更改列的数据类型
df=pd.read_excel('银行明细汇总表.xlsx',dtype={'交易账号':object,'对手账号':object})
pd.read_sql(query, connection_object):从SQL表/库导入数据
pd.read_json(json_string):从JSON格式的字符串导入数据
pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据
导出数据
df.to_csv(filename):导出数据到CSV文件
df.to_csv('2.csv', index=False,encoding='utf-8'):不要 index 编码改为utf-8
df.to_excel(filename):导出数据到Excel文件
df.to_sql(table_name, connection_object):导出数据到SQL表
df.to_json(filename):以Json格式导出数据到文本文件
创建测试对象
pd.DataFrame(np.random.rand(20,5)):创建20行5列的随机数组成的DataFrame对象
pd.Series(my_list):从可迭代对象my_list创建一个Series对象
df.index = pd.date_range('1900/1/30', periods=df.shape[0]):增加一个日期索引
查看、检查数据
可见行列数
pd.options.display.max_rows = 80
pd.options.display.max_columns = 50
查看列 值 计数
分类数据用value_counts,数值数据用describe
df.借贷标志.value_counts():统计所有非零元素的个数
df_clean.describe()
len(df.借贷标志.value_counts()):有几个唯一值
Series查看
s.value_counts(dropna=False):查看Series对象的唯一值和计数
df.head(n):查看DataFrame对象的前n行
df.tail(n):查看DataFrame对象的最后n行
df.shape():查看行数和列数
http://df.info():查看索引、数据类型和内存信息
df.describe():查看数值型列的汇总统计
s.value_counts(dropna=False):查看Series对象的唯一值和计数
df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数
df.duplicated():显示数据中的重复值
df.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组
df[''].isnull().value_counts():返回某列的NAN数量
df[df['借贷标志'].isnull().values==True]:查看列有哪些nan
df.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组
检查字符类型
df[''].apply(lambda x: x.isalpha()):是否全部为字符
df[''].apply(lambda x: x.isalnum()):是否全部为数字
df[''].apply(lambda x: x.isdigit()):是否全部为字母
df[df.账户名称.isin([' '])] :查看列 特定值
数据选取
df[col]:根据列名,并以Series的形式返回列
df[[col1, col2]]:以DataFrame形式返回多列
s.iloc[0]:按位置选取数据
s.loc['index_one']:按索引选取数据
df.iloc[0,:]:返回第一行
df.iloc[0,0]:返回第一列的第一个元素
数据清理
删除 行 列
del df['Unnamed: 20']:列
df.drop(['a'],axis = 1,inplace= True):列
df.drop(1,axis = 0,inplace= True) :行
添加 行 列
列
df['交易卡号']=np.nan:
df['交易户名']='王志琰'
#变换列
变到第一行
df1=df.reindex_axis(['time'] + list(df.columns[:]), axis=1)
更改列名
df.columns = ['a','b','c']:更改所有列名
df.rename(columns=lambda x: x + 1):批量更改列名
df.rename(columns={'old_name': 'new_ name'}):选择性更改列名
处理空值
df.fillna(0):填充空值为0
loandata['loan_amnt']=loandata['loan_amnt'].fillna(loandata['total_pymnt']-loandata['total_rec_int']).astype(np.int64)
df.dropna():删除所有包含nan的行
df=df.dropna(subset=['借贷标志']) :删除 列 包含的nan行
df.dropna(axis=1):删除所有包含nan的列
df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行
处理重复
df.drop_duplicates(subset='列名',keep=‘first’):删除重复值,保留第一次出现值。
处理空格
strip : 必须是str格式
df["借贷标志"]=df["借贷标志"].astype('str') :需要转换成str
df.['']=df[''].map(str.strip):删除 列 数据两边空格
df.['']=df[''].map(str.lstrip):左
df.['']=df[''].map(str.rstrip):右
replace:替换空格
df['列']=df['列'].str.repalce(' ','')
大小写转换
df['']=df[''].map(str.upper):全部大写
df['']=df[''].map(str.lower):小写
df['']=df[''].map(str.title):首字母大写
数据分组:bins group_names 分组依据 cut 添加到df中
目的:0-5 A/5-10 B.。。。。。
bins = [0, 5, 10, 15, 20]
group_names = ['A', 'B', 'C', 'D']
loandata['categories'] = pd.cut(loandata['open_acc'], bins, labels=group_name
分列:http://bluewhale.cc/2016-08-21/python-data-cleaning.html
loandata.grade 为B-B2,B-B5
grade_split = pd.DataFrame((x.split('-') for x in loandata.grade),index=loandata.index,columns=['grade','sub_grade'])
完成数据分列操作后,使用merge函数将数据匹配会原始数据表,这个操作类似Excel中的Vlookup函数
loandata=pd.merge(loandata,grade_split,right_index=True, left_index=True)
替换
df['列']=df['列'].str.repalce('old','new')
例子 :df1['借贷标志']=df1['借贷标志'].str.replace('借','出')
字符串操作
http://www.bubuko.com/infodetail-1810571.html
df.str.wrap() 在指定的位置加回车符号
Series数据类型
s.astype(float):将Series中的数据类型(格式)更改为float类型
s.replace(1,'one'):用‘one’代替所有等于1的值
s.replace([1,3],['one','three']):用'one'代替1,用'three'代替3
df.set_index('column_one'):更改索引列
df.rename(index=lambda x: x + 1):批量重命名索引
数据处理
分组 标签
bins =[0,3,5,10,15,20,30,100] #数值分组
level = ['0-3','3-5','5-10','10-15','15-20','20-30','30+'] #分组标签
df_clean['level'] = pd.cut(df_clean['avgSalary'],bins = bins,labels =level)
排序
df.sort_values(col1):按照列col1排序数据,默认升序排列
df.sort_values(col2, ascending=False):按照列col1降序排列数据
df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据
组对象
df.groupby(col):返回一个按列col进行分组的Groupby对象
df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象
df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值
df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
计算
df.pivot_table(index=col1, values=[col2,col3], aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表
data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
data.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max
数据合并
df1.append(df2):将df2中的行添加到df1的尾部
df.concat([df1, df2],axis=1):将df2中的列添加到df1的尾部
df1.join(df2,on=col1,how='inner'):对df1的列和df2的列执行SQL形式的join
数据统计
a=df['交易金额'].sum():以列,求合
df.describe():查看数据值列的汇总统计
df.mean():返回所有列的均值
df.corr():返回列与列之间的相关系数
df.count():返回每一列中的非空值的个数
df.max():返回每一列的最大值
df.min():返回每一列的最小值
df.median():返回每一列的中位数
df.std():返回每一列的标准差
时间格式
df['time'] =pd.to_datetime(df['time'],format='%Y%m%d') :年 月 日
dataframe
筛选
筛选某列包含某值(df ,1(列名),a(valus))
df1=df[df.账户名称.isin(['刘亚波'])]
df1=df[df[""]==""]
df[df[] > 0.5]:选择列的值大于0.5的行
多条件筛选
df1=df[(df.账户名称.isin(['刘亚波']))&(df.进出标志.isin(['进']))]
df1 = df[(df['1']=='a')&(df['2']=='b')]
筛选多个列
df1=df[(df.账户名称.isin(['刘亚波']))&(df.进出标志.isin(['进']))]
required_key = ['1','2','3','4']
raw = raw[raw['a'].isin(required_key)]
python数据分析与挖掘实战
数据挖掘基础
数据挖掘定义
这种从数据中“淘金”,从大量数据(包括文本)中挖掘出隐含的、未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规律建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程,就是“数据挖掘”
数据挖掘任务
利用分类与预测、聚类分析、关联规则、时序模式、偏差检测、智能推荐等方法,帮助企业提取数据中蕴含的商业价值,提高企业的竞争力
数据挖掘过程
定义挖掘目标
数据取样(抽取数据的标准)
相关性
可靠性
有效性
衡量取样数据质量标准
资料完整无缺,各类指标项齐全
数据准确无误,反映的都是正常(而不是异常)状态下的水平
对获取数据的抽样方式
随机取样:数据集中的每一组观测值都有相同的被抽样的概率
等距抽样
分层抽样:不同层次可设定不同的概率。这种抽样结果通常更具有代表性
从起始顺序抽样
分类抽样
数据探索
目的
保证样本数据的质量,为保证模型质量打下基础
内容
异常值分析
缺失值分析
相关分析
周期性分析等
数据预处理
目的
保证样本数据的质量,为保证模型质量打下基础
内容
数据筛选
数据变量转换
缺失值处理
坏数据处理
数据标准化
主成分分析
属性选择
数据规约等
挖掘建模
数据挖掘应用类型
分类
聚类
关联规则
时序模式
智能推荐
建模时需要考虑:模型属于哪一种数据挖掘应用,选用哪种算法构建模型
模型构建反映的是采样数据内部结构的一般特征,并与该采样数据的具体结构基本吻合
模型评价
目的
从这些模型中自动找出一个最好的模型
根据业务对模型进行解释和应用
不同的数据模型有不同的分析方法
常用数据挖掘建模工具
SAS Enterprise Miner
IBM SPSS Modeler
SQL Server
决策树算法
聚类分析算法
Naive Bayes算法
关联规则算法
时序算法
神经网络算法
线性回归算法
Python
WEKA
KNIME
RapidMiner
TipDM
Python数据分析简介
python的数据结构
List(列表)
列表和元组都是序列结构
两者外形上区别:列表用方括号标记,元组用圆括号标记
两者功能上区别:列表可以被修改,元组不可以
与列表有关的函数是list,与元组有关的函数是Tuple
常用函数
a.append(1),将1添加到列表a末尾
a.count(1),统计列表a中元素1出现的次数
a.extend([1,2]),将列表[1,2]的内容追加到列表a的末尾中
a.index(1),从列表a中找出第一个1的索引位置
a.insert(2,1),将1插入列表a的索引为2的位置
a.pop(1),移除列表a中索引为1的元素
Tuple(元组)
Dictionary(字典)
从数学上讲,它实际是一个映射
Set(集合)
与列表区别
他的元素是不重复的,而且是无序的
它不支持索引
通过花括号{}或者set()函数创建一个集合
函数式编程
主要使用函数
lambda(),主要用来定义“行内函数”
#定义函数f
map(),用于逐一遍历
reduce(),用于递归计算
from fuctools import reduce,引入reduce函数
reduce(lambda x,y:x*y,range(1,n+1)),计算n的阶乘
filter(),它是一个过滤器,用来筛选出列表中符合条件的元素
使用filter()函数,首先需要一个返回值为bool型的函数
上述函数引入的最终目的是兼顾简洁好人效率的,它们的循环速度比内置的for()和while()要快得多
python数据分析工具
Numpy,为python提供数组功能,以及对数据进行快速处理的函数
Scipy,提供真正的矩阵,以及大量基于矩阵运算的对象与函数
Scipy包含的功能有最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理的图像处理、常微分方程求解和其他科学与工程中常用计算
Scipy依赖于Numpy,安装Scipy之前得先安装Numpy
Matplotlib,最著名的绘图库,主要用于二维绘图
pandas,python下最强大的数据分析和探索工具
StatsModels,pandas着眼于数据的读取、处理和探索,而StatsModels更注重数据的统计建模分析
Scikit-Learn,这是一个机器学习相关的库,包括数据预处理、分类、回归、聚类、预测、和模型分析等
Keras,用来搭建神经网络
Gensim,topic modeling for humans!
数据探索
数据质量分析
主要任务
检查原始数据中是否存在脏数据
脏数据一般是指不符合要求,以及不能直接进行相应分析的数据
缺失值
异常值
不一致的值
重复数据及含有特殊符号(如#、¥、*)的数据
缺失值分析
数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失
缺失值产生的原因
有些信息暂时无法获取,或者获取信息的代价太大
有些信息是被遗漏的
属性值不存在
缺失值的影响
数据挖掘建模将丢失大量的有用信息
数据挖掘模型所表现出的不确定性更加显著,模型中蕴含的规律更难把握
包含空值的数据会使建模过程陷入混乱,导致不可靠的输出
缺失值的分析
使用简单的统计分析,可以得到含有缺失值的属性的个数,以及每个属性的未缺失数、缺失数与缺失率等
缺失值处理分类
删除存在缺失值的记录
对可能值进行插补
不处理
异常值分析
简介
异常值分析是检验数据是否有录入错误以及含有不合常理的数据
重视异常值的出现,分析其产生的原因,常常成为发现问题进而改进决策的契机
异常值是指样本中的个别值,其数值明显偏离其余的观测值
异常值也称为离群点,异常值的分析也称为离群点分析
简单统计量分析
最常用的统计量是最大值和最小值
3σ原则
如果数据服从正态分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值
如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述
箱型图分析(p35)
箱型图提供了识别异常值的一个标准:小于QL-1.5IQR或大于QU+1.5IQR的值p
QL称为下四分位数,表示全部观察值中有四分之一的数据取值比它小
QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它大
IQR称为四分位数间距,是上下四分位数之差,其间包含了全部观察值的一半
一致性分析
数据不一致性是指数据的矛盾性、不相容性
不一致数据的产生主要发生在数据集成的过程中,这可能是被挖掘数据是来自于从不同的数据源、对于重复存放的数据未能进行一致性更新造成的
数据特征分析
分布分析
简介
分布分析能揭示数据的分布特征和分布类型
对于定量数据,可通过频率分布表、频率分布直方图、茎叶图进行直观分析
对于定性分类数据,可用饼图和条形图直观地显示分布情况
定量数据的分布分析
步骤
求极差
决定组距和组数
决定分点
列出频率分布表
绘制频率分布直方图
原则
个组之间必须是相互排斥的
各组必须将所有的数据包含在内
各组的组宽最好相等
定性数据的分布分析
饼图的每一个扇形部分代表每一类型的百分比或频数
条形图的高度代表每一类型的百分比或频数,条形图的宽度没有意义
对比分析
适用于指标间的横纵向比较、时间序列的比较分析
在对比分析中,选择合适的对比标准是十分关键的步骤
对比分析的两种形式
绝对数比较
相对数比较
相对数分类
结构相对数:将同一总体内的部分数值与全部数值对比求得比重,用以说明事物的性质、结构或质量
比例相对数:将同一总体内不同部分的数值进行对比,表明总体内各部分的比例关系
比较相对数:将同一时期两个性质相同的指标进行对比,说明同类现象在不同空间条件下的数量关系
强度相对数:将两个性质不同但有一定联系的总量指标进行对比,用以说明现象的强度、密度和普遍程度
计划完成程度相对数:是某一时期实际完成数与计划数的对比,用以说明计划完成程度
动态相对数:将同一现象在不同时期的指标数值进行对比,用以说明发展方向和变化的速度
统计量分析
简介
常从集中趋势和离中趋势两个方面进行分析
平均水平的指标是对个体集中趋势的度量,使用最广泛的是均值和中位数
反映变异程度的指标则是对个体离开平均水平的度量,使用较广泛的是标准差(方差)、四分位间距
集中趋势度量
均值:所有数据的平均值
加权平均值
频率分布表平均值
中位数
众数:数据集中出现最频繁的值,众数不具有唯一性
离中趋势度量
极差:最大值-最小值
标准差:数据偏离均值的程度
变异系数:度量标准差相对于均值的离中趋势
变异系数主要用来比较两个或多个具有不同单位或不同波动幅度的数据集的离中趋势
四分位数间距
四分位数包括上四分位数和下四分位数
四分位数间距越大,数据的变异程度越大;反之,说明变异程度越小
周期性分析
周期性分析是探索某个变量是否随时间变化而呈现出某种周期变化趋势
贡献度分析
贡献度分析又称帕累托分析,原理:帕累托法则,又称20/80定律
相关性分析
直接绘制散点图
绘制散点图矩阵
计算相关系数(p48)
pearson相关系数
Spearman秩相关系数
判定系数:相关系数的平方
python主要数据探索函数
基本统计特征函数(p50)
拓展统计特征函数
统计做图函数
python主要统计作图函数
.plot(),绘制线性二维图,折线图
.pie(),绘制饼图
.hist(),绘制二维条形直方图,可显示数据的分配情形
.boxplot(),绘制样本数据的箱形图
plot(logy=True),绘制y轴的对数图形
plot(yerr=error),绘制误差条形图
数据预处理
数据清洗
数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据、筛选掉与挖掘主题无关的数据,处理缺失值、异常值
缺失值处理
处理方法
删除记录
数据插补
均值/中位数/众数插补
使用固定值
最近临插补
回归方法
插值法
不处理
拉格朗日插值法
牛顿插值法
异常值处理
删除含有异常值的记录
视为缺失值
平均值修正
不处理
数据集成
实体识别
实体识别是指从不同数据源识别出现实世界的实体
任务:统一不同源数据的矛盾之处
常见形式
同名异义
异名同义
单位不统一
冗余属性识别
数据集成会导致数据冗余
同一属性多次出现
同一属性命名不一致导致重复
有些冗余属性可以用相关分析检测
数据变换
简单函数变换
将不具有正态分布的数据变换成具有正态分布的数据
规范化(归一化)
最小-最大规范化(离差标准化)
x'=(x-min)/(max-min)
将数值值映射到【0,1】之间
离差标准化保留了原来数据中存在的关系
是消除量纲和数据取值范围影响的最简单方法
0-均值规范化(标准差标准化)
x'=(x-x平)/σ
经过chu'li后的数据均值为0,标准差为1
x平为原始数据的均值,σ为原始数据的标准差
小数定标规范化
连续属性离散化
将连续属性变换成分类属性
离散化的过程
确定分类数
如何将连续属性值映射到这些分类值
常用的离散化方法
等宽法
等频法
基于聚类分析的方法
属性构造
小波变换
基于小波变换的特征提取方法
基于小波变换的多尺度空间能量分布特征提取
基于小波变换的多尺度空间的规模极大值特征提取
基于小波包变换的特征提取
基于适应性小波的神经网络的特征提取
小波基函数
一种具有局部支集的函数,并且平均值为0
常用的小波基由Haar小波基、db小波基等
小波变换(p73)
数据规约
意义
降低无效、错误数据对建模的影响,提高建模的准确性
少量且具代表性的数据将大幅度缩减数据挖掘所需要的时间
降低存储数据的成本
属性规约
目标:寻找出最小的属性子集并确保新数据子集的概率分布尽可能地接近原来数据集的概率分布
属性规约方法
合并属性:将一些旧属性何为新属性
逐步向前选择:每次从原来属性集合选一个最优属性
逐步向后删除:每次从当前属性集合中删除一个最差属性
决策树归纳
主成分分析:将许多相关性很高的变量转化成彼此相互独立或不相关的变量
数值规约
分类
有参数方法
无参数方法
无参数方法
直方图:使用分箱来近似数据分析
聚类:将数据元组视为对象
抽样:用比原始数据小得多的随机样本表示原始数据集
s个样本无放回简单随机抽样
s个样本有放回简单随机抽样
聚类抽样
分层抽样
参数回归
python主要数据预处理函数
interpolate,一维,高维数据插值
Scipy的一个子库,包含大量的插值函数
from scipy.interpolate import *,引入相应的插值函数
unique,去除数据中的重复元素,得到单值元素列表,它是对象的方法名
既是Numpy库的一个函数(np.unique()),也是Series对象的一个方法
使用方法
np.unique(D),D是一维数组,可以是list、array、Series
D.unique(),D是pandas的Series对象
isnull,判断是否空值
D.isnull()/D.notnull(),这里要求D是Series对象,返回一个布尔Series
notnull,判断是否非空值
PCA,对指标变量矩阵进行主要成分分析
from sklearn.decomposition import PCA
random,生成随机矩阵
挖掘建模
分类与预测
简介
分类和预测是预测问题的两种主要类型
分类主要是预测分类标号(离散属性)
预测主要是建立连续值函数模型,预测给定自变量对应的因变量的值
实现过程
分类:构造一个分类模型,输入样本的属性值,输出对应的类别,将每个样本映射到预先定义好的类别
预测:建立两种或两种以上变量间相互依赖的函数模型,然后进行预测或控制
实现过程
通过训练集建立分类/预测模型
在模型通过检验后进行预测或控制
常用的分类与预测算法
回归分析
决策树
人工神经分析
贝叶斯网络
支持向量机
回归分析
通过建立模型来研究变量之间互相关系的密切程度、结构状态及进行模型预测的一种有效工具‘
主要回归模型
线性回归:可用最小二乘法求解模型系数
非线性回归
Logistic回归:因变量一般有1和0两种取值
岭回归:参与建模的自变量之间具有多重共线性
主成分回归
Logistic回归分析介绍
Logistic函数
取1和取0的概率之比为p/(1-p),称为优势比
Logistic变换Logit(p)=ln(p/(1-p))
令Logit(p)=ln(p/(1-p))=z,则p=1/(1+e^(-z)),即为Logistic函数
Logistic回归模型(p87)
Logistic回归模型解释(p87)
logistic回归建模步骤
根据分析目的设置指标变量(因变量和自变量),然后收集数据,根据收集到的数据,对特征再次进行筛选
y取1的概率是p=P(y=1|X),取0概率是1-p。用ln(p/(1-p))和自变量列出线性回归方程,估计出模型中的回归系数
进行模型检验
模型应用
决策树
人工神经网络
分类与预测算法评价
python分类预测模型特点
聚类分析
常用聚类分析算法
K-Means聚类算法
聚类分析算法评价
python主要聚类分析算法
关联规则
资源
网站
资源列表
Guido van Rossum 个人主页,查看大牛的博客和访谈 https://gvanrossum.github.io//index.html
Beginner’s guide for python 官方指南 https://wiki.python.org/moin/BeginnersGuide
Python2 or 3比较 https://wiki.python.org/moin/Python2orPython3
Quick and Dirty python scripts 代码片段展示http://sebsauvage.net/python/programs.html
ActiveState收录的流行Python代码段 http://code.activestate.com/recipes/langs/python/ 此链接可下载打包版本 http://sebsauvage.net/python/recipes.zip
XKCD plot 有意思的应用http://nbviewer.jupyter.org/url/jakevdp.github.com/downloads/notebooks/XKCD_plots.ipynb
以色列特拉维夫大学python教程 Tel-Aviv https://github.com/yoavram/CS1001.py
一篇pandas使用notebook http://nbviewer.jupyter.org/github/phelps-sg/python-bigdata/blob/master/src/main/ipynb/pandas.ipynb
有趣的Jupyter notebook ,涉及多个领域、包 (代码、解释、图形、表格都在一起,数百份教程,快速学习的首选) https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks
另一个详细的教程 http://nbviewer.jupyter.org/github/lijin-THU/notes-python/blob/master/index.ipynb
小抄大全 http://blog.csdn.net/qazplm12_3/article/details/78782797
Python从新手到专家 http://www.kuqin.com/docs/diveintopythonzh-cn-5.4b/html/toc/
哈佛大学的算法课 (前面主要是python基本使用,回答问题,老教授会给发糖,现在好像找不到了,不过这个链接给了很多好的课) https://github.com/prakhar1989/awesome-courses
Python MOOC集锦 http://coursegraph.com/search_results/python
简明python教程 (翻看3遍即可) http://www.kuqin.com/abyteofpython_cn/
Google的Python课 https://blog.hartleybrody.com/google-python/
廖雪峰的Python教程 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
父与子的编程 (上到88岁,下到8岁,都可以阅读本书。它不仅以一种有趣的方式介绍了Python编程的知识,其中的最佳实践还适用于其他编程语言的学习。) http://www.ituring.com.cn/book/1353
哈佛计算机基础课 (基础概念,加深理解) http://open.163.com/special/opencourse/cs50.html
Python学习推荐
参考
https://mp.weixin.qq.com/s?__biz=MzI1MjU5MjMzNA==&mid=2247484564&idx=1&sn=4906d401c94da55ac5c99df3d2089b97&chksm=e9e02d35de97a423e907562dd961220a1ffbe19fe5fa45bda89faa09d6f1f7142365e306897a&mpshare=1&scene=21&srcid=1213uxzrGTxaIpJG57gthJaM#wechat_redirect
PyCharm配置
下载PyCharm专业版,使用edu邮箱申请专业版的许可证;
安装Anaconda科学计算环境;
在PyCharm中配置Anaconda
个性化修改PyCharm配置,主题修改成Darcula(黑色背景),代码字体设大。
软件开发流程
程序是成长起来的,不是搭建出来的。 (Software is grown, not built.) — Bill de hÓra
anaconda
anaconda自带的几个功能
jupyter notebook: 网页版的文本编辑器,能够用tab进行命令补全还有联想,比较适合用于代码试错阶段。
qtconsole: IPython的图形界面版, IPython是原生Python解释器的功能增强版(也就是vim和vi的区别,智能手机和普通手机的区别)。其实你可以在命令行下输入ipython启动,而且强烈推荐学习它。
spyder: 这是一种整合开发环境(IDE),常用于Python的数据分析也就是(如果你用Rstudio,你会感到莫名的熟悉感)。可以在左边输入大块代码,进行某一类数据分析,在右下方执行比较少量的代码,然后右上方则是可以在教程,变量管理,文件管理进行切换。
为什么要用anaconda
第三方包
可以进行python版本管理,自由切换不同版本的Python环境。
作为新手,装一个anaconda,那么根据环境变量的顺序,默认会使用anaconda的python,
软件安装非root
conda install
conda update
conda upgrae
IDE
Visual Studio Code
sublime
atom
vim
插件
更加简单粗暴的答案就是Windows用notepad++, Linux和mac用sublime或atom。没有任何原因,单纯个人看法。
教材的话
我推荐初学者
编程小白的第一本 Python 入门书
笨方法学Python
a byte of Python
进阶的话可以去看
流畅的python,
python核心编程
Python程序员都会喜欢的6个库
https://mp.weixin.qq.com/s?__biz=MzAwOTc3Mzg2Nw==&mid=2651696984&idx=1&sn=d7e17e4b06778721ad6b0b0753091e23&chksm=80a3791cb7d4f00a3edb4a97d1df344a96fb9bb8bdcacf5b7f127f867dff0845b7c4c6f88196&mpshare=1
70个Python练手项目列表
https://zhuanlan.zhihu.com/p/27931879?utm_medium=social&utm_source=ZHShareTargetIDMore
Python程序员应读的8本经典书籍
http://www.360doc.com/content/16/0505/20/32626470_556580941.shtml
Python开源项目
Workshop
参考
Workshop: 用Python做科学计算
https://mp.weixin.qq.com/s?__biz=MjM5NzU0MzU0Nw==&mid=2651376738&idx=2&sn=a9a471933df5f5d69cff38fafee1c444&chksm=bd2407768a538e60ff298e86609de3ab5c69031fa7b27c95b8978c2cadde4280053c9c473e4e&mpshare=1
在workshop中,我们涵盖了大量的核心软件包,并为您指明进一步研究的方向。 Workshop附有几个互动的Jupyter Notebook示例,用来说明SciPy生态系统的不同方面。
https://github.com/Andrewnetwork/WorkshopScipy
Workshop Notebooks示例
初学MNIST - 一个关于如何建立一个简单的神经网络用于MNIST数字分类的TensorFlow教程。
练习 - 用SymPy推导二次公式 - 使用SymPy推导二次公式的教程。
探索MNIST的多种形式 - 使用Scikit-Learn包通过应用PCA和K-Means方法来探索MNIST。同时也有其他交互组件。
Latex Essentials-向您展示使用LaTex进行排版和数学笔记的基础知识。
线性回归 - 空间解决方案 - 交互式组件用于探索线性回归。同时展示如何用matplotlib进行3D绘图。
线性回归 - 梯度下降 - 如何使用梯度下降来寻找最佳线性回归的教程。
线性函数对比非线性函数 - 展示如何进行2D和基本的3D绘图。也给你一个线性函数和非线性函数之间差异的直观认识。
作为函数&绘图向量的矩阵 - 展示如何使用Matplotlib绘制向量,并展示矩阵如何被视为线性变换。更多的使用了Matplotlib。
MNIST概率实验1 - 展示在MNIST上计算各种统计的不同实验。
神经布尔连接1 - 展示一个非常简单的单隐层神经网络,以及它如何表示XOR函数。还展示它如何表示AND。
SymPy基础知识 - 向您展示SymPy的一些基本功能。
泰勒序列 - 使用SymPy探索泰勒序列。同时也使用Matplotlib。
Poke Pandas - 使用Pandas分析pokemon游戏中有关小宠物的数据的notebook示例。
Workshop配置
下载Workshop的.zip文件:http://bit.ly/2A6dTYp
解压workshop.zip。 (查看文档)
下载Anaconda Navigator(AN)PYTHON 3.6版本https://www.continuum.io/downloads
从主页选项卡启动Jupyter Notebook服务。
浏览器应该在启动Jupyter Notebook服务时打开。 在该浏览器中,找到解压后的workshop文件夹。
点击setup.ipynb并按照说明操作。
wechat_jump_game
https://github.com/wangshub/wechat_jump_game
https://zhuanlan.zhihu.com/c_102060791
https://github.com/wangshub/wechat_jump_game/releases
https://wangshub.github.io/2017/12/29/%E6%95%99%E4%BD%A0%E7%94%A8Python%E6%9D%A5%E7%8E%A9%E5%BE%AE%E4%BF%A1%E8%B7%B3%E4%B8%80%E8%B7%B3/
更多
值得关注的5个Python开源项目
https://mp.weixin.qq.com/s?__biz=MjM5NzU0MzU0Nw==&mid=2651376811&idx=1&sn=b766afcead2fe5fdc7f13bd25a45476e&chksm=bd2407bf8a538ea9b3226b479b5dc9cfddd46e0425f845a68d6fdec334a0738c322c95f141f9
幕布
https://mubu.com/doc/6DtITTaOr
Python基础(全)
指南
Python-从入门到精通
参考
----Bioinformation--博客园
http://www.cnblogs.com/leezx/p/6385327.html 数据挖掘和机器学习
生物信息Python从入门到精通
https://mp.weixin.qq.com/s?__biz=MzAxMDkxODM1Ng==&mid=2247484004&idx=1&sn=84c121c8af32a2a07e52d2c96f56dd24&chksm=9b4842dfac3fcbc9859a4f7bc2d7d4e6a9d22422199a922d2b51ccfe2b96d2ec2c6a7fb2d9d3&scene=21#wechat_redirect
基本知识点
1 基本语法
缩进:4个空格
版本问题:建议3
文件编码声明:python会去环境变量里寻找python解释器。如果代码里有中文,则要以utf-8编码
#!/usr/bin/env python
#-*- coding: utf-8 –*-
变量定义:使用前要先定义
dir():列出一个数据类型或对象的所有方法,非常好用,同help()
文件操作:f = open(),f.close();with open() as f: ,os.path.exists(),os.path.isfile(),os.path.abspath()
目录操作:os.mkdir(),os.rmdir(),os.listdir(),os.chdir()
开发环境选择:
Sublime Text 对Python支持挺好,轻量级生化武器(推荐)
PyCharm
2 处理数据
2.1 基本数据类型:布尔;整型;浮点型;字符串
# 字符串的内置函数,都比较有用
'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'
2.2 基本数据结构:列表、元组、字典、集合。数据结构就是一种容器,用于在内存中存放我们的数据。
列表:任意元素组成的顺序序列,以位置为索引。
# 列表的内置函数
'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'
元组:相当于不可变的列表,防止错误修改,节省内存开销。元组解包
# 元组的内置函数
'count', 'index'
字典:键值对,没有顺序,键必须是常量。
# 字典内置函数
'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'
集合:没有顺序,元素之间没有重复,相当于舍弃了值的字典。集合操作(&,|,-,^,<,<=,>,>=)
# 集合内置函数
'add', 'clear', 'copy', 'discard', 'pop', 'remove', 'update''isdisjoint','issuperset','issubset','symmetric_difference','difference','union', 'intersection', 'symmetric_difference_update','intersection_update','difference_update',
2.3 控制语句
条件:if…else…
循环:for,while,break,continue
2.4 模块使用
Python有着非常友好的模块安装方法,一个pip install命令几乎可以安装绝大多数的模块。建议使用模块前多看相关API文档。
最常用的模块有:sys,os,re,csv,gzip,fileinput,random,collections,time;百度上有很多很好的模块使用入门教程。
正则表达式 re
有序字典 collections.OrderedDict()
调用系统命令 subprocess.call()
http://www.jb51.net/article/48086.htm
精通标准
当然这只是个噱头,精通的道路是无止境的,下面只是罗列了一些常见的高级特性。
切片,推导式,生成器,异常处理
高级模块:threading(多线程),ctypes(调用C程序优化性能),logging(日志)
专业模块:pysam - 处理基因组数据(fasta/fastq/bam/vcf)的Python模块
pysam - 多种格式基因组数据(sam/bam/vcf/bcf/cram/…)读写与处理模块(python)
http://pysam.readthedocs.io/en/latest/api.html
https://www.cnblogs.com/leezx/p/5908767.html
Biopython:Python的计算分子生物学和生物信息学工具包
http://biopython-cn.readthedocs.io/zh_CN/latest/
编写自己的package:解决某个特定需求,上传到 PyPI,然后你就成为大神了
编程规范:写出规范化的代码 Google Python coding style
https://zh-google-styleguide.readthedocs.io/en/latest/
函数式编程:即使代码量暴增也不会影响代码的可读性,调试和Debug也会变得非常简单。
面向对象编程:最高级的编程方法,对函数进行分类和封装,让开发“更快更好更强...”
最后,Python只是一门编程语言,一种实现工具。如果你想深入某个领域,其实真正重要的是技术背后的算法
推荐资源
Python教程 - 廖雪峰的官方网站
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
python初级教程:入门详解
http://www.crifan.com/files/doc/docbook/python_beginner_tutorial/release/html/python_beginner_tutorial.html
Python 面向对象(初级篇)
http://m.blog.csdn.net/article/details?id=50760467
Python | Codecademy
https://www.codecademy.com/zh/learn/python
Google Python编码风格
http://www.yeolar.com/note/2013/01/10/python-style-guide/
Python正则表达式指南
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html
《Python学习手册》
《Python编程金典》
《Bioinformatics Programming Using Python》
基础
基础语法
参考:
菜鸟教程
编码
# -*- coding: cp-1252 -*-
标识符
第一个字符必须是字母表中字母或下划线'_'
标识符的其他的部分有字母、数字和下划线组成。
标识符对大小写敏感。
Python保留字
保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字。
注释
单行注释
多行注释
行与缩进
同一个代码块的语句必须包含相同的缩进空格数
多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠(\)来实现多行语句
在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(\)
数据类型
整数, 如 1
长整数 是比较大的整数
浮点数 如 1.23、3E-2
复数 如 1 + 2j、 1.1 + 2.2j
字符串
python中单引号和双引号使用完全相同。
使用三引号('''或""")可以指定一个多行字符串。
转义符 '\'
自然字符串, 通过在字符串前加r或R。 如 r"this is a line with \n" 则\n会显示,并不是换行。
python允许处理unicode字符串,加前缀u或U, 如 u"this is an unicode string"。
字符串是不可变的。
按字面意义级联字符串,如"this " "is " "string"会被自动转换为this is string
空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。
同一行显示多条语句
Python可以在同一行中使用多条语句,语句之间使用分号(;)分割
多个语句构成代码组
缩进相同的一组语句构成一个代码块,我们称之代码组。
像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。
我们将首行及后面的代码组称为一个子句(clause)。
Print 输出
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""
import 与 from...import
在 python 用 import 或者 from...import 来导入相应的模块。
将整个模块(somemodule)导入,格式为: import somemodule
从某个模块中导入某个函数,格式为: from somemodule import somefunction
从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
将某个模块中的全部函数导入,格式为: from somemodule import *
等待用户输入
详细版
第一行注释
#!/usr/bin/python3
#!/usr/bin/env python3
推荐写法
在 Windows 下可以不写第一行注释
编码(第二行)
默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。当然你也可以为源码文件指定不同的编码:
# -*- coding: cp-1252 -*-
标识符
第一个字符必须是字母表中字母或下划线'_'。
标识符的其他的部分有字母、数字和下划线组成。
标识符对大小写敏感。
在Python 3中,非-ASCII 标识符也是允许的了。
保留字
>>> import keyword
>>> keyword.kwlist
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
http://blog.csdn.net/jingwuge/article/details/48519689
and del from not while as elif global or with assert else if pass yield break except import print class exec in raise continue finally is return def for lambda try
注释
Python中单行注释以 # 开头
多行注释可以用多个 # 号
行与缩进
缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。
多行语句
Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠(\)来实现多行语句
total = item_one + \
item_two + \
item_three
在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(\)
数据类型
python中数有四种类型:整数、长整数、浮点数和复数。
整数, 如 1
长整数 是比较大的整数
浮点数 如 1.23、3E-2
复数 如 1 + 2j、 1.1 + 2.2j
字符串
python中单引号和双引号使用完全相同。
使用三引号('''或""")可以指定一个多行字符串。
转义符 '\'
自然字符串, 通过在字符串前加r或R。 如 r"this is a line with \n" 则\n会显示,并不是换行。
python允许处理unicode字符串,加前缀u或U, 如 u"this is an unicode string"。
字符串是不可变的。
按字面意义级联字符串,如"this " "is " "string"会被自动转换为this is string。
空行
函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。
空行与代码缩进不同,空行并不是Python语法的一部分。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。
记住:空行也是程序代码的一部分。
等待用户输入
input("\n\n按下 enter 键后退出。")
同一行显示多条语句
Python可以在同一行中使用多条语句,语句之间使用分号(;)分割
多个语句构成代码组
缩进相同的一组语句构成一个代码块,我们称之代码组。
Print 输出
print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""
import 与 from...import
在 python 用 import 或者 from...import 来导入相应的模块。
将整个模块(somemodule)导入,格式为: import somemodule
从某个模块中导入某个函数,格式为: from somemodule import somefunction
从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc
将某个模块中的全部函数导入,格式为: from somemodule import *
模块调用详情
知识背景
Python 是一种“面向对象编程语言。”而里面最重要的结构之一 class(类),可视 程序架构更为整齐。
面向对象编程的起步知识就是模块的调用。
关键词:模块的定义、模块的如何调用、模块如何创建
1.模块的基本属性:
模组是包含函数和变量的 Python 文件
你可以 import(导入)这个文件
然后你可以使用'.'操作符访问到模组中的函数和变量。{模块名.函数名}
2.模块的导入
2.1.采用关键词"import"来引入某个模块。(import 模块名)
栗子:引用 math 模块,即可用 import math 来导入。
2.2.调用模块中的函数格式: 模块名.函数名
Q: 如何必须加上模块名来调用函数
A:因为不同模块存在同名称函数,解释器就分别不清是谁家的孩子了.
思考:若两个模块都有 open 函数,如何导入呢?
{ module1.open(···) module2.open(···) }
#由此可见带上模块名调用函数名就很容易解析出是那家的孩子了。
栗子:
import math #导入函数模块 print sqrt(2) #错误,(× )无法识别! print (math.sqrt(9))(√)
2.3.从模块中调用某个函数常用语句:
from 模块名 import 函数名 1,函数名 2,······
注意:
1.通过这种方式的导入函数,不能给出模块名,但当引入两个模块含有同一名称函数的时候,后一次模块的函数会覆盖前者。
2.这种通常用于单一几个函数的调用。
3.小栗子:
from math import sqrt sqrt(9)
2.4.重命名:可以在语句末尾增加一个 as 子句,在该子句后给出想要使用的别名
2.4.1 给整个模块重命名
import math as foobar foobar.sqrt(4) 2.0
2.4.2 为函数提供别名
from math import sqrt as foobar foobar(4)
3.模块的通用模式
3.1 常见模块导入模式的形式(复习)
import 模块名 from 模块名 import 函数名 from 模块名 import 函数名 1,函数名 2,···· from 模块名 import * (不常用) (只有确定自己想要从给定的模块导入所有功能时,才应该使用最后一个模板)
3.2 模块的通用模式思路(2 步走)
1.拿(导入)一个模块容器
2.通过模块名称从而获取其中的函数
命令行参数
很多程序可以执行一些操作来查看一些基本信,Python可以使用-h参数查看各参数帮助信息
命令行参数设置
getopt 模块来获取命令行参数
Python 中也可以所用 sys 的 sys.argv 来获取命令行参数:
sys.argv 是命令行参数列表。
len(sys.argv) 是命令行参数个数。
注:sys.argv[0] 表示脚本名。
$ pythontest.pyarg1 arg2 arg3
getopt模块
getopt模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式(-)和长选项模式(--)。
该模块提供了两个方法及一个异常处理来解析命令行参数。
getopt.getopt 方法
getopt.getopt 方法用于解析命令行参数列表,语法格式如下:
getopt.getopt(args, options[, long_options])
方法参数说明:
args: 要解析的命令行参数列表。
options: 以字符串的格式定义,options后的冒号(:)表示该选项必须有附加的参数,不带冒号表示该选项不附加参数。
long_options: 以列表的格式定义,long_options 后的等号(=)表示如果设置该选项,必须有附加的参数,否则就不附加参数。
该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有'-'或'--'的参数。
Exception getopt.GetoptError
在没有找到参数列表,或选项的需要的参数为空时会触发该异常。
异常的参数是一个字符串,表示错误的原因。属性 msg 和 opt 为相关选项的错误信息。
http://www.runoob.com/python3/python3-command-line-arguments.html
数据类型
简述
Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。
在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。
等号(=)用来给变量赋值。
等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。
多个变量赋值
a = b = c = 1
标准数据类型
Number(数字)
int、float、bool、complex(复数)
String(字符串)
Python 字符串不能被改变。向一个索引位置赋值,比如word[0] = 'm'会导致错误。
List(列表)
列表是写在方括号([])之间、用逗号分隔开的元素列表
列表截取的语法格式如下:变量[头下标:尾下标]
列表中的元素是可以改变的
和字符串一样,list可以被索引和切片
List可以使用+操作符进行拼接
Tuple(元组)
元组(tuple)与列表类似,不同之处在于元组的元素不能修改。元组写在小括号(())里,元素之间用逗号隔开。
Sets(集合)
集合(set)是一个无序不重复元素的序列。
基本功能是进行成员关系测试和删除重复元素。
Dictionary(字典)
字典(dictionary)是Python中另一个非常有用的内置数据类型。
列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
字典是一种映射类型,字典用"{ }"标识,它是一个无序的键(key) : 值(value)对集合。
键(key)必须使用不可变类型。
在同一个字典中,键(key)必须是唯一的。
Python数据类型转换
数据内置的类型进行转换将数据类型作为函数名
详细版 基本数据类型:布尔;整型;浮点型;字符串
不需要声明必须赋值赋值以后该变量才会被创建
它没有类型
给变量赋值
等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在变量中的值。
多个变量赋值
Python允许你同时为多个变量赋值。
a = b = c = 1
a, b, c = 1, 2, "runoob"
标准数据类型
Number(数字)
Python3 支持 int、float、bool、complex(复数)
在Python 3里,只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
type()
或者 isinstance(a, int)
区别就是:
type()不会认为子类是一种父类类型。
isinstance()会认为子类是一种父类类型。
del语句删除一些对象引用
del var1[,var2[,var3[....,varN]]]]
您可以通过使用del语句删除单个或多个对象。例如:
del var
del var_a, var_b
数值运算
注意:
多个变量赋值
2、一个变量可以通过赋值指向不同类型的对象。
数值的除法(/)总是返回一个浮点数,要获取整数使用//操作符。
在混合计算时,Python会把整型转换成为浮点数。
Python还支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型
String(字符串)
Python中的字符串用单引号(')或双引号(")括起来,同时使用反斜杠(\)转义特殊字符。
字符串的截取的语法格式如下:
变量[头下标:尾下标]
0-1
加号 (+)星号 (*)
反斜杠(\)一个 r
续行符
没有单独的字符类型长度为1
字符串不能被改变。
注意:
使用r可以让反斜杠不发生转义。
用+用*
从左往右以0开始,从右往左以-1开始。
不能改变
List(列表)
最频繁的数据类型
可以不相同数字,字符串甚至可以包含列表(所谓嵌套)
方括号([])逗号
可以被索引和截取包含所需元素的新列表
列表截取的语法格式如下:
变量[头下标:尾下标]
0-1
加号(+)星号(*)
可以改变
append()、pop()
注意:
方括号之间逗号
索引和切片
用+
可以改变的
Tuple(元组)
不能修改小括号(())里逗号
也可以不相同
下标索引从0开始
字符串看作一种特殊的元组
可以包含可变的对象
构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则:
tup1 = () # 空元组
tup2 = (20,) # 一个元素,需要在元素后添加逗号
string、list和tuple都属于sequence(序列)
注意:
元组的元素不能修改
索引和切片
0或1个元素
+操作符
Sets(集合)
一个无序不重复元素的序列
基本功能是进行成员关系测试和删除重复元素。
set()
输出集合,重复的元素被自动去掉
print(a - b) # a和b的差集
print(a | b) # a和b的并集
print(a & b) # a和b的交集
print(a ^ b) # a和b中不同时存在的元素
Dictionary(字典)
字典(dictionary)是Python中另一个非常有用的内置数据类型。
有序的对象结合无序的对象集合键来存取
"{ }"标识无序的键(key) : 值(value)对集合。
键(key)必须使用不可变类型
键(key)必须是唯一
print (dict['one']) # 输出键为 'one' 的值
print (dict[2]) # 输出键为 2 的值
print (tinydict) # 输出完整的字典
print (tinydict.keys()) # 输出所有键
print (tinydict.values()) # 输出所有值
构造函数 dict() 可以直接从键值对序列中构建字典
另外,字典类型也有一些内置的函数,例如clear()、keys()、values()等。
注意:
映射类型键值对
不可变类型不能重复
{ }
Python数据类型转换
数据内置的类型进行转换将数据类型作为函数名
以下几个内置的函数可以执行数据类型之间的转换。这些函数返回一个新的对象,表示转换的值。
函数描述
int(x [,base]) 将x转换为一个整数
long(x [,base] ) 将x转换为一个长整数
float(x) 将x转换到一个浮点数
complex(real [,imag]) 创建一个复数
str(x) 将对象 x 转换为字符串
repr(x) 将对象 x 转换为表达式字符串
eval(str) 用来计算在字符串中的有效Python表达式,并返回一个对象
tuple(s) 将序列 s 转换为一个元组
list(s) 将序列 s 转换为一个列表
set(s) 转换为可变集合
dict(d) 创建一个字典。d 必须是一个序列 (key,value)元组。
frozenset(s) 转换为不可变集合
chr(x) 将一个整数转换为一个字符
unichr(x) 将一个整数转换为Unicode字符
ord(x) 将一个字符转换为它的整数值
hex(x) 将一个整数转换为一个十六进制字符串
oct(x) 将一个整数转换为一个八进制字符串
2 基本数据结构:列表、元组、字典、集合。数据结构就是一种容器,用于在内存中存放我们的数据。
列表:任意元素组成的顺序序列,以位置为索引。
# 列表的内置函数
'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'
元组:相当于不可变的列表,防止错误修改,节省内存开销。元组解包
# 元组的内置函数
'count', 'index'
字典:键值对,没有顺序,键必须是常量。
# 字典内置函数
'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'
集合:没有顺序,元素之间没有重复,相当于舍弃了值的字典。集合操作(&,|,-,^,<,<=,>,>=)
# 集合内置函数
'add', 'clear', 'copy', 'discard', 'pop', 'remove', 'update''isdisjoint','issuperset','issubset','symmetric_difference','difference','union', 'intersection', 'symmetric_difference_update','intersection_update','difference_update',
3 控制语句
条件:if…else…
循环:for,while,break,continue
4 模块使用
Python有着非常友好的模块安装方法,一个pip install命令几乎可以安装绝大多数的模块。建议使用模块前多看相关API文档。
最常用的模块有:sys,os,re,csv,gzip,fileinput,random,collections,time;百度上有很多很好的模块使用入门教程。
正则表达式 re
有序字典 collections.OrderedDict()
调用系统命令 subprocess.call()
http://www.jb51.net/article/48086.htm
其他
参考
生信宝典陈同
极简教程 (一)
只要在终端输入python test.py并回车就可以运行这个文件。
chmod 755 test.p./test.py
层级缩进
“unexpected indent”
expected an indented block”
“unindent does not match any outer indentation level”
变量、数据结构、流程控制
type(a)
"这是保留节目,通常判断变量的类型使用的不是type是isinstance."
isinstance(a,int)
True
#a
#占位符print#占位符print
"The length of this string <%s> is %d" % (a, len(a))
The length of this string <Hello, welcome to Python> is 24
%f浮点数
%d整数
%s字符串
利用split分割字符串
str1 = "a b c d e f g"
strL = str1.split(' ')
c = a + ', ' + b
考虑到字符串是不可修改的,每次连接操作都是新开辟一个内存空间,把字符串存到里面,这样的连接操作执行几十万次会很影响运行速度。''
\\转义字符
linux下为 \n
去除字符串中特定的字符。通常我们在文件中读取的一行都包含换行符
strip()
方法用于移除字符串头尾指定的字符(默认为空格)。
str.strip([chars]);
a.replace
字符串的替换
a = "Hello, Python"
b = a.replace("Hello","Welcome")
help(str)
print "字符串帮助"
大小写判断和转换
判断
(a, a.islower())
转换
(a, a.lower())
(a, a.upper())
字符串是不可修改的
同一个变量名字赋不同的值实际是产生了多个不同的变量。不同的变量名字赋同样的值,用于比较时相等,但引用不同的区域
list()
字符串转数组
元组转换为列表
join()
join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
连接数组的每个元素(每个元素必须为字符串)
最合适的连接大量字符串的方式
语法: 'sep'.join(seq)
参数说明
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串
os.path.join(): 将多个路径组合后返回
语法: os.path.join(path1[,path2[,......]])
返回值:将多个路径组合后返回
数字字符串转数值
int(a)+1
float(a)+1
从文件或命令行参数中取出的数字都是字符串形式出现,做四则运算时要先用int 或 float转换
数组操作
#向数组中增加元素
aList.append(6)
向数组中增加一个数组
aList.extend(bList)
在数组中删除元素
#只删除第一个匹配的
#移除元素的下标为3的字符
pop和remove是不一样的,remove是移除等于给定值的元素,pop是移除给定位置的元素
#遍历数组的每个元素
for ele in aList:
print ele
数组元素排序
aList.sort()
数组反序
a.reverse()
翻转
元组操作
增加一个元素
aSet.add(4)
Range使用
使用range,产生一系列的字符串
for i in range(16):
通过指定步长产生4的倍数的数
for i in range(0,16,4):
字典操作
输出字典的键值对(key-value)
for key, value in aDict.items():
print key,value
有序输出字典的键值对(key-value)
keyL = aDict.keys()
keyL.sort()
for key in keyL:
print key, aDict[key]
字典的value可以是一个列表
字典的value也可以是字典
学习教程
输入输出
交互式输入输出
文件读写
写入
以写入模式(w)打开一个文件并命名为(Test_file.txt)"
fh = open("Test_file.txt","w")
print >>fh, context
#fh
#文件操作完成后必须关闭文件句柄
只读
以只读模式(r)读入一个名为(Test_file.txt)的文件
printfor line in open("Test_file.txt"):
print line
避免中间空行的输出
在print语句后加上逗号(,)可以阻止Python对每次输出自动添加的换行符
print line,
去掉每行自身的换行符
print line.strip()
函数操作
def
内建的函数
len
range
模块
Python内置了很多标准库,如做数学运算的 math, 调用系统功能的 sys, 处理正则表达式的 re, 操作系统相关功能的 os等
sys
sys.argv 处理命令行参数
sys.argv是一个列表,存储了包含程序名字在内的传给程序的命令行参数。
sys.exit() 退出函数
sys.stdin 标准输入
sys.stderr 标准错误
os
os.system()或os.popen() 执行系统命令
os.getcwd() 获取当前目录
os.remove() 删除文件
关于Python中的__main__和编程模板
参考
关于Python中的__main__和编程模板
https://mp.weixin.qq.com/s?__biz=MzI5MTcwNjA4NQ%3D%3D&mid=2247484893&idx=1&sn=a79e37c46dea9af66d59fa87dcd9e742#wechat_redirect
简单的说,每当运行一个python脚本的时候,都会自动生成一个variable叫__name__。
如果直接运行此脚本,__name__ 的值则自动为 __main__。如果此脚本是在其它脚本中被作为一个包导入运行的 (每个python脚本都可以直接作为一个包来使用),__name__的值会自动为其所在文件的文件名。
因此,if__name__ == ' _ _ main _ _':可用来限定脚本读取的环境,从而保证该脚本在做为包被导入时不会直接启动程序的执行。
一个模板
IO编程
Input输入流:从磁盘外设读取文件到内存
Output输出流:从内存写入磁盘文件
IO同步:CPU等待IO执行结果再继续执行程序
IO异步:CPU不等待IO执行结果去做其他计算
读写 Input/Output (内置open()调用操作系统接口函数)
StringIO/BytesIO
>>> from io import StringIO
>>> f = StringIO()
>>> f.write('hello')
5
>>> f.write(' ')
1
>>> f.write('world!')
6
>>> print(f.getvalue())
hello world!
>>> from io import BytesIO
>>> f = BytesIO()
>>> f.write('中文'.encode('utf-8'))
6
>>> print(f.getvalue())
b'\xe4\xb8\xad\xe6\x96\x87'
1.如果文件很小,read()一次性读取最方便;
with open('/path/to/file', 'r') as f:
print(f.read())
2.如果不能确定文件大小,反复调用read(size)比较保险;
3.如果是配置文件,调用readlines()最方便:
for line in f.readlines():
print(line.strip()) # 把末尾的'\n'删掉
In [1]: f = open('/home/wuchaochao/python/chuang.jpeg','rb')
In [2]: f.read()
Out[2]: b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x02\x01\x00H\x00H\x00\x00\xff\xe1\x1a\x7fExif
字符编码(非UTF-8编码的文本文件)
>>> f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')
>>> f.read()
'测试'
写文件
要写入特定编码的文本文件,请给open()函数传入encoding参数,将字符串自动转换成指定编码。
with open('/Users/michael/test.txt', 'w') as f:
f.write('Hello, world!')
操作文件和目录 (内置os模块调用操作系统接口函数)
路径操作(规避不同操作系统分隔符号)
合成路径os.path.join()
拆分路径os.path.split()
>>> os.path.split('/Users/michael/testdir/file.txt')
('/Users/michael/testdir', 'file.txt')
#os
>>> os.path.splitext('/path/to/file.txt')
('/path/to/file', '.txt')
#列出当前目录下py文件
>>> [x for x in os.listdir('.') if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
['apis.py', 'config.py', 'models.py', 'pymonitor.py', 'test_db.py', 'urls.py', 'wsgiapp.py']
目录操作
# 查看当前目录的绝对路径: >>> os.path.abspath('.')
'/Users/michael'
# 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来:
>>> os.path.join('/Users/michael', 'testdir')
'/Users/michael/testdir'
# 然后创建一个目录:
>>> os.mkdir('/Users/michael/testdir')
# 删掉一个目录:
>>> os.rmdir('/Users/michael/testdir')
序列化(pickle模块)
序列化与反序列
In [4]: d = dict(name='Bob',age=20,score=90)
In [5]: pickle.dumps(d)
Out[5]: b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00Bobq\x02X\x05\x00\x00\x00scoreq\x03KZX\x03\x00\x00\x00ageq\x04K\x14u.'
In [6]: with open('/home/wuchaochao/test.txt','wb') as f:
...: f.write(pickle.dumps(d))
...:
In [7]: f = open('/home/wuchaochao/test.txt','rb')
In [8]: d = pickle.load(f)
In [9]: f.close
Out[9]: <function BufferedReader.close>
In [10]: f.close()
In [11]: d
Out[11]: {'age': 20, 'name': 'Bob', 'score': 90}
1.JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。
2.JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。
In [12]: import json
In [13]: d = dict(name='Bob',age=20,score=90)
In [14]: json.dumps(d)
Out[14]: '{"name": "Bob", "score": 90, "age": 20}'
In [15]: json_str = json.dumps(d)
In [16]: json.loads(json_str)
Out[16]: {'age': 20, 'name': 'Bob', 'score': 90}
详细版
文件处理--慕课网
概念:文件是对象
属性:用户,读,写,执行权限;
操作:
打开 f = open(name[,mode[buf]]) 文件路径 打开方式 缓冲大小
mode打开方式
r 只读 文件必须存在
w 只写 文件不存在创建 文件存在先清空内容
a 追加 文件不存在创建
r+/w+ 读写
r+ 从文件头写
w+ 清空文件再写
a+ 追加读写
二进制方式 加b 如 rb 只读
读取 read([size]) readline([size])--一行 readlines([size])--每行组成的列表
readlines的size和前面的size不一样 并且最多读到buff8198
iter 迭代器--推荐
写入
write(str) 字符串写入
writelines(sequence of strings) 写入多行 参数为可迭代的对象
文件缓冲到buffer
主动调用close或flush方法
大于缓存 写缓存自动同步到磁盘
关闭 close()
进程最大限制:1024个
文件指针
操作:
seek(offset[,whence]):移动文件指针;
偏移量(可以为负),
偏移相对位置
os.SEEK_SET/CUR/END 相对文件起始/当前/结尾位置
tell() 返回当前文件偏移
文件属性编码格式
文件属性
file.fileno() 文件描述符
file.mode 文件打开权限
file.encoding 文件编码格式
file.closed 文件是否关闭
标准文件
sys.stdin 文件标准输入
sys.stdout 文件标准输出
sys.stderr 文件标准错误
文件命令行参数
sys.argv属性 字符串组成的列表,通过它可得到命令行参数
编码格式
1. a=unicode.encode(u'中文','utf-8')
2. codecs模块 创建编码格式文件
open(fname,mode,encoding,errors,buffering)
os模块对文件和目录操作
它的每一个方法都是一个系统调用
os.open(filename,flag[,mode])打开文件
flag 打开文件方式 os_....
os.read(fd,buffersize) 读取
os.write(fd,string) 写入
os.iseek(fd,pos,how) 指针
os.close(fd) 关闭
目录操作
os.mkdir(),os.rmdir(),os.listdir(),os.chdir(),
os.path
os.path.exists(),os.path.isfile(),os.path.abspath(),os.path.isdir(),os.path.getsize(filename),os.path.dirname(p),os.path.basename()
ConfigParser模块--管理ini文件
代码编写前提
面向对象编程基本方法 对类和对象有一定了解
对文件有基本的认识 能正常操作文件
掌握ConfigParser模块基本使用
技巧
文件打开:with open('/path/file','r') as f: 推荐使用,减少代码量,处理一些异常情况
写入
with open("download.url","w") as f:
for i in path:
print(i,file=f)
f.close()
文件格式
生物信息中一般主流的文件格式有fasta、fastq、sra、Genebank、gtf、gff3、sam、bam等。
CSV CSV 表示“逗号分隔值(Comma Separated Value)”每一行代表一个单独的记录
文本处理目录操作常用函数
os.listdir(dirname):列出dirname下的目录和文件
os.getcwd():获得当前工作目录
os.curdir:返回但前目录(’.’)
os.chdir(dirname):改变工作目录到dirname
os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false
os.path.isfile(name):判断name是不是一个文件,不存在name也返回false
os.path.exists(name):判断是否存在文件或目录name
os.path.getsize(name):获得文件大小,如果name是目录返回0L
os.path.abspath(name):获得绝对路径
os.path.normpath(path):规范path字符串形式
os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
os.path.splitext():分离文件名与扩展名
os.path.join(path,name):连接目录与文件名或目录
os.path.basename(path):返回文件名
os.path.dirname(path):返回文件路径
数据分析
数据运算符
算术运算符
+
-
*
/
%
**
//
比较运算符
==
!=
>
<
>=
<=
赋值运算符
= 简单的赋值运算符 c = a + b 将 a + b 的运算结果赋值为 c
+= 加法赋值运算符 c += a 等效于 c = c + a
-= 减法赋值运算符 c -= a 等效于 c = c - a
*= 乘法赋值运算符 c *= a 等效于 c = c * a
/= 除法赋值运算符 c /= a 等效于 c = c / a
%= 取模赋值运算符 c %= a 等效于 c = c % a
**= 幂赋值运算符 c **= a 等效于 c = c ** a
//= 取整除赋值运算符 c //= a 等效于 c = c // a
位运算符(难点)
二进制
逻辑运算符(and, or, not)
成员运算符
in 如果在指定的序列中找到值返回 True,否则返回 False。 x 在 y 序列中 , 如果 x 在 y 序列中返回 True。
not in 如果在指定的序列中没有找到值返回 True,否则返回 False。 x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True。
身份运算符
身份运算符用于比较两个对象的存储单元
is 判断两个标识符是不是引用自一个对象
is 与 == 区别:is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。
is not 判断两个标识符是不是引用自不同对象
数据操作
变量(也叫“名字”或“变量名”)
定义:变量简单来讲就是编程中最基本的存储单元,变量就是会暂时性地存储你放进去的东西。
比如说 name = "沐风",就是一个叫做name的变量被赋值为"沐风"。就像每个人都有名字一样,变量的名字叫做标识符
命名规则
变量名只能包含字母、数字和下划线。变量名可以字母或下划线打头,但不能以数字打头
比如name、name1、my_name、_name这些命名都是合法的,而1name不是合法的
变量名不能包含空格,区分大小写字母
变量名尽量简洁和有描述性。例如name比n好
尽量的使用驼峰写法,比如myName,studentName
http://baike.baidu.com/link?url=_yX_wxW_J2ILcK-6CWDf9ppTL1qvsUQuRyiRgIUvxApjWQ15fEpbwwHokg3hOxZp7UdundwDWbd3q80cpXRcHzPJANOdZtKMLH3tipzHzywyGT-9dTg2vlfkKPK6-_R8FC5UlHfiUPwy7Re25YbTT2Myj51Kp-oI7yjdjrgzmJ02DpfdDRAq_pmrTKjFIgdcAH0FjaFoIWiecvWR-5X_xow6Cyha7LTClWiwc5MveFe
字符串
定义:字符或字符序列(字幕、数字或标点符号)称为一个字符串
在创建一个字符串时,在字符量变加上引号(单引号双引号都可以),如“5”
>>> first = '5'
>>> second = '3'
>>> first + second
'53'
如果是数字没有加入引号,表示数值,而不是字符,比如5和“5”是不一样的
>>> first = 5
>>> second = 3
>>> first + second
8
如果两个字符串相加会生成一个新的字符串。比如"cat"+"dog",会打印出catdog
>>> print "cat" + "dog"
catdog
三个引号被用于过于长段的文字或者说明,只要三引号不完,就可以随意换行写下文字
使用
修改字符串的大小写
首字母大写:name.title()
全部大写:name.upper()
全部小写:name:lower()
拼接字符串 (把字符或字符串放在一起构成更长的字符串,叫拼接)
a +""+b
a+b
使用换行符添加空白
\n 换行
\t 缩进
删除空格
rstrip() //删除尾部的空格
lstrip()//删除头部
strip()//删除两端
使用字符串避免语法错误
例如'what's your name'
基本运算
加减乘除(+、-、*、/)
例如:1+1、2-1、1*2、2/1
tips:如果需要整除 3/2为整除,如需要求小数点则需要3.0/2
>>> print 3 / 2
1
>>> print 3.0 / 2
1.5
在 Python 2 中,做除法的方式为“整除”
>>> print 3/2
1.5
要在 Python 3 中做整除,要使用两个前斜杠(//)
>>> print 3//2
1
取余(求余数)%
>>> print 7 % 2
1
tip: 同时使用/和%,如,7除以2得3,余数是1
>>> print 7 / 2
3
>>> print 7 % 2
1
指数(求幂)**
指数用双型号表示 ** ,把3乘5次,读作“3 指数 5”
>>> print 3 * 3 * 3 * 3 * 3
243
>>> print 3**5
243
非整数作为指数,把3乘5.5次也可以
>>> print 3 ** 5.5
420.888346239
数据类型
主要讲解整数和小数(也称浮点数)(Int和float)
Int为整数类型。如1、2、3、4
float 为浮点数。比如 1.1、1.01等
运算顺序
运算顺序会按照数学的规则来运算
比如 2+3*2 = 8 而不是等于10
当然也可以这样运算:(2+3)*2 = 10
两种操作
自增 += ( 例如,score = score + 1 )
>>> number = 7
>>> number += 1
>>> print number
8
自减-= ( L例如,score = score – 1)
number increased by 1
>>> number = 7
>>> number -= 1
>>> print number
E记法 (类似科学计数法)
3.8 e 16,就是3.8乘以10的16次方,
1.752e–13,就是1.752乘以10的负13次方
注释
注释是对代码逻辑的表述,用来表达带来代码要做什么以及是如何是做的
注释也可以作为“伪代码”,来阐述你的编程逻辑
在Python中,注释用井号(# )标识。井号后面的内容都会被Python解释器忽略
本周碰到单词列表
Python [ˈpaɪθən]
GUI 图形用户界面
文本模式 text-mode [tekst məʊd]
控制台 console-mode [kən'səʊl]
命令行 command-line [kə'mɑ:ndl'aɪn]
输入 input [ˈɪnpʊt]
处理 process [ˈprəʊses]
输出 output [ˈaʊtpʊt]
整数 integer [ˈɪntɪdʒə(r)]
小数 decimal number [ˈdesɪml]
浮点数 floating-point number
实数 real number [riəl ˈnʌmbə]
整除 floor division [flɔ:(r) dɪˈvɪʒn]
赋值 assignment [əˈsaɪnmənt]
赋值操作符 assignment operator
操作符 operator [ˈɒpəreɪtə(r)]
操作数 operand [ˈɒpərænd]
提示符 prompt [prɒmpt]
分数 score [skɔ:(r)]
运算顺序 order of operation [ˈɔ:də ɔv ˌɔpəˈreiʃən]
自增 incrementing [ˈɪŋkrəməntɪŋ]
自减 decrementing ['dekrɪməntɪŋ]
求幂 exponentiation [ˌekspəʊˌnenʃɪ'eɪʃən]
科学计数法 scientific notation [ˌsaiənˈtifik nəuˈteiʃən]
上标 superscript [ˈsu:pəskrɪpt] 下标 subscript ['sʌbskrɪpt]
本周总结
如何使用变量
如何创建描述性变量名以及如何消除名称错误和语法错误
字符串是什么
以及如何使用小写、大写和首字母大写方式显示字符串
使用 空白来显示整洁的输出,以及如何剔除字符串中多余的空白
如何使用整数和浮点数
使用数值数据时需要注意的意外行为
如何编写说明性注释
python数据分析与展示1
维度:一组数据的组织形式
一维
二维
多维
一维数据
由对等关系的有序或无序的数据构成,采用线性方式组织
使用列表和集合类型
列表有序,集合无序
二维和多维
使用多维列表
高维数据
字典或数据表示格式
数据表示格式
json,xml,yaml
列表与数组
列表和数组都是一组数据的有序结构
列表数据类型可以不同
数组数据类型必须相同
Numpy
开源的python科学计算基础库
引用方法:import numpy as np
N维数组对象
数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据
设置专门属于对象,可以提高运算速度
科学计算中,一维数组所有数据类型往往相同
数组对象使用相同数据类型,可以节约内存和运算时间
ndarray
是一个多维数组对象,由两部分构成
实际的数据
描述这些数据的元数据(数据维度,数据类型等)
ndarray数组一般要求所有元素类型相同,数组下标从0开始
轴(axis)保存数据的维度,秩(rank)轴的数量
对象的属性
.ndim秩,即轴的数量或维度的数量
.shape表示ndarray对象的尺度,对于矩阵,n行m列
.size表示ndarray对象元素的个数
.dtype表示ndarray对象的元素类型
.itemsize表示ndarray对象中每个元素的大小,以字节为单位
ndarray数组创建方法
从python的列表、元组等类型型创建ndarray数组
x=np.array(list/tuple)
x=np.array(list/tuple,dtype=np.float32)
当np.array不指定dtype时,Numpy将根据数据情况关联一个dtype类型
使用Numpy中函数创建ndarray数组,如:arange,ones,zeros等
np.arange(n),类似range()函数,返回ndarray类型,元素从0到n-1
np.ones(shape),根据shape生成一个全1的数组,shape是元组类型
np.zeros(shape),根据shape生成一个全0的数组,shape是元组类型
np.full(shape,val),根据shape生成一个数组,每个元素值都是val
np.eye(n),创建一个正方n*n单位矩阵,对角线为1,其余为0
np.ones_like(a),根据数组a的形状生成一个全1的数组
np.zeros_like(a),根据数组a的形状生成一个全0的数组
np.full_like(a),根据数组a的形状生成一个数组,每个元素值都是val
使用Numpy中其他函数创建ndarray数组
np.linspace(),根据起止数据等间距的填充数据,形成数组
np.concatenate(),将两个或多个数组合并成一个新的数组
ndarray数组的变换
ndarray数组的维度变换
.reshape(shape),不改变数组类型,返回一个shape形状的数组,原数组不变
.resize(shape),与.reshape( )功能一致,但修改原数组
.swapaxes(ax1,ax2),将数组n个维度中的两个维度进行调换
.flatten(),对数组进行降维,返回折叠后的一维数组,原数组不变
ndarray数组的类型变换
new.a=a.astype(new_type)
ndarray数组向列表转换
a.tolist()
数组的索引和切片
一维数组的索引和切片:与python的列表类似
多维数组的索引
每个维度一个索引值,逗号分割
多维数组的切片
ndarray数组的运算
数组与标量之间的运算:作用于数组每一个元素
对ndarray中数据执行元素级运算的函数
np.abs(x)/np.fab(x),计算数组各元素的绝对值
np.sqrt(x),计算数组各元素的平方根
np.square(x),计算数组各元素的平方
np.log(x)/np.log10(x)/np.log2(x),计算数组各元素的自然对数、10底对数和2底对数
np.ceil(x)/np.floor(x),计算数组各元素的ceiling值或floor值
np.rint(x),计算数组各元素的四舍五入值
np.mod(x),将数组各元素的小数和整数部分以两个单独的数组形返回
np.exp(x),计算数组各元素的指数值
np.sign(x),计算数组各元素的符号值,1(+),0,-1(-)
csv文件只能存取一维和二维数组
多维数组存取
a.tofile(frame,sp='',format='%s')
frame:文件、字符串
sep:数据分割字符串,如果是空串,写入文件为二进制
format:写入数据的格式
np.fromfile(frame,dtype=float,count=-1,sep='')
frame:文件,字符串
dtype:读取的数据类型
count:读入元素的个数,-1表示读入整个文件
数据分割字符串,如果是空串,写入文件为二进制
Numpy的随机数函数
np.random()的随机函数1
rand(d0,d1,...,dn),根据d0-dn创建随机数数组,浮点数,[0,1),均匀分布
randn(d0,d1,...,dn),根据d0-dn创建随机数数组,标准正态分布
randint(low,[,high,shape]),根据shape创建随机整数或整数数组,范围是[low,high)
seed(s),随机数种子,s是给定的种子值
np.random()的随机函数2
shuffle(a),根据数组a的第一轴进行随排列,改变数组x
permutation(a),根据数组a的第一轴产生一个新的乱序数组,不改变数组x
choice(a[,size,replace,p]),从一维数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用元素,默认为False
np.random()的随机函数3
uniform(low,high,size),产生具有均匀分布的数组,low起始值,high结束值,size形状
normal(loc,scale,size),产生具有正态分布的数组,loc均值,scale标准差,size形状
poisson(lam,size),产生具有泊松分布的数组,lam随机事件发生率,size形状
Numpy的统计函数
np.random()的统计函数1
sum(a,axis=None),根据给定轴axis计算数组a相关元素之和,axis整数或数组
当axis=0时,求矩阵每一列上的元素的和
当axis=1时,求矩阵每一行上的元素的和
当axis=2时,求矩阵每个元素的和,即矩阵中每个数组的和
前提是有一个三维数组,且axis的值必须小于数组的维度
这里把生成的数组理解为矩阵,矩阵的每个元素为一个数组
mean(a,axis=None),根据给定轴axis计算数组a相关元素的期望(算数平均和),axis整数或数组
average(a,axis=None,weights=None),根据给定轴axis计算数组a相关元素的加权平均值
std(a,axis=None),根据给定轴axis计算数组a相关元素的标准差
var(a,axis=None),根据给定轴axis计算数组a相关元素的方差
np.random()的统计函数2
min(a)/max(a),计算数组a中元素的最小值,最大值
argmin(a)/argmax(a),计算数组a中元素的最小值,最大值的降一维后下标
unravel_index(index,shape),根据shape将一维下标index转换成多维下标
ptp(a),计算数组a中元素最大值与最小值的差
media(a),计算数组a中元素的中位数(中值)
Numpy的梯度函数
梯度:连续值之间的变化率,即斜率
np.random的梯度函数
np.gradient(f),计算数组f中元素的梯度,当f为多维时,返回每个维度梯度
只有一侧值时,梯度为(n-(n-1))/1
python数据分析与展示2
图像的数组表示
PIL库
图像是一个三维数组,维度分别为高度,宽度和像素RGB值
Matplotlib库介绍
Matplotlib库的使用
matplotlib.pyplot是绘制各类可视化图形的命令字库,相当于快捷方式
使用方法:import matplotlib.pyplot as plt
pyplot的plot()函数
plt.plot(x,y,format_string,**kwargs)
x:X轴上的数据,列表或数组
y:Y轴上的数据,列表或数组
format_string:控制曲线的格式字符串,可选
**kwargs:第二组或更多(x,y,format_string)
绘制多条曲线时,x必须有
format_string:控制曲线的格式字符串,可选
由颜色字符、风格字符和标记字符组成
pyplot的中文显示方法
pyplot默认不支持中文显示,需要使用reParams修改字体实现
改变全局字体
用法:matplotlib.rcParams['font.family']='SimHei'
plt.ylabel('纵轴(值)')
font.family:用于显示字体的名字
font.style:字体风格,正常'normal'或斜体“italic”
font.size:字体大小,整数字号或者“large/x-small”
第二种办法:在有中文输入的地方,增加一个属性:fontproperties
plt.xlabel('横轴:时间',fontproperties='SimHei')
pyplot的文本显示方法
plt.xlable(),对X轴增加文本标签
plt.ylable(),对Y轴增加文本标签
plt.title(),对图形整体增加文本标签
plt.text(),在任意位置增加文本
plt.annotate(),在图形中增加带箭头的注释
pyplot基础图表函数概述
pyplot基础图表函数
plt.plot(x,y,formstring),绘制一个坐标图
plt.boxplot(data,notch,position),绘制一个箱形图
plt.bar(left,height,width,bottom),绘制一个条形图
plt.barh(width,bottom,left,height),绘制一个横向条形图
plt.polar(theta,r),绘制极坐标图
plt.pie(data,explode),绘制饼图
pyplot直方图绘制
plt.hist()
bins参数:生成的直方图中,直方条的个数
pyplot散点图绘制
pandas库介绍
使用方法:import pandas as pd
pandas库的理解
两个数据类型:Series,DataFrame
基于上述类型的各类操作
基本操作、运算操作、特征类操作、关联操作等
pandas库的Series类型
Series类型由一组数据及与之相关的数据索引构成
从python列表创建:b=pd.Series([9,8,7,6],index=['a','b','c','d'])
从字典类型创建:d=pd.Series({'a':9,'b':40,'c':66})
从ndarray类型创建:d=pd.Series(np.arrange(25))
Series是一维带标签数组
Series类型基本操作
索引方法与ndarray类型相同,采用[]
Numpy中运算和操作可用于Series类型
可以通过自定义索引的列表进行切片
可以通过自动索引进行切片,如果存在自定义索引,则一同被切片
运算是基于索引的运算
对象和索引都可以有一个名字,存储在属性.name内
pandas库的DataFrame类型
简介
由共用相同索引的一组列构成
是一个表格型的数据类型,没列值类型可以不同
既有行索引,也有列索引。列称为index,axis=0;行称为coulum,axis=1
常用于表达二维数据,但可以表达多维数据
创建方法
二维ndarray对象
d=pd.DataFrame(np.arange(10).reshape(2,5))
由一维ndarray、列表、字典、元组或Series构成的字典
对象字典:e=pd.DataFrame({'one':pd.Series([1,2,3],index=['a','b','c']),'two':pd.Series([9,8,7,6],index=['a','b','c','d'])})
Series类型
其他的DataFrame类型
DataFrame是二维带标签数组
pandas库的数据类型操作
改变Series和DataFrame结构:增加和重排-重新索引.reindex()
参数index,columns新的行列自定义索引
参数fil_value重新索引中,用于填充缺失位置的值
参数method填充方法,ffill当前值向前填充,bfill向后填充
limit最大填充量
copy默任True,生成新对象,False时,新旧相等不复制
pandas库的数据类型运算
运算规则
算术运算根据行列索引,补齐后运算,运算默认产生浮点数
补齐时缺项填充NAN(空值)
二维和一维、一维和零维间为广播运算
不同维度间为广播运算,一维Series默认在轴1参与运算
使用运算方法可以领一维Series参与0轴运算:b.sub(c.axis=0)
采用+-*/符号进行的二元运算产生新的对象
比较运算法则
比较运算只能比较相同索引的元素,不进行补齐
二维和一维、一维和零维间为广播运算
采用><>=<===!=等符号进行的二元运算产生布尔对象
pandas库的数据排序
.sort_index(axis=1,ascending=True),对轴排序,默认以0轴排序
.sort_values(by,axis=0,ascending=True),真正的对数据排序
NaN统一放到排序末尾
pandas库的基本统计分析
适用于Series和DataFrame类型
.sum()计算数据的总和,按0轴计算,下同
.count()非NaN值的数量
.mean().median()计算数据的算数平均值,算数中位数
.var().std(),计算数据的方差,标准差
.min().max()计算数据的最小值,最大值
适用于Series类型
.argmin().argmax()计算数据最大值、最小值所在位置的索引位置(自动索引)
.idxmin().idxmax(),计算数据最大值、最小值所在位置的索引(自定义索引)
pandas库的累计统计分析
适用于Series和DataFrame类型
.cumsum(),依次给出前1,2,.。。。,n个数的和
.cumprod(),依次给出前1,2,.。。。,n个数的积
.cummax(),依次给出前1,2,.。。。,n个数的最大值
.cummin(),依次给出前1,2,.。。。,n个数的最小值
适用于Series和DataFrame类型,滚动计算
.rolling(w).sum(),依次计算相邻w个元素的和
.rolling(w).mean(),依次计算相邻w个元素的算术平均值
.rolling(w).var(),依次计算相邻w个元素的方差
,rolling(w).std(),依次计算相邻w个元素的标准差
.rolling(w).min().max(),依次计算相邻w个元素的最小值,最大值
pandas库的相关分析
X增大,Y增大,两个变量正相关
pandas
导入数据
pd.read_csv(filename):从CSV文件导入数据
pd.read_table(filename):从限定分隔符的文本文件导入数据
pd.read_excel(filename):从Excel文件导入数据
dtype 更改列的数据类型
df=pd.read_excel('银行明细汇总表.xlsx',dtype={'交易账号':object,'对手账号':object})
pd.read_sql(query, connection_object):从SQL表/库导入数据
pd.read_json(json_string):从JSON格式的字符串导入数据
pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据
导出数据
df.to_csv(filename):导出数据到CSV文件
df.to_csv('2.csv', index=False,encoding='utf-8'):不要 index 编码改为utf-8
df.to_excel(filename):导出数据到Excel文件
df.to_sql(table_name, connection_object):导出数据到SQL表
df.to_json(filename):以Json格式导出数据到文本文件
创建测试对象
pd.DataFrame(np.random.rand(20,5)):创建20行5列的随机数组成的DataFrame对象
pd.Series(my_list):从可迭代对象my_list创建一个Series对象
df.index = pd.date_range('1900/1/30', periods=df.shape[0]):增加一个日期索引
查看、检查数据
可见行列数
pd.options.display.max_rows = 80
pd.options.display.max_columns = 50
查看列 值 计数
分类数据用value_counts,数值数据用describe
df.借贷标志.value_counts():统计所有非零元素的个数
df_clean.describe()
len(df.借贷标志.value_counts()):有几个唯一值
Series查看
s.value_counts(dropna=False):查看Series对象的唯一值和计数
df.head(n):查看DataFrame对象的前n行
df.tail(n):查看DataFrame对象的最后n行
df.shape():查看行数和列数
http://df.info():查看索引、数据类型和内存信息
df.describe():查看数值型列的汇总统计
s.value_counts(dropna=False):查看Series对象的唯一值和计数
df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数
df.duplicated():显示数据中的重复值
df.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组
df[''].isnull().value_counts():返回某列的NAN数量
df[df['借贷标志'].isnull().values==True]:查看列有哪些nan
df.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组
检查字符类型
df[''].apply(lambda x: x.isalpha()):是否全部为字符
df[''].apply(lambda x: x.isalnum()):是否全部为数字
df[''].apply(lambda x: x.isdigit()):是否全部为字母
df[df.账户名称.isin([' '])] :查看列 特定值
数据选取
df[col]:根据列名,并以Series的形式返回列
df[[col1, col2]]:以DataFrame形式返回多列
s.iloc[0]:按位置选取数据
s.loc['index_one']:按索引选取数据
df.iloc[0,:]:返回第一行
df.iloc[0,0]:返回第一列的第一个元素
数据清理
删除 行 列
del df['Unnamed: 20']:列
df.drop(['a'],axis = 1,inplace= True):列
df.drop(1,axis = 0,inplace= True) :行
添加 行 列
列
df['交易卡号']=np.nan:
df['交易户名']='王志琰'
#变换列
变到第一行
df1=df.reindex_axis(['time'] + list(df.columns[:]), axis=1)
更改列名
df.columns = ['a','b','c']:更改所有列名
df.rename(columns=lambda x: x + 1):批量更改列名
df.rename(columns={'old_name': 'new_ name'}):选择性更改列名
处理空值
df.fillna(0):填充空值为0
loandata['loan_amnt']=loandata['loan_amnt'].fillna(loandata['total_pymnt']-loandata['total_rec_int']).astype(np.int64)
df.dropna():删除所有包含nan的行
df=df.dropna(subset=['借贷标志']) :删除 列 包含的nan行
df.dropna(axis=1):删除所有包含nan的列
df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行
处理重复
df.drop_duplicates(subset='列名',keep=‘first’):删除重复值,保留第一次出现值。
处理空格
strip : 必须是str格式
df["借贷标志"]=df["借贷标志"].astype('str') :需要转换成str
df.['']=df[''].map(str.strip):删除 列 数据两边空格
df.['']=df[''].map(str.lstrip):左
df.['']=df[''].map(str.rstrip):右
replace:替换空格
df['列']=df['列'].str.repalce(' ','')
大小写转换
df['']=df[''].map(str.upper):全部大写
df['']=df[''].map(str.lower):小写
df['']=df[''].map(str.title):首字母大写
数据分组:bins group_names 分组依据 cut 添加到df中
目的:0-5 A/5-10 B.。。。。。
bins = [0, 5, 10, 15, 20]
group_names = ['A', 'B', 'C', 'D']
loandata['categories'] = pd.cut(loandata['open_acc'], bins, labels=group_name
分列:http://bluewhale.cc/2016-08-21/python-data-cleaning.html
loandata.grade 为B-B2,B-B5
grade_split = pd.DataFrame((x.split('-') for x in loandata.grade),index=loandata.index,columns=['grade','sub_grade'])
完成数据分列操作后,使用merge函数将数据匹配会原始数据表,这个操作类似Excel中的Vlookup函数
loandata=pd.merge(loandata,grade_split,right_index=True, left_index=True)
替换
df['列']=df['列'].str.repalce('old','new')
例子 :df1['借贷标志']=df1['借贷标志'].str.replace('借','出')
字符串操作
http://www.bubuko.com/infodetail-1810571.html
df.str.wrap() 在指定的位置加回车符号
Series数据类型
s.astype(float):将Series中的数据类型(格式)更改为float类型
s.replace(1,'one'):用‘one’代替所有等于1的值
s.replace([1,3],['one','three']):用'one'代替1,用'three'代替3
df.set_index('column_one'):更改索引列
df.rename(index=lambda x: x + 1):批量重命名索引
数据处理
分组 标签
bins =[0,3,5,10,15,20,30,100] #数值分组
level = ['0-3','3-5','5-10','10-15','15-20','20-30','30+'] #分组标签
df_clean['level'] = pd.cut(df_clean['avgSalary'],bins = bins,labels =level)
排序
df.sort_values(col1):按照列col1排序数据,默认升序排列
df.sort_values(col2, ascending=False):按照列col1降序排列数据
df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据
组对象
df.groupby(col):返回一个按列col进行分组的Groupby对象
df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象
df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值
df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
计算
df.pivot_table(index=col1, values=[col2,col3], aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表
data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
data.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max
数据合并
df1.append(df2):将df2中的行添加到df1的尾部
df.concat([df1, df2],axis=1):将df2中的列添加到df1的尾部
df1.join(df2,on=col1,how='inner'):对df1的列和df2的列执行SQL形式的join
数据统计
a=df['交易金额'].sum():以列,求合
df.describe():查看数据值列的汇总统计
df.mean():返回所有列的均值
df.corr():返回列与列之间的相关系数
df.count():返回每一列中的非空值的个数
df.max():返回每一列的最大值
df.min():返回每一列的最小值
df.median():返回每一列的中位数
df.std():返回每一列的标准差
时间格式
df['time'] =pd.to_datetime(df['time'],format='%Y%m%d') :年 月 日
dataframe
筛选
筛选某列包含某值(df ,1(列名),a(valus))
df1=df[df.账户名称.isin(['刘亚波'])]
df1=df[df[""]==""]
df[df[] > 0.5]:选择列的值大于0.5的行
多条件筛选
df1=df[(df.账户名称.isin(['刘亚波']))&(df.进出标志.isin(['进']))]
df1 = df[(df['1']=='a')&(df['2']=='b')]
筛选多个列
df1=df[(df.账户名称.isin(['刘亚波']))&(df.进出标志.isin(['进']))]
required_key = ['1','2','3','4']
raw = raw[raw['a'].isin(required_key)]
python数据分析与挖掘实战
数据挖掘基础
数据挖掘定义
这种从数据中“淘金”,从大量数据(包括文本)中挖掘出隐含的、未知的、对决策有潜在价值的关系、模式和趋势,并用这些知识和规律建立用于决策支持的模型,提供预测性决策支持的方法、工具和过程,就是“数据挖掘”
数据挖掘任务
利用分类与预测、聚类分析、关联规则、时序模式、偏差检测、智能推荐等方法,帮助企业提取数据中蕴含的商业价值,提高企业的竞争力
数据挖掘过程
定义挖掘目标
数据取样(抽取数据的标准)
相关性
可靠性
有效性
衡量取样数据质量标准
资料完整无缺,各类指标项齐全
数据准确无误,反映的都是正常(而不是异常)状态下的水平
对获取数据的抽样方式
随机取样:数据集中的每一组观测值都有相同的被抽样的概率
等距抽样
分层抽样:不同层次可设定不同的概率。这种抽样结果通常更具有代表性
从起始顺序抽样
分类抽样
数据探索
目的
保证样本数据的质量,为保证模型质量打下基础
内容
异常值分析
缺失值分析
相关分析
周期性分析等
数据预处理
目的
保证样本数据的质量,为保证模型质量打下基础
内容
数据筛选
数据变量转换
缺失值处理
坏数据处理
数据标准化
主成分分析
属性选择
数据规约等
挖掘建模
数据挖掘应用类型
分类
聚类
关联规则
时序模式
智能推荐
建模时需要考虑:模型属于哪一种数据挖掘应用,选用哪种算法构建模型
模型构建反映的是采样数据内部结构的一般特征,并与该采样数据的具体结构基本吻合
模型评价
目的
从这些模型中自动找出一个最好的模型
根据业务对模型进行解释和应用
不同的数据模型有不同的分析方法
常用数据挖掘建模工具
SAS Enterprise Miner
IBM SPSS Modeler
SQL Server
决策树算法
聚类分析算法
Naive Bayes算法
关联规则算法
时序算法
神经网络算法
线性回归算法
Python
WEKA
KNIME
RapidMiner
TipDM
Python数据分析简介
python的数据结构
List(列表)
列表和元组都是序列结构
两者外形上区别:列表用方括号标记,元组用圆括号标记
两者功能上区别:列表可以被修改,元组不可以
与列表有关的函数是list,与元组有关的函数是Tuple
常用函数
a.append(1),将1添加到列表a末尾
a.count(1),统计列表a中元素1出现的次数
a.extend([1,2]),将列表[1,2]的内容追加到列表a的末尾中
a.index(1),从列表a中找出第一个1的索引位置
a.insert(2,1),将1插入列表a的索引为2的位置
a.pop(1),移除列表a中索引为1的元素
Tuple(元组)
Dictionary(字典)
从数学上讲,它实际是一个映射
Set(集合)
与列表区别
他的元素是不重复的,而且是无序的
它不支持索引
通过花括号{}或者set()函数创建一个集合
函数式编程
主要使用函数
lambda(),主要用来定义“行内函数”
#定义函数f
map(),用于逐一遍历
reduce(),用于递归计算
from fuctools import reduce,引入reduce函数
reduce(lambda x,y:x*y,range(1,n+1)),计算n的阶乘
filter(),它是一个过滤器,用来筛选出列表中符合条件的元素
使用filter()函数,首先需要一个返回值为bool型的函数
上述函数引入的最终目的是兼顾简洁好人效率的,它们的循环速度比内置的for()和while()要快得多
python数据分析工具
Numpy,为python提供数组功能,以及对数据进行快速处理的函数
Scipy,提供真正的矩阵,以及大量基于矩阵运算的对象与函数
Scipy包含的功能有最优化、线性代数、积分、插值、拟合、特殊函数、快速傅里叶变换、信号处理的图像处理、常微分方程求解和其他科学与工程中常用计算
Scipy依赖于Numpy,安装Scipy之前得先安装Numpy
Matplotlib,最著名的绘图库,主要用于二维绘图
pandas,python下最强大的数据分析和探索工具
StatsModels,pandas着眼于数据的读取、处理和探索,而StatsModels更注重数据的统计建模分析
Scikit-Learn,这是一个机器学习相关的库,包括数据预处理、分类、回归、聚类、预测、和模型分析等
Keras,用来搭建神经网络
Gensim,topic modeling for humans!
数据探索
数据质量分析
主要任务
检查原始数据中是否存在脏数据
脏数据一般是指不符合要求,以及不能直接进行相应分析的数据
缺失值
异常值
不一致的值
重复数据及含有特殊符号(如#、¥、*)的数据
缺失值分析
数据的缺失主要包括记录的缺失和记录中某个字段信息的缺失
缺失值产生的原因
有些信息暂时无法获取,或者获取信息的代价太大
有些信息是被遗漏的
属性值不存在
缺失值的影响
数据挖掘建模将丢失大量的有用信息
数据挖掘模型所表现出的不确定性更加显著,模型中蕴含的规律更难把握
包含空值的数据会使建模过程陷入混乱,导致不可靠的输出
缺失值的分析
使用简单的统计分析,可以得到含有缺失值的属性的个数,以及每个属性的未缺失数、缺失数与缺失率等
缺失值处理分类
删除存在缺失值的记录
对可能值进行插补
不处理
异常值分析
简介
异常值分析是检验数据是否有录入错误以及含有不合常理的数据
重视异常值的出现,分析其产生的原因,常常成为发现问题进而改进决策的契机
异常值是指样本中的个别值,其数值明显偏离其余的观测值
异常值也称为离群点,异常值的分析也称为离群点分析
简单统计量分析
最常用的统计量是最大值和最小值
3σ原则
如果数据服从正态分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值
如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述
箱型图分析(p35)
箱型图提供了识别异常值的一个标准:小于QL-1.5IQR或大于QU+1.5IQR的值p
QL称为下四分位数,表示全部观察值中有四分之一的数据取值比它小
QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它大
IQR称为四分位数间距,是上下四分位数之差,其间包含了全部观察值的一半
一致性分析
数据不一致性是指数据的矛盾性、不相容性
不一致数据的产生主要发生在数据集成的过程中,这可能是被挖掘数据是来自于从不同的数据源、对于重复存放的数据未能进行一致性更新造成的
数据特征分析
分布分析
简介
分布分析能揭示数据的分布特征和分布类型
对于定量数据,可通过频率分布表、频率分布直方图、茎叶图进行直观分析
对于定性分类数据,可用饼图和条形图直观地显示分布情况
定量数据的分布分析
步骤
求极差
决定组距和组数
决定分点
列出频率分布表
绘制频率分布直方图
原则
个组之间必须是相互排斥的
各组必须将所有的数据包含在内
各组的组宽最好相等
定性数据的分布分析
饼图的每一个扇形部分代表每一类型的百分比或频数
条形图的高度代表每一类型的百分比或频数,条形图的宽度没有意义
对比分析
适用于指标间的横纵向比较、时间序列的比较分析
在对比分析中,选择合适的对比标准是十分关键的步骤
对比分析的两种形式
绝对数比较
相对数比较
相对数分类
结构相对数:将同一总体内的部分数值与全部数值对比求得比重,用以说明事物的性质、结构或质量
比例相对数:将同一总体内不同部分的数值进行对比,表明总体内各部分的比例关系
比较相对数:将同一时期两个性质相同的指标进行对比,说明同类现象在不同空间条件下的数量关系
强度相对数:将两个性质不同但有一定联系的总量指标进行对比,用以说明现象的强度、密度和普遍程度
计划完成程度相对数:是某一时期实际完成数与计划数的对比,用以说明计划完成程度
动态相对数:将同一现象在不同时期的指标数值进行对比,用以说明发展方向和变化的速度
统计量分析
简介
常从集中趋势和离中趋势两个方面进行分析
平均水平的指标是对个体集中趋势的度量,使用最广泛的是均值和中位数
反映变异程度的指标则是对个体离开平均水平的度量,使用较广泛的是标准差(方差)、四分位间距
集中趋势度量
均值:所有数据的平均值
加权平均值
频率分布表平均值
中位数
众数:数据集中出现最频繁的值,众数不具有唯一性
离中趋势度量
极差:最大值-最小值
标准差:数据偏离均值的程度
变异系数:度量标准差相对于均值的离中趋势
变异系数主要用来比较两个或多个具有不同单位或不同波动幅度的数据集的离中趋势
四分位数间距
四分位数包括上四分位数和下四分位数
四分位数间距越大,数据的变异程度越大;反之,说明变异程度越小
周期性分析
周期性分析是探索某个变量是否随时间变化而呈现出某种周期变化趋势
贡献度分析
贡献度分析又称帕累托分析,原理:帕累托法则,又称20/80定律
相关性分析
直接绘制散点图
绘制散点图矩阵
计算相关系数(p48)
pearson相关系数
Spearman秩相关系数
判定系数:相关系数的平方
python主要数据探索函数
基本统计特征函数(p50)
拓展统计特征函数
统计做图函数
python主要统计作图函数
.plot(),绘制线性二维图,折线图
.pie(),绘制饼图
.hist(),绘制二维条形直方图,可显示数据的分配情形
.boxplot(),绘制样本数据的箱形图
plot(logy=True),绘制y轴的对数图形
plot(yerr=error),绘制误差条形图
数据预处理
数据清洗
数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据、筛选掉与挖掘主题无关的数据,处理缺失值、异常值
缺失值处理
处理方法
删除记录
数据插补
均值/中位数/众数插补
使用固定值
最近临插补
回归方法
插值法
不处理
拉格朗日插值法
牛顿插值法
异常值处理
删除含有异常值的记录
视为缺失值
平均值修正
不处理
数据集成
实体识别
实体识别是指从不同数据源识别出现实世界的实体
任务:统一不同源数据的矛盾之处
常见形式
同名异义
异名同义
单位不统一
冗余属性识别
数据集成会导致数据冗余
同一属性多次出现
同一属性命名不一致导致重复
有些冗余属性可以用相关分析检测
数据变换
简单函数变换
将不具有正态分布的数据变换成具有正态分布的数据
规范化(归一化)
最小-最大规范化(离差标准化)
x'=(x-min)/(max-min)
将数值值映射到【0,1】之间
离差标准化保留了原来数据中存在的关系
是消除量纲和数据取值范围影响的最简单方法
0-均值规范化(标准差标准化)
x'=(x-x平)/σ
经过chu'li后的数据均值为0,标准差为1
x平为原始数据的均值,σ为原始数据的标准差
小数定标规范化
连续属性离散化
将连续属性变换成分类属性
离散化的过程
确定分类数
如何将连续属性值映射到这些分类值
常用的离散化方法
等宽法
等频法
基于聚类分析的方法
属性构造
小波变换
基于小波变换的特征提取方法
基于小波变换的多尺度空间能量分布特征提取
基于小波变换的多尺度空间的规模极大值特征提取
基于小波包变换的特征提取
基于适应性小波的神经网络的特征提取
小波基函数
一种具有局部支集的函数,并且平均值为0
常用的小波基由Haar小波基、db小波基等
小波变换(p73)
数据规约
意义
降低无效、错误数据对建模的影响,提高建模的准确性
少量且具代表性的数据将大幅度缩减数据挖掘所需要的时间
降低存储数据的成本
属性规约
目标:寻找出最小的属性子集并确保新数据子集的概率分布尽可能地接近原来数据集的概率分布
属性规约方法
合并属性:将一些旧属性何为新属性
逐步向前选择:每次从原来属性集合选一个最优属性
逐步向后删除:每次从当前属性集合中删除一个最差属性
决策树归纳
主成分分析:将许多相关性很高的变量转化成彼此相互独立或不相关的变量
数值规约
分类
有参数方法
无参数方法
无参数方法
直方图:使用分箱来近似数据分析
聚类:将数据元组视为对象
抽样:用比原始数据小得多的随机样本表示原始数据集
s个样本无放回简单随机抽样
s个样本有放回简单随机抽样
聚类抽样
分层抽样
参数回归
python主要数据预处理函数
interpolate,一维,高维数据插值
Scipy的一个子库,包含大量的插值函数
from scipy.interpolate import *,引入相应的插值函数
unique,去除数据中的重复元素,得到单值元素列表,它是对象的方法名
既是Numpy库的一个函数(np.unique()),也是Series对象的一个方法
使用方法
np.unique(D),D是一维数组,可以是list、array、Series
D.unique(),D是pandas的Series对象
isnull,判断是否空值
D.isnull()/D.notnull(),这里要求D是Series对象,返回一个布尔Series
notnull,判断是否非空值
PCA,对指标变量矩阵进行主要成分分析
from sklearn.decomposition import PCA
random,生成随机矩阵
挖掘建模
分类与预测
简介
分类和预测是预测问题的两种主要类型
分类主要是预测分类标号(离散属性)
预测主要是建立连续值函数模型,预测给定自变量对应的因变量的值
实现过程
分类:构造一个分类模型,输入样本的属性值,输出对应的类别,将每个样本映射到预先定义好的类别
预测:建立两种或两种以上变量间相互依赖的函数模型,然后进行预测或控制
实现过程
通过训练集建立分类/预测模型
在模型通过检验后进行预测或控制
常用的分类与预测算法
回归分析
决策树
人工神经分析
贝叶斯网络
支持向量机
回归分析
通过建立模型来研究变量之间互相关系的密切程度、结构状态及进行模型预测的一种有效工具‘
主要回归模型
线性回归:可用最小二乘法求解模型系数
非线性回归
Logistic回归:因变量一般有1和0两种取值
岭回归:参与建模的自变量之间具有多重共线性
主成分回归
Logistic回归分析介绍
Logistic函数
取1和取0的概率之比为p/(1-p),称为优势比
Logistic变换Logit(p)=ln(p/(1-p))
令Logit(p)=ln(p/(1-p))=z,则p=1/(1+e^(-z)),即为Logistic函数
Logistic回归模型(p87)
Logistic回归模型解释(p87)
logistic回归建模步骤
根据分析目的设置指标变量(因变量和自变量),然后收集数据,根据收集到的数据,对特征再次进行筛选
y取1的概率是p=P(y=1|X),取0概率是1-p。用ln(p/(1-p))和自变量列出线性回归方程,估计出模型中的回归系数
进行模型检验
模型应用
决策树
人工神经网络
分类与预测算法评价
python分类预测模型特点
聚类分析
常用聚类分析算法
K-Means聚类算法
聚类分析算法评价
python主要聚类分析算法
关联规则
资源
网站
资源列表
Guido van Rossum 个人主页,查看大牛的博客和访谈 https://gvanrossum.github.io//index.html
Beginner’s guide for python 官方指南 https://wiki.python.org/moin/BeginnersGuide
Python2 or 3比较 https://wiki.python.org/moin/Python2orPython3
Quick and Dirty python scripts 代码片段展示http://sebsauvage.net/python/programs.html
ActiveState收录的流行Python代码段 http://code.activestate.com/recipes/langs/python/ 此链接可下载打包版本 http://sebsauvage.net/python/recipes.zip
XKCD plot 有意思的应用http://nbviewer.jupyter.org/url/jakevdp.github.com/downloads/notebooks/XKCD_plots.ipynb
以色列特拉维夫大学python教程 Tel-Aviv https://github.com/yoavram/CS1001.py
一篇pandas使用notebook http://nbviewer.jupyter.org/github/phelps-sg/python-bigdata/blob/master/src/main/ipynb/pandas.ipynb
有趣的Jupyter notebook ,涉及多个领域、包 (代码、解释、图形、表格都在一起,数百份教程,快速学习的首选) https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks
另一个详细的教程 http://nbviewer.jupyter.org/github/lijin-THU/notes-python/blob/master/index.ipynb
小抄大全 http://blog.csdn.net/qazplm12_3/article/details/78782797
Python从新手到专家 http://www.kuqin.com/docs/diveintopythonzh-cn-5.4b/html/toc/
哈佛大学的算法课 (前面主要是python基本使用,回答问题,老教授会给发糖,现在好像找不到了,不过这个链接给了很多好的课) https://github.com/prakhar1989/awesome-courses
Python MOOC集锦 http://coursegraph.com/search_results/python
简明python教程 (翻看3遍即可) http://www.kuqin.com/abyteofpython_cn/
Google的Python课 https://blog.hartleybrody.com/google-python/
廖雪峰的Python教程 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
父与子的编程 (上到88岁,下到8岁,都可以阅读本书。它不仅以一种有趣的方式介绍了Python编程的知识,其中的最佳实践还适用于其他编程语言的学习。) http://www.ituring.com.cn/book/1353
哈佛计算机基础课 (基础概念,加深理解) http://open.163.com/special/opencourse/cs50.html
Python学习推荐
参考
https://mp.weixin.qq.com/s?__biz=MzI1MjU5MjMzNA==&mid=2247484564&idx=1&sn=4906d401c94da55ac5c99df3d2089b97&chksm=e9e02d35de97a423e907562dd961220a1ffbe19fe5fa45bda89faa09d6f1f7142365e306897a&mpshare=1&scene=21&srcid=1213uxzrGTxaIpJG57gthJaM#wechat_redirect
PyCharm配置
下载PyCharm专业版,使用edu邮箱申请专业版的许可证;
安装Anaconda科学计算环境;
在PyCharm中配置Anaconda
个性化修改PyCharm配置,主题修改成Darcula(黑色背景),代码字体设大。
软件开发流程
程序是成长起来的,不是搭建出来的。 (Software is grown, not built.) — Bill de hÓra
anaconda
anaconda自带的几个功能
jupyter notebook: 网页版的文本编辑器,能够用tab进行命令补全还有联想,比较适合用于代码试错阶段。
qtconsole: IPython的图形界面版, IPython是原生Python解释器的功能增强版(也就是vim和vi的区别,智能手机和普通手机的区别)。其实你可以在命令行下输入ipython启动,而且强烈推荐学习它。
spyder: 这是一种整合开发环境(IDE),常用于Python的数据分析也就是(如果你用Rstudio,你会感到莫名的熟悉感)。可以在左边输入大块代码,进行某一类数据分析,在右下方执行比较少量的代码,然后右上方则是可以在教程,变量管理,文件管理进行切换。
为什么要用anaconda
第三方包
可以进行python版本管理,自由切换不同版本的Python环境。
作为新手,装一个anaconda,那么根据环境变量的顺序,默认会使用anaconda的python,
软件安装非root
conda install
conda update
conda upgrae
IDE
Visual Studio Code
sublime
atom
vim
插件
更加简单粗暴的答案就是Windows用notepad++, Linux和mac用sublime或atom。没有任何原因,单纯个人看法。
教材的话
我推荐初学者
编程小白的第一本 Python 入门书
笨方法学Python
a byte of Python
进阶的话可以去看
流畅的python,
python核心编程
Python程序员都会喜欢的6个库
https://mp.weixin.qq.com/s?__biz=MzAwOTc3Mzg2Nw==&mid=2651696984&idx=1&sn=d7e17e4b06778721ad6b0b0753091e23&chksm=80a3791cb7d4f00a3edb4a97d1df344a96fb9bb8bdcacf5b7f127f867dff0845b7c4c6f88196&mpshare=1
70个Python练手项目列表
https://zhuanlan.zhihu.com/p/27931879?utm_medium=social&utm_source=ZHShareTargetIDMore
Python程序员应读的8本经典书籍
http://www.360doc.com/content/16/0505/20/32626470_556580941.shtml
Python开源项目
Workshop
参考
Workshop: 用Python做科学计算
https://mp.weixin.qq.com/s?__biz=MjM5NzU0MzU0Nw==&mid=2651376738&idx=2&sn=a9a471933df5f5d69cff38fafee1c444&chksm=bd2407768a538e60ff298e86609de3ab5c69031fa7b27c95b8978c2cadde4280053c9c473e4e&mpshare=1
在workshop中,我们涵盖了大量的核心软件包,并为您指明进一步研究的方向。 Workshop附有几个互动的Jupyter Notebook示例,用来说明SciPy生态系统的不同方面。
https://github.com/Andrewnetwork/WorkshopScipy
Workshop Notebooks示例
初学MNIST - 一个关于如何建立一个简单的神经网络用于MNIST数字分类的TensorFlow教程。
练习 - 用SymPy推导二次公式 - 使用SymPy推导二次公式的教程。
探索MNIST的多种形式 - 使用Scikit-Learn包通过应用PCA和K-Means方法来探索MNIST。同时也有其他交互组件。
Latex Essentials-向您展示使用LaTex进行排版和数学笔记的基础知识。
线性回归 - 空间解决方案 - 交互式组件用于探索线性回归。同时展示如何用matplotlib进行3D绘图。
线性回归 - 梯度下降 - 如何使用梯度下降来寻找最佳线性回归的教程。
线性函数对比非线性函数 - 展示如何进行2D和基本的3D绘图。也给你一个线性函数和非线性函数之间差异的直观认识。
作为函数&绘图向量的矩阵 - 展示如何使用Matplotlib绘制向量,并展示矩阵如何被视为线性变换。更多的使用了Matplotlib。
MNIST概率实验1 - 展示在MNIST上计算各种统计的不同实验。
神经布尔连接1 - 展示一个非常简单的单隐层神经网络,以及它如何表示XOR函数。还展示它如何表示AND。
SymPy基础知识 - 向您展示SymPy的一些基本功能。
泰勒序列 - 使用SymPy探索泰勒序列。同时也使用Matplotlib。
Poke Pandas - 使用Pandas分析pokemon游戏中有关小宠物的数据的notebook示例。
Workshop配置
下载Workshop的.zip文件:http://bit.ly/2A6dTYp
解压workshop.zip。 (查看文档)
下载Anaconda Navigator(AN)PYTHON 3.6版本https://www.continuum.io/downloads
从主页选项卡启动Jupyter Notebook服务。
浏览器应该在启动Jupyter Notebook服务时打开。 在该浏览器中,找到解压后的workshop文件夹。
点击setup.ipynb并按照说明操作。
wechat_jump_game
https://github.com/wangshub/wechat_jump_game
https://zhuanlan.zhihu.com/c_102060791
https://github.com/wangshub/wechat_jump_game/releases
https://wangshub.github.io/2017/12/29/%E6%95%99%E4%BD%A0%E7%94%A8Python%E6%9D%A5%E7%8E%A9%E5%BE%AE%E4%BF%A1%E8%B7%B3%E4%B8%80%E8%B7%B3/
更多
值得关注的5个Python开源项目
https://mp.weixin.qq.com/s?__biz=MjM5NzU0MzU0Nw==&mid=2651376811&idx=1&sn=b766afcead2fe5fdc7f13bd25a45476e&chksm=bd2407bf8a538ea9b3226b479b5dc9cfddd46e0425f845a68d6fdec334a0738c322c95f141f9
幕布
https://mubu.com/doc/6DtITTaOr