我们经常会用到 Python 的各种库,坠痛苦的就是有一些实用的命令记不住,用的时候只好现查,而且这个效率 efficiency…… 所以啊,我整了这么个速查表,以后直接在这里找就好了。
本贴会持续更新~
注意:本文不是教程,而是速查表。
实用工具
datetime
import datetime
官方文档:https://docs.python.org/zh-cn/3/library/datetime.html
日期和时间均用datetime.datetime类的对象表示,所以我们先介绍该类的方法
now = datetime.datetime.now() # 当前时间,类型:datetime.datetime
now.year # 获取年(int)
now.month # 月
# 类似地还有:day, hour, minute, second, microsecond
datetime与字符串之间的转化
# datetime到字符串用strftime(f是format的意思)
now.strftime('%Y-%m-%d %H:%M:%S') # '2020-09-02 17:45:18',注意大小写
# 字符串到datetime用strptime
datetime.datetime.strptime('2020-09-02 17:45:18', '%Y-%m-%d %H:%M:%S')
# 这个方法很灵活,根据实际情况来写就行,比如你拿到的数据是'2020年9.2'
str_time = '2020年9.2'
datetime.datetime.strptime(str_time, '%Y年%m.%d') # 就可以正确生成
# 除了%Y,%m这些,还有许多其他类型的代码,完整格式代码请查看https://docs.python.org/zh-cn/3/library/datetime.html#strftime-and-strptime-format-codes
时间差
# timedelta类用来处理时间差
a = datetime.datetime.strptime('2020-09-02 17:45:18', '%Y-%m-%d %H:%M:%S')
b = datetime.datetime.strptime('2020-09-03 17:46:18', '%Y-%m-%d %H:%M:%S')
delta = b - a # 返回timedelta对象
delta.days # 1
delta.seconds # 60
# 注意只有 days. seconds 和 microseconds 会存储在内部,days=1,seconds=60表示这个时间差是1天零60秒,这个结果是唯一的,seconds满一天会自动进位,所以并不会出现days=0,seconds=86460这种情况。
数据处理
numpy
这部分主要整理自 https://cs231n.github.io/python-numpy-tutorial/
This tutorial was originally contributed by Justin Johnson
创建
numpy 的核心是 array,它可以表示高维张量,包括向量(rank=1)、矩阵(rank=2)、三阶张量(rank=3)等。我们有很多种方法创建 array:
import numpy as np
a = np.array([1, 2, 3]) # 通过list创建array
b = np.array([1, 2, 3], [4, 5, 6]) # rank=2,矩阵
print(b)
# [[1 2 3]
# [4 5 6]]
c = np.zeros((2, 2)) # 创建2*2的全0矩阵
d = np.ones((1, 2)) # 1*2的全1矩阵
e = np.full((2, 2), 7) # 2*2,元素都是7
f = np.eye(2) # 2*2单位矩阵
g = np.random.random((2, 2)) # 2*2随机矩阵
索引与切片
可使用list作为下标进行索引,并且支持与python类似的切片操作。
与list不同的是,array的切片操作返回的是引用,因此修改切片后的值会修改原array的值!
# Create the following rank 2 array with shape (3, 4)
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]]
a = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]])
b = a[:2, 1:3]
# [[2 3]
# [6 7]]
如果某一维度的索引是 int,array会进行降维。要想避免降维可以使用单个元素的 list:
row_r1 = a[1, :] # 矩阵惨遭降维成向量
row_r2 = a[1:2, :] # 如果把1改成1:2,虽然数据一样,但是不降维
row_r3 = a[[1], :] # 用[1]也不降维
print(row_r1, row_r1.shape)
print(row_r2, row_r2.shape)
print(row_r3, row_r3.shape)
# [5 6 7 8] (4,)
# [[5 6 7 8]] (1, 4)
# [[5 6 7 8]] (1, 4)
切片操作得到的永远是原来 array 的 subarray,如果我想重组怎么办呢?比如 [[1, 2], [3, 4]] 我想得到 [[3, 4], [1, 2], [1, 2]],可以使用 integer array indexing:
a = np.array([[1, 2], [3, 4]])
b = a[[1, 0, 0], [0, 1]]
# b是[[3, 4], [1, 2], [1, 2]],即a的第1行、第0行、第0行拼接
boolean array indexing 很强大,允许我们进行筛选:
a = np.array([[1,2], [3, 4], [5, 6]])
bool_idx = (a > 2) # Find the elements of a that are bigger than 2;
# this returns a numpy array of Booleans of the same
# shape as a, where each slot of bool_idx tells
# whether that element of a is > 2.
# [[False False]
# [ True True]
# [ True True]]
# We use boolean array indexing to construct a rank 1 array
# consisting of the elements of a corresponding to the True values
# of bool_idx
print(a[bool_idx])
# We can do all of the above in a single concise statement:
print(a[a > 2])
# [3 4 5 6]
# [3 4 5 6]
pandas
import pandas as pd
# 读取excel,第0个sheet
df = pd.read_excel('./filename.xlsx', 0)
# 获取行数、列数
nrow = df.shape[0]
ncol = df.shape[1]
### 切片、筛选、提取数据 ###
# 直接通过'[]',字符串表示列,数字表示行
df['price'] # 选取名字为'price'的列
df[['name', 'price']] # 选取多列,把列名放在list里
df[:2] # 第0行和第1行,这里和list的切片操作一样
# iloc和loc:索引用iloc,列名用loc。iloc和loc的优势是可以进行筛选
# loc用法:df.loc[index, column_name]
# 一个大坑:loc的行索引是闭区间,而不是python通用的左闭右开(但iloc是正常的)
df.loc[2, 'price'] # 第2行,名字为'price'的列
df.loc[[2,3],['name','price']] # index和column_name都可灵活使用list或切片
df.loc[df['price']<100,'name'] # 筛选,注意筛选条件是针对行的
# iloc用法:只要把loc的列名改成索引
df.iloc[df['price']<100, 2:5] # 一样可以灵活组合list和切片
df.iloc[df['price']<100 | df['price']>200] # 筛选条件'|'表示或,'&'表示与
sklearn
# 线性回归
from sklearn import linear_model
# 训练数据:X_train, y_train,测试数据:X_test
lm = linear_model.LinearRegression()
model = lm.fit(X_train, y_train)
y_pred = model.predict(X_test)
# 交叉验证
from sklearn.model_selection import cross_val_score
cross_val_score(m, X, y, cv=5, scoring='neg_mean_squared_error') # 5-fold cross validation, m是sklearn的model
数据结构
heapq
import heapq as hq
# python的heapq库是在list的基础上添加了堆的操作
# heapq有两种方式创建堆,一种是使用一个空列表,然后使用heapq.heappush()函数把值加入堆中
num = [1,1,4,5,1,4]
heapq.heappush(heap, num)
# 另外一种就是使用heapq.heapify(list)转换列表成为堆结构
heapq.heapify(num) # 这时候num也变成堆了
网络/爬虫相关
requests
import requests
# get请求
html = requests.get('www.baidu.com').text
# get请求可以优雅地加参数
params = {'q': '搜索测试'}
response = requests.get(url='www.google.com/search', params=params).text
BeautifulSoup
from bs4 import BeautifulSoup
# 之前用request获取html
bs = BeautifulSoup(html, 'html.parser')
# 查找标签,返回标签html字符串的list
p_list = bs.findAll('p') # 查找所有<p>标签
div_list = bs.findAll('div', attrs={'class': 'primary'}) # 带条件筛选<div class='primary'>
# 条件可以是正则表达式
a_list = bs.findAll('a', string='[abs]') # 字符串包含[abs]
json
import json
import requests
data = requests.get('www.baidu.com').content.decode() # 某请求返回的字符串格式的json
# 字符串转json
data_js = json.loads(data)