python基础学习 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 i1 = 123 print(repr(i1)) i2 = 12.3 print(repr(i2)) i3 = 1.2 + 3.4j print(repr(i3)) i4 = 0b1101 print(repr(i4)) b1 = True print(repr(b1)) b2 = 3 > 4 print(repr(b2)) s1 = "abc ABC" print(repr(s1)) s2 = "abc\n\t\rABC" print(repr(s2)) s3 = "翔宇亭IT乐园" print(repr(s3)) 输出结果: 123 12.3 (1.2 +3.4j ) 13 True False 'abc ABC' 'abc\n\t\rABC' '翔宇亭IT乐园' lst = [12 ,12.1 ,'A' ,'æ' ,'奥运会' ] print(repr(lst)) t = ('奥运会' ,'A' ,'a' ,'æ' ) print(repr(t)) d = {'字符' :'优雅' ,'A' :'â' ,'1' :1 } print(repr(d)) 输出结果: [12 , 12.1 , 'A' , 'æ' , '奥运会' ] ('奥运会' , 'A' , 'a' , 'æ' ) {'字符' : '优雅' , 'A' : 'â' , '1' : 1 } class Student : name="" def __init__ (self,name) : self.name = name class Teacher : name = "" def __init__ (self,name) : self.name = name def __repr__ (self) : return self.name S = Student("王涛" ) print(repr(S)) T = Teacher("苏炳添" ) print(repr(T)) 输出结果: <__main__.Student object at 0x0000000002DB47F0 > 苏炳添
isdecimal\isdigit\isnumeric
与 isdecimal() 相比,isdigit() 和 isnumeric() 都能判断 unicode 编码的数字字符串:如 ⑴ 、①和 \u00b2
与 isdigit() 相比, isnumeric() 还能判断 中文数字:如 一千一百零一
def printinfo( arg1, vartuple ): 加了星号 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
def printinfo( arg1, vardict ): 加了两个星号 的参数会以字典的形式导入。
def f(a,b,,c): 声明函数时,参数中星号 可以单独出现 如果单独出现星号 ,则星号 后的参数必须用关键字传入:
1 2 3 4 def f (a,b,*,c) :... return a+b+cf(1 ,2 ,3 ) f(1 ,2 ,c=3 )
迭代器 需要实现iter ()和next ()方法
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
继承 class DerivedClassName(Base1, Base2, Base3): 需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法
1 2 3 4 5 6 7 8 9 定义字典的几种方法 dict([('sape' , 4139 ), ('guido' , 4127 ), ('jack' , 4098 )]) {'sape' : 4139 , 'jack' : 4098 , 'guido' : 4127 } {x: x**2 for x in (2 , 4 , 6 )} {2 : 4 , 4 : 16 , 6 : 36 } dict(sape=4139 , guido=4127 , jack=4098 ) {'sape' : 4139 , 'jack' : 4098 , 'guido' : 4127 }
文件 1 2 3 with open('/tmp/foo.txt' , 'r' ) as f:... read_data = f.read()f.closed
Numpy ndarray数据类型 直接用list进行初始化1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 data1 = [1 ,2 ,3 ,4 ] arr1 = np.array(data1) print(arr1) data2 = [[1 , 2 , 3 , 4 ], [2 , 3 , 4 , 5 ]] arr2 = np.array(data2) print(arr2) np.zeros(10 ) np.ones((3 ,6 )) np.empty((2 , 3 , 2 )) np.arange(10 ) np.eye(4 ) 或者 np.identity(4 ) print("arr2[1:3]" , arr2[1 :3 ]) print("arr2[:, 0:2]" , arr2[:, 0 :2 ]) print("arr2[1, 0:2]" , arr2[1 , 0 :2 ]) np.random.randn(4 ,3 ) names = np.array(['bob' ,'aa' ,'bob' ,'bb' ]) print(names == 'bob') => [true, false, true, false] arr2[names='bob'] => 会输出第一行和第三行数据 arr2[names='bob', 1:] => 会输出第一行和第三行数据中从第二行开始的列 arr2[arr2 < 0] = 0 => 将所有小于0的数据修改为0 arr = np.empty((8 ,4 )) for i in range(8 ): arr[i] = i arr[[4, 5, 0, 6]] => 意思是获取第四行,第五行, 第一行, 第六行的数据, 拼成一个二维数组 np.where(条件, 满足条件选项, 不满足条件选项) con = np.array([True , False , True , False ]) np.where(con, 数组1 (或者标量), 数组2 (或者标量)) np.where(arr > 0 , 2 , -2 ) np.where(arr > 0 , 2 , arr)
take 取出索引相应值 从数组中取出目标索引对应的值
1 2 3 4 5 6 7 a = [1 ,2 ,3 ,4 ,5 ,6 ] np.take(a, [0 ,1 ,4 ]) np.take(a, [[0 ,1 ],[2 ,3 ]])
ravel 将数组拉成一维数组 np.ravel(arr)
或者arr.ravel()
flattern 将数组拉成一维数组 arr.flattern()
reshape 形状变换 1.数组元素不能改变 2.转换前元素个数必须符合转换之后的元素个数
1 np.arange(12 ).reshape(3 ,4 )
flatten 拉平 1 2 a = np.array([1 ,2 ],[3 ,4 ]) a.flatten => [1,2,3,4]
hstack 水平组合 1 2 3 4 5 6 7 8 9 a = [1 ,2 ,3 ] b = [4 ,5 ,6 ] np.hstack((a,b)) => [1,2,3,4,5,6] a = [[1 ],[2 ],[3 ]] b = [[4 ],[5 ],[6 ]] np.hstack((a,b)) => [[1,4],[2,5],[3,6]]
concatenate axis=0 指的是水平连接, axis=1指垂直连接 它会降维连接, 例如:
1 2 3 a = [[1 ],[2 ],[3 ]] b = [[4 ],[5 ],[6 ]] np.concatenate((a,b), axis=0) => [[1],[2],[3],[4],[5],[6]]
vstack 垂直组合 1 2 3 a = [1 ,2 ,3 ] b = [4 ,5 ,6 ] np.vstack((a,b)) => [[1,2,3],[4,5,6]]
dstack 深度组合 1 2 3 a = [1 ,2 ,3 ] b = [4 ,5 ,6 ] np.dstack((a,b)) => [[1,4],[2,5],[3,6]]
row_stack 1 2 3 a = [1 ,2 ,3 ] b = [4 ,5 ,6 ] np.row_stack((a,b)) => [[1,2,3],[4,5,6]]
column_stack 1 2 3 a = [1 ,2 ,3 ] b = [4 ,5 ,6 ] np.row_stack((a,b)) => [[1,4],[2,5],[3,6]]
vsplit 按照行拆分 1 2 3 x = np.arange(16 ).reshape(4 ,4 ) result = np.vsplit(x,4 )
tile 平铺函数 第一个参数是需要重复的对象, 第二个重复的次数
1 2 3 4 5 6 7 np.tile((1 ,2 ,3 ),2 ) np.tile([[1 ,2 ],[3 ,4 ]], 2 )
repeat(a, repeats, aixs=None) 函数 将每个元素repeat一下, 跟tile有所不同
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 np.repeat((1 ,2 ,3 ),2 ) axis=1 , 按照列重复, axis=0 , 按照行重复 x = np.array([[1 ,2 ],[3 ,4 ]]) print(np.tile(x, 2 )) print(np.repeat(x, 2 , 0 )) print(np.repeat(x, 2 , 1 )) print(np.repeat(x, [1 ,2 ], 0 ))
delete 删除 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 numpy.delete(arr,obj,axis=None ) x = np.array([[1 ,2 ,3 ],[3 ,4 ,5 ]]) print(np.delete(x, 0 , 1 )) print(np.delete(x, 0 , 0 )) print(np.delete(x, [0 ,2 ], 1 ))
insert 插入数据 1 2 3 4 5 6 7 8 9 numpy.insert(arr, obj, value, axis=None ) obj指的是需要插入的位置, value是需要插入的值 x = np.array([[1 ,2 ,3 ],[3 ,4 ,5 ]]) print(np.insert(x, 1 , [1 , 1 ], 1 ))
append 插入数据 1 2 np.append(arr, value, axis=None )
savetxt 将数据存储到文件中 1 savetxt(fileName, data, header(储存文件第一行内容), footer(储存文件最后一行内容))
读取csv文件 1 2 3 4 5 6 7 8 9 10 11 12 13 1. loadtxt(filepath, dtype(类型,默认是float),delimiter, usecols(选择那几列进行加载), unpack(如果为True , 分列读取), skiprows(跳过前n行))np.loadtxt('test.csv' ,delimiter=',' ) loadtxt的功能是读入数据文件,这里的数据文件要求每一行数据的格式相同。没有数据头的文件可以用这个 unpack参数可以将列拆到变量里 c, v = loadtxt(filepath, delimiter=',' , unpack=True ) 2. genfromtxt(文件名, 分隔符 , 是否有标题列)a = np.genfromtxt('test.csv' ,delimiter=',' , names=True ) a[0 ] : 选出第一行 a[标题名]: 选出标题对应对应的一列
T 转置 1 2 3 4 x = np.array([[1 ,2 ,3 ],[3 ,4 ,5 ]]) print(x.T) x.transpose(1 ,0 ,2 )
mean 平均数计算 1 2 3 4 5 6 7 arr = np.array([[1 ,2 ,3 ],[3 ,4 ,5 ]]) arr.mean(axis = 1 ) 与 np.mean(arr)相同, 将每一行的所有列累加, 计算平均数 arr.mean() - 计算全部的数的平均 arr.mean(axis = 0 ) 按照行计算平均数
sum 计算和 1 2 3 4 5 arr = np.array([[1 ,2 ,3 ],[3 ,4 ,5 ]]) arr.sum(axis = 0 ) 按行算和 arr.sum() 算总和
cumsum和cumprod 统计操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 arr.cumsum(0 ) arr.cumprod(0 )
max和min 1 2 3 4 5 6 arr.max() arr.max(0 ) arr.min()
argmin、argmax 获取最小值和最大值的坐标
average 平均数 计算加权平均数: np.average(arr, weight(数组))
np.average(arr, ‘权重数组’)
ptp 取范围 获取范围 = 最大值 - 最小值
np.ptp(arr)
np.median(arr)
sort 行排序 np.sort(arr)
msort 列排序 np.msort(arr)
var 方差 np.var(arr)
diff 后一个元素减去前一个元素 np.diff(arr)
[1,2,4,8] => [1, 2, 4]
std 标准差 np.std(arr)
linspace 等差数列 np.linspace(0,1,10) => 在0-10之间生成等差数列
np.linspace(0,1,10,endpoint=false) => 在0-9之间生成等差数列
meshgrid 生成网格点坐标矩阵 json loads和load 1 2 3 4 5 6 7 json.loads(json字符串) json.load(文件) : with open('test.json' , 'rb' ) as f: data = json.load(f) print(data)
内存管理机制 引用计数 引用计数增加
对象被创建:x=4
另外的别人被创建:y=x
被作为参数传递给函数:foo(x)
作为容器对象的一个元素:a=[1,x,’33’]
引用计数减少
一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。
对象的别名被显式的销毁:del x ;或者del y
对象的一个别名被赋值给其他对象:x=789
对象从一个窗口对象中移除:myList.remove(x)
窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。
垃圾回收
垃圾收集器会检查引用计数为0的对象, 将他们回收, 两个对象互相引用的时候也会被清除
循环垃圾回收器, 确保释放循环应用
内存池机制 分为大内存和小内存, 大于256字节, 使用malloc进行分配, 小于256字节, 使用内存池进行分配
内存池分为:Block、Pool、Arean、usedpool
拆包 通常使用*进行拆包1 2 3 4 5 6 7 lista=[1 ,2 ,3 ] print(*lista) 会拆成3 个变量 dicta={"a" :1 , "b" :2 } print(**dicta) 拆成a=1 ,b=2
封包 返回多个变量后赋值给一个变量1 2 3 4 5 6 7 8 9 10 def fengbao2 (**kargs) : print(kargs) fengbao2(a=1 ,b=1 ) def fengbao (*args) : print(args) fengbao(1 ,2 )
推导式/生成器表达式 yield 使用了 yield 的函数被称为生成器(generator) 元组推导式(生成器表达式)
yield from 总的来说asyncio比线程优越的地方就是:协程不像线程那样需要频繁进行上下文切换、加锁、解锁,这些过程,所以协程之间切换的时间开销将大幅减小,效率上将大幅提高
yield from iterable本质上等于for item in iterable: yield item的缩写版
file 1 2 with open("./router.py" ) as f: print(f.readlines())
上下文 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def __exit__ (self, exc_type, exc_val, exc_tb) -> bool: """ with...as 语句退出或者发送异常时会执行这个方法 :param exc_type: 异常类型 :param exc_val: 异常信息 :param exc_tb: 异常栈 :return: with...as...语句内抛出的异常将以exc_type, exc_val, exc_tb这三个参数传入, 返回False时这个异常还会向上抛出,也就是抛出给main,返回True时将不会再向外抛出,被抑制 """ print(f"exc_type:{exc_type} " ) print(f"exc_val:{exc_val} " ) print(f"exc_tb:{exc_tb} " ) if exc_type is Exception: ... self.file.close() return True if __name__ == '__main__' : with FileContextManager("./router.py" ) as file: raise Exception("自定义异常信息" ) from None
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @contextlib.contextmanager def file_context_manager (file_path:str) : f = open(file_path) try : print("into try..." ) yield f print("out yield..." ) except Exception as e: finally : print("into finally..." ) f.close() if __name__ == '__main__' : with file_context_manager("./router.py" ) as f: print(f.readlines())
设计模式 单例模式 可以用以下四种方式来实现单例模式
使用模块
使用 __new__
使用装饰器(decorator)
使用元类(metaclass)
使用模块 Python 的模块就是天然的单例模式, 直接将函数和数据定义在另一个文件中1 2 3 4 5 class MyClass (object) : def foo (self) : print('MyClass.foo' ) my_class_obj=MyClass()
使用new方法 1 2 3 4 5 6 7 8 9 10 class MyClass (object) : _instance = None def __new__ (cls, *args, **kwargs) : if not cls._instance: cls._instance = super(MyClass, cls).__new__(cls, *args, **kwargs) return cls._instance class HerClass (MyClass) : a = 1
装饰器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from functools import wrapsdef singleton (cls) : instances = {} @wraps(cls) def getinstance (*args, **kwargs) : if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return getinstance @singleton class MyClass (object) : a = 1
元类 元类就是用来创建类的“东西”。元类就是类的类。type就是创建类对象的类
在写一个类的时候为他添加__metaclass__属性, python就会用它来新建类, 如果没有这个就会默认用type类
1 2 3 4 5 6 7 8 9 10 class Singleton (type) : _instances = {} def __call__ (cls, *args, **kwargs) : if cls not in cls._instances: cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) return cls._instances[cls] class MyClass (metaclass=Singleton) : pass
继承 super(Person,self).__init__(name,age)
super后面的第一个参数是指从哪一个类之后开始找(不包含这个类) super后面的第二个参数是指方法解析顺序(MRO(Method Resolution Order))是怎么样的, 比如说下面的例子就是Male -> Person -> Animal -> Object
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 class Animal () : def __init__ (self,name) : self.name = name class Person (Animal) : def __init__ (self,name,age) : super().__init__(name) self.age = age print('Person' ) class Male (Person) : def __init__ (self,name,age) : super(Person,self).__init__(name,age) super(Person,self).__init__(name) print("Male" ) m = Male('xiaoming' ,12 ) super(Male,m).__init__('xiaoming' ,12 ) print(m.__dict__)
MRO
子类永远在父类前面
如果有多个父类,会根据它们在列表中的顺序被检查
如果对下一个类存在两个合法的选择,选择第一个父类
如何查看方法解析顺序 class.__mro__
和class.mro()
例如:
动态创建类 type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
1 2 3 4 5 6 7 8 9 10 11 12 class Foo (object) : bar=True Foo = type('Foo' , (), {'bar' :True }) class FooChild (Foo) : pass FooChild = type('FooChild' , (Foo,),{})
设计模式六大原则
开闭原则 - 拓展开放, 修改关闭
里氏代换原则 - 子类可替换父类
依赖倒转原则 - 接口抽象
接口隔离原则 - 类之间的依赖关系应该建立在最小接口上
迪米特法则 - 不需要知道其他的类是怎么实现的
单一职责原则
设计模式 https://www.cnblogs.com/superhin/p/17486255.html https://baijiahao.baidu.com/s?id=1758410771062793648&wfr=spider&for=pc
sys模块 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 os._exit() 用于在线程中退出 sys.exit() 用于在主线程中退出 os._exit(n): 直接退出, 不抛异常, 不执行相关清理工作。常用在子进程的退出。 sys.exit(n) :退出程序引发SystemExit异常,可以捕获异常执行些清理工作。n默认值为0 ,表示正常退出,其他都是非正常退出。还可以sys.exit(“sorry, goodbye!”); 一般主程序中使用此退出 exit()/quit()跟sys.exit(n)没什么区别,也抛出SystemExit异常。一般只在shell命令行页面退出python。 sys.version :获取Python解释程序的版本信息 sys.platform :返回操作系统平台名称 sys.stdin.readline() :与input功能一样, 就是比input会多一个\n input :输入, 不会记录\n sys.stdout.write('hello' + '\n' ) print('hello' ) sys.argv :命令行参数List,第一个元素是程序本身路径
datetime模块 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 datetime.date(yyyy, MM, dd):表示日期的类,主要用于处理年、月、日; 默认输出格式是yyyy-MM-dd datetime.date.today():获取当前时间 datetime.date.today().weekday():返回当前日期是星期几 datetime.date.fromtimestamp(1576244364 ):通过时间戳转成时间 datetime.date.today().today.year:获取年,month月,day日 datetime.time:表示时间的类,主要用于处理时、分、秒;默认格式是hh:mm:dd datetime.time.hour:获取小时,minute:分,second:秒,microsecond:微秒 datetime.datetime:表示日期时间的类,date类和time类的综合使用,可以处理年、月、日、时、分、秒; datetime.datetime.timestamp():获取时间戳 datetime.datetime.now():现在的时间点 datetime.timedelta:表示时间间隔,即两个时间点的间隔,主要用于做时间加减的 例如: t1 = timedelta(weeks = 2 , days = 5 , hours = 1 , seconds = 33 ) t2 = timedelta(days = 4 , hours = 11 , minutes = 4 , seconds = 54 ) t3 = t1 - t2 t = timedelta(days = 5 , hours = 1 , seconds = 33 , microseconds = 233423 ) print("total seconds =" , t.total_seconds()) 算出时间点的秒数, 这里就是5 天1 小时33 秒, 折出来的秒数 strftime() - 格式化时间, 从日期转为字符串 datetime.datetime.now().strftime("%m/%d/%Y, %H:%M:%S" ) strptime() - 格式化时间,从字符串转为日期 date_string = "21 June, 2018" date_object = datetime.strptime(date_string, "%d %B, %Y" ) print("date_object =" , date_object) datetime.tzinfo:时区的相关信息。
Pandas 比较核心的模块是Series和DataFrame
Series Series是类似一个一维数组, 由一组数据和索引组成, 一般索引在左边, 值在右边
obj = Series([2,1,7,-4,9])
0 2 1 1 2 7 3 -4 4 9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 obj = Series([2 ,1 ,7 ,-4 ,9 ]) obj.values => [2,1,7,-4,9] obj.index => RangeIndex(start=0, stop=4, step=1) obj1 = Series(['aa' ,'bb' ,'cc' ], index=['a1' ,'a2' ,'a3' ]) print(obj1.index) => Index(['a1', 'a2', 'a3'], dtype='object') obj[['a1' , 'a3' ]] obj['a1' :'a3' ]
+ 并集运算 s1+s2 => 形成s1和s2的并集, 两个都有的话则相加, 如果有一个没有那么就是NaN
删除指定项 s1 = s.drop(‘索引’)
Frame 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 data = {'Number' :[1 ,2 ,3 ,4 ,5 ], 'Name' :['Alvin' ,'Teresa' ,'Elly' ,'James' ,'Nancy' ], 'Scores' :[98.5 , 100.0 , 93.0 ,98.5 ,90.5 ]} frame = DataFrame(data) 索引|Name|Number|Scores 0 |Alvin|1 |98.5 1 |Teresa|2 |100.0 2 |Elly|3 |93.0 ..|..|..|.. frame3 = DataFrame(data, columns=['Number' ,'Name' ,'Scores' ,'Age' ], index=['No.01' ,'No.02' ,'No.03' ,'No.04' ,'No.05' ]) frame3['Number']或者frame3.Number => 选出number列的所有值 data = {'Beijing' :{'2001' :2.4 , '2002' :2.9 ,'2003' :3.1 }, 'Tianjin' :{'2001' :2.3 , '2002' :2.7 }} frame = DataFrame(data) 索引 Beijing Tianjin 2001 2.4 2.3 2002 2.9 2.7 2003 3.1 NaN
+ 并集 d1 + d2 => 对应位置两个都有值就相加, 但凡有一个没有就是NaN
算数方法 add, sub, mul, div
删除指定项 df1 = df.drop([‘索引1’,’索引2’], axis=0)
s1.add(s2, fill_value=0) => s1与s2进行加法运算, 没有的位置补0
二维数组和一位数组的运算 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 arr = np.arange(12 ).reshape((3 ,4 )) print arrprint arr[0 ]print arr-arr[0 ]这种行为也叫广播 Series和DataFrame的运算, 与上面逻辑一致 df = DataFrame(np.arange(12 ).reshape((4 ,3 )), columns=list('ade' )) print dfs = df.ix[0 ] print sdf1 = df.ix[[0 ,1 ],column=[列1 ,列2 ]]
对Series和DataFrame用索引排序 Series:s.sort_index()
DataFrame:df.sort_index(axis=0/1, ascending=True/False)
axis不填默认行索引, ascending不填默认升序
对Series和DataFrame用值进行排序 Series: s.sort_values()
NaN默认在最后
DataFrame: 按列排序df.sort_index(by='列')
按多个列排序df.sort_index(by=['列1','列2'])
reindex 重建索引 Series: 通过reindex可以重新构建索引
重新建一个a,b,c,d的索引, 如果原来没有的话则补充为0obj.reindex(['a','b','c','d'], fill_value=0, method=ffill/bfill)
method有几个选项: ’ffill’或’pad 使用前面的值填充, ’bfill’或’backfill 使用后面的值填充
DataFrame: print frame.reindex(index=[‘a’,’b’,’c’,’d’], columns=new_columns, method=’ffill’)
group by 1 2 3 4 5 6 7 8 9 10 data = pandas.DataFrame([[1 ,2 ,3 ],[1 ,5 ,6 ],[7 ,8 ,9 ]], columns=['A' ,'B' ,'C' ]) group = data.groupby(by=['A' ]) print(group.size()) print(group.sum())
stack 1 2 3 4 5 6 7 8 9 10 11 12 13 14 data.stack() 0 A 1 B 2 C 3 1 A 1 B 5 C 6 2 A 7 B 8 C 9 dtype: int64 Process finished with exit code 0
merge 合并 理解成2个dataframe取交集 如果行列能够对上, 那么就可以取出来pandas.merge(a, b)
concat 合并 理解成unionpandas.merge([a,b], axis=0)
和pandas.merge([a,b], axis=1)
append 追加 上下连接, 跟pandas.merge([a,b], axis=0)一样,a.append(b)
read_csv 读取数据: pd.read_csv('文件路径')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 name age zhangsan 8 lisi 5 data = pd.read_csv('file.csv' ) print(data.index) => 0到1 print(data.columns) => ['name','age'] print(len(data)) => 2 print(data.shape) => (2,2) print(data.head(n)) print(data.tail(n)) print(data.info())
matplotlib 最基础的模块是pyplot
pyplot.plot(x轴数据, y轴数据, 样式) 样式: b–, b表示线的颜色blue, –表示虚线
使用pyplot.show()显示图型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 fig = plt.figure() ax1 = fig.add_subplot(2 ,2 ,1 ) ax2 = fig.add_subplot(2 ,2 ,2 ) ax3 = fig.add_subplot(2 ,2 ,3 ) plt.show() .add_subplot(行数,列数,位置) 位置是按照从左往右,从上到下自动排列 Axes对象 Title是图像标题, Axis是坐标轴, Label是坐标轴标注, Tick是刻度线 plt.xlabel() plt.ylabel() plt.title() plt.legend(): 标示不同图形的文本标签图例 plt.tight_layout(): 固定我们的布局, 避免出现子表 plt.subplot(2,2,1) -> 直接回将plt切换到这个子表, 调用plt.plot(x,y)对子表进行赋值 pc1=plt.subplot2grid((3 ,3 ),(1 ,1 ),rowspan=1 ,colspan=2 ) ↑首先理解成一个坐标轴, (3 ,3 )指的是大表的大小, (1 ,1 )指的是这个图左上角的坐标, rowspan指占一行, colspan指占2 行 通过pc1来操作这个子表 引入matplotlib.gridspec函数 gs = gridspec.GridSpec(3 ,3 ) plt.subplot(gs[0 ,:]) plt.subplot(gs[1 ,2 ]) c,((pc1,pc2),(pc3,pc4))plt.subplots(2 ,2 ) 将4个区域赋值给pc1,pc2,pc3,pc4, 这里为什么还有c这个值呢?因为c可以统一控制这四个子图 plt.scatter(x,y,alpha(透明度),c(设置颜色),s(控制点大小),marker(控制点的形状)) plt.hist(data,bins(方块的个数),normed(),facecolor(颜色),edgecolor(直方图勾边颜色)) plt.bar(data, left(柱子在x轴上的坐标),height(长条形高度),width(长条形宽度),label(标签)) plt.pie(data,explode(设置各部分突出),label(设置各部分标签)) plt.axis("equal") => 设置饼图是否是圆的 plt.contour() from mpl_toolkits.mplot3d import Axes3Dax3d=Axes3D(plt.figure()) ax3d.plot_surface() lot.rcParams['font.sans-serif' ]=['SimHei' ]
scipy linalg 线性代数 1 2 3 4 5 6 7 8 9 10 11 linalg.inv() linalg.sovle(A, b) linalg.lstsq linalg.eig(A)
plotly graph_objs 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 trace = graph_objs.Scatter(x轴数据, y轴数据, mode="" , name="线的名字" ) data = graph_objs.Data([trace]) plotly.iplot(data) surface = Surface(x=x, y=y, z=z) data = Data([surface]) trace2 = graph_objs.Bar( x=['giraffes' , 'orangutans' , 'monkeys' ], y=[12 , 18 , 29 ], name='LA Zoo' ) trace = graph_objs.Pie(labels=labels, values=values, hoverinfo='label+percent' , textinfo='value' , textfont=dict(size=20 ), marker=dict(colors=colors, line=dict(color='#000000' , width=2 ))) plotly.iplot([trace])
plotly, matplotlib, bokeh,Seaborn的区别 matplotlib: Matplotlib应该是最广泛使用的Python可视化工具,支持的图形种类非常多 plotly: 非常强大的Python可视化库,Plotly内置完整的交互能力及编辑工具,支持在线和离线模式 bokeh: 一个专门针对Web浏览器的呈现功能的交互式可视化Python库 Seaborn: 用于补充matplotlib函数. sns.setstyle来设置样式, sinplot来输出结果, despine来移除左边及底部轴线, color_palette调色, distplot默认绘制直方图和kdeplot核密度估计图, joinplot二元变量分布函数,stripplot来绘制散点图但点会重合, swarmplot也可以绘制散点图但点不会重合,boxplot来绘制箱位图,violinplot绘制小提琴图,implot和regplot跟拟合有关,FacetGrid绘制网格图表