CSS

CSS属性

  • display:元素展示
    • inline:默认,内联元素
    • flex:弹性容器
    • none:不显示
    • block:块级元素,元素前后有换行符
    • inline-block:行内块元素
    • list-item:列表元素
    • run-in:根据上下文作为块级元素或内联元素
    • table:表格元素<table>,前后有换行符
      • inline-table:内联表格元素,前后无换行符
      • table-row-group
      • table-row
      • table-header-group
      • table-footer-group
      • table-column-group
      • table-column
      • table-cell
      • table-caption
    • inherit

弹性容器Flex

flex

弹性容器内元素空间分配

  • flex-grow flex-shrink flex-basis简写,只给出一个值时 相当于flex-grow
  • auto:同1 1 auto
  • none:同0 0 auto
  • initial:初始值,同0 0 auto
  • inherit

flex-grow

(弹性容器内)元素相对于其他元素项目扩展的量

  • auto
  • inherit
  • {num}:相对于其他元素的扩展量,默认为0,应该是按照比例分

flex-shrink

(弹性容器内)元素相对于其他元素收缩的量

flex-basis

(弹性容器内)元素基础长度

  • auto
  • inherit
  • 具体长度(%, px, em为单位)

flex-flow

  • flex-direction flex-wrap
  • initial
  • inherit

flex-direction

弹性容器内元素方向

  • row:默认,灵活元素水平排列
  • row-reverse:灵活元素水平反向排列
  • column:灵活元素竖直排列
  • column-reverse:灵活元素竖直反向排列
  • initial
  • inherit

flex-wrap

弹性容器内元素是否拆行/列

  • nowrap:默认,灵活项目不拆行/列
  • wrap:灵活项目必要时拆行/列
  • wrap-reverse:灵活项目必要时反向拆行/列
  • initial
  • inherit

弹性容器Align

align-items

弹性容器内侧轴(竖直方向)对齐各项元素,适合含有单行元素

  • stretch:默认,元素拉伸对齐,元素大小确定时同 flex-start效果
  • center:元素堆叠在容器中心
  • flex-start:元素堆叠向容器开头
  • flex-end:元素堆叠向容器结尾
  • baseline:元素位于容器基线上
  • initial:初始值
  • inherit:从父类继承

align-content

align-items有相同的功能,适合多行元素 (这个好像作用单位是弹性容器的行)

  • stretch:默认,元素拉伸对齐,元素大小确定时同 flex-start效果
  • center:元素堆叠在容器中心
  • flex-start:元素堆叠向容器开头
  • flex-end:元素堆叠向容器结尾
  • space-between:元素向容器两端堆叠,元素间保持间距
  • space-around:类似space-between,但元素于容器 边界直接也有间距
  • initial:初始值
  • inherit:从父类继承

align-self

设置弹性容器内元素本身侧轴方向上的对齐方式

  • auto:默认,继承父容器align-items属性,没有 父容器则为stretch
  • stretch:元素拉伸对齐,元素大小确定时同 flex-start效果
  • center:元素堆叠在容器中心
  • flex-start:元素堆叠向容器开头
  • flex-end:元素堆叠向容器结尾
  • baseline:元素位于容器基线上
  • initial:初始值
  • inherit:从父类继承

justify

弹性容器内水平排列各项元素

  • flex-start:默认,元素位于容器开头
  • flex-end:元素堆叠向容器结尾
  • center:元素堆叠在容器中心
  • space-between:元素向容器两端堆叠,元素间保持间距
  • space-around:类似space-between,但元素于容器 边界直接也有间距
  • initial:初始值
  • inherit:从父类继承

Thrift简介

Thrift架构

  • Thrift是跨语言、C/S模式、服务器部署框架

  • 使用Interface Definition Language(IDL)定义RPC接口 、数据类型

  • 然后通过Thrift编译器生成不同语言的代码,并由生成 代码负责RPC协议层传输层实现

    • 支持服务器端和客户端编译生成代码为不同语言
    • 客户端、服务端代码调用生成代码搭建C/S
  • Thrift支持动态(执行)、静态(编译)

Thrift网络栈

thrift_structure

TTransport

传输层,定义数据传输方式

  • 可以是TPC/IP、共享内存、共享文件等,作为运行时库

  • 提供了一个简单的网络读写抽象层,使Thrift底层TTransport 从系统其他部分(如:序列化、反序列化)解耦

  • 接口方法包括

    • open
    • close
    • read
    • write
    • listen
    • accept
    • flush
传输协议
  • TSocket:阻塞式socket
  • TFramedTransport:frame为单位进行传输,非阻塞式
  • TFileTransport:文件形式传输
  • TMemoryTransport:直接对内存进行I/O
    • Java实现时使用了简单的ByteArrayOutputStream
  • TZlibTransport:使用zlib进行压缩,同其他方式联合使用
    • 目前无java实现

TProtocol

协议层,定义数据传输格式

  • 定义了一种将内存的数据结构映射成可传输格式的机制,即定义 数据类型在TTransport和自身间进行解、编码

  • 需要实现编码机制,负责对数据进行序列化、反序列化

数据格式
  • TBinaryProtocal:二进制格式
  • TCompactProtocal:压缩格式
  • TJSONProtocol:JSON格式
  • TSimpleJSONProtocal:提供JSON只写协议,生成文件容易 通过脚本语言解析
  • TDebugProtocol:简单易懂的可读文本格式,便于debug

TProcessor

封装了从输入数据流中读取、向输出数据流中写的操作

  • 读写数据流用TProtocol对象表示
  • 和服务相关的TProcessor由Thrift编译器产生
  • 工作流程
    • 使用输入TProtocol从连接中读取数据
    • 将处理授权给用户实现的handler
    • 使用输出TProtocol向连接中写入数据

服务模型

  • 创建TTransport对象
  • 为TTransport对象创建输入、输出TProtocol对象
  • 基于输入、输出TProtocol对象创建TProcessor对象
  • 等待连接请求,交由TProcessor处理

支持的服务模型

  • TSimpleServer:简单单线程服务模型
  • TThreadPoolServer:多线程服务模型,使用标准阻塞式I/O
  • TNonblockingServer:多线程服务模型,使用非阻塞式I/O
    • 需使用TFrameTransport传输方式

Thrift语法

句法

  • 支持shell的#注释、C/C++的////**/注释

  • struct等复杂类型定义中

    • 类型名和{之间必须有空格
    • 各字段之间,分割(末尾不能有,
    • 方法可以使用;,结尾

函数

参数

  • 可以是基本类型、结构体
  • 参数是常量const,不能作为返回值

返回值

  • 可以是基本类型、结构体

数据类型

基本类型

不支持无符号整形

  • bool
  • byte
  • i16
  • i32
  • i64
  • double
  • string
  • binary:字节数组

泛型(容器)

容器中元素类型可以是除了service以外的任何类型(包括结构体、 异常)

  • map<t1, t2>:字典
  • list<t1>:列表
  • set<t1>:集合

结构体

Thrift结构体概念上同C结构体:将相关数据封装

1
2
3
4
5
6
struct Work {
1: i32 num1=0,
2: i32 num2,
3: Operation op,
4: optional string comment,
}
  • 编译为面向对象语言时:将被转换为类

  • 结构体中,每个字段包含

    • 整数ID
    • 数据类型
    • 字段名
    • 可选的默认值
  • 字段可选:规范的struct定义中,每个域都使用optionalrequired关键字标识

    • optional:字段未设置时,序列化输出时不被包括
    • required:字段未设置时,Thrift给与提示
  • 不支持继承

Exception

1
2
3
4
exception InvalidOperation {
1: i32 what,
2: string why
}
  • 异常在语法、功能上类似于结构体,使用exception声明,但 语义不同

Service

Thrift编译器根据选择的目标语言为server产生服务接口代码,为 client产生桩代码

  • 函数、参数列表定义方式同struct
  • 支持继承:extends
1
2
3
4
5
6
service Twitter {
# Twitter和`{`中需要有空格
void ping(),
bool postTweet(1: Tweet tweet);
TweetSearchResult searchTweets(1: string query);
oneway void zip();

enum

枚举类型

  • 枚举常量必须时32位正整数
1
2
3
4
5
6
enum TweetType {
TWEET,
RETWEET = 2,
DM = 0xa,
REPLY
}

const

常量

  • 复杂类型、结构体可以使用JSON标识
1
2
const i32 INT_CONST = 1234
const map<string, string> MAP_CONST = {"hello": "world", "1": "2"}

typedef

1
typedef i32 new_type

namespace

Thrift命名空间同C++中namespace类似

  • 均提供组织(隔离)代码的方式
  • 因为不同的语言有不同的命名空间定义方式(如:python中 module),Thrift允许针对特定语言定义namespace
1
2
namespace cpp com.example.project
namespace java com.example.project

Keras Readme

常用参数说明

  • 函数书写声明同Python全局说明
  • 以下常用参数如不特殊注明,按照此解释

Common

  • seed=None/int

    • 含义:随机数种子
  • padding="valid"/"same"/"causal"

    • 含义:补0策略
      • “valid”:只进行有效有效卷积,忽略边缘数据,输入 数据比输出数据shape减小
      • “same”:保留边界处卷积结果,输入数据和数据shape 相同
      • “causal”:产生膨胀(因果卷积),即output[t] 不依赖input[t+1:],对不能违反时间顺序的时序 信号建模时有用
    • 默认:valid

Layers

  • input_shape=None/(int,...)

    • 含义:输入数据shape
      • Layers只有首层需要传递该参数,之后层可自行推断
      • 传递tuple中None表示改维度边长
    • 默认:None,由Layers自行推断
  • data_format=None/"channels_last"/"channels_first"

    • 含义:通道轴位置
      • 类似于dim_ordering,但是是Layer参数
    • 默认
      • 大部分:None由配置文件(默认”channels_last”) 、环境变量决定
      • Conv1DXX:”channels_last”
      • 其实也不一定,最好每次手动指定
  • dim_ordering=None/"th"/"tf"

    • 含义:中指定channals轴位置(thbatch后首、tf尾)
    • 默认:None以Keras配置为准
    • 注意:Deprecated,Keras1.x中使用

Conv Layers

  • filters(int)

    • 含义:输出维度
      • 对于卷积层,就是卷积核数目,因为卷积共享卷积核
      • 对于局部连接层,是卷积核组数,不共享卷积核 ,实际上对每组有很多不同权重
  • kernel_size(int/(int)/[int])

    • 含义:卷积核形状,单值则各方向等长
  • strides(int/(int)/[int])

    • 含义:卷积步长,单值则各方向相同
    • 默认:1移动一个步长
  • dilation_rate(int/(int)/[int])

    • 含义:膨胀比例
      • 即核元素之间距离
      • dilation_ratestrides最多只能有一者为1, 即核膨胀、移动扩张最多只能出现一种
    • 默认:1不膨胀,核中个元素相距1
  • use_bias=True/False

    • 含义:是否使用偏置项
    • 默认:True使用偏置项
  • activation=str/func

    • 含义:该层激活函数
      • str:预定义激活函数字符串
      • func:自定义element-wise激活函数
    • 默认:None不做处理(即线性激活函数)
  • kernel_initializer=str/func

    • 含义:权值初始化方法
      • str:预定义初始化方法名字符串 (参考Keras Initializer)
      • func:初始化权重的初始化器
    • 默认:glorot_uniform初始化为平均值
  • bias_initializer=str/func

    • 含义:偏置初始化方法
      • str:预定义初始化方法名字符串
      • func:初始化权重的初始化器
    • 默认:zeros初始化为全0
  • kernel_regularizer=None/obj

    • 含义:施加在权重上的正则项 (参考Keras Regularizer对象)
    • 默认:None不使用正则化项
  • bias_regularizer=None/obj

    • 含义:施加在偏置上的正则项 (参考Keras Regularizer对象)
    • 默认:None不使用正则化项
  • activity_regularizer=None/obj

    • 含义:施加在输出上的正则项 (参考Keras Regularizer对象)
    • 默认:None不使用正则化项
  • kernel_constraint=None/obj

    • 含义:施加在权重上的约束项 (参考Keras Constraints)
    • 默认:None不使用约束项
  • bias_constraint=None

    • 含义:施加在偏置上的约束项 (参考Keras Constraints)
    • 默认:None不使用约束项

激活函数

  • 通过设置单独的激活层实现

    1
    2
    3
    4
    from keras.layers import Activation, Dense

    model.add(Dense(64))
    model.add(Activation('tanh'))
  • 也可以在构造层对象时通过传递activation参数实现

    1
    model.add(Dense(64, activation='tanh'))
  • 可以通过传递一个逐元素运算的Theano/TensorFlow/CNTK函数 来作为激活函数

    1
    2
    3
    4
    from keras import backend as K

    model.add(Dense(64, activation=K.tanh))
    model.add(Activation(K.tanh))

    softmax

1
2
3
4
softmax(
x(tensor),
axis=-1/int
)

Softmax激活函数

  • 参数

    • x:张量
    • axis:整数,代表softmax所作用的维度
  • 返回值:softmax变换后的张量。

  • 异常:

    • ValueError: In case dim(x) == 1

elu

1
2
3
4
elu(
x,
alpha=1.0/num
)

指数线性单元

selu

1
selu(x)

可伸缩的指数线性单元(SELU)。

  • 参数

    • x: 一个用来用于计算激活函数的张量或变量。
  • 返回值:可伸缩线性指数激活

    • 可伸缩的指数线性激活:scale * elu(x, alpha)scale, alpha应该是预定义常数?)
  • 注意

    • 与「lecun_normal」初始化方法一起使用。
    • 与 dropout 的变种「AlphaDropout」一起使用。
    • 只要正确初始化权重(参见 lecun_normal 初始化方法) 并且输入的数量「足够大」(参见参考文献获得更多信息) ,选择合适的alphascale的值,就可以在两个连续层 之间保留输入的均值和方差
  • 参考文献

softplus

1
softplus(x)

Softplus 激活函数

  • 返回值:$log(exp(x) + 1)$

softsign

1
softsign(x)

Softsign 激活函数

  • 返回值:$x / (abs(x) + 1)$

relu

1
2
3
4
5
relu(
x,
alpha=0.0,
max_value=None
)

线性修正单元。

  • 参数

    • alpha:负数部分的斜率。默认为 0。
    • max_value:输出的最大值
  • 返回值:线性修正单元激活

    • x > 0:返回值为 x
    • x < 0:返回值为 alpha * x
    • 如果定义了max_value,则结果将截断为此值

tanh

1
tanh(x)

双曲正切激活函数

sigmoid

1
sigmoid(x)

Sigmoid 激活函数

hard_sigmoid

1
hard_sigmoid(x)

Hard sigmoid 激活函数。

  • 说明

    • 计算速度比 sigmoid 激活函数更快。
  • 返回值:Hard sigmoid 激活:

    • x < -2.5:返回 0
    • x > 2.5:返回 1
    • -2.5 <= x <= 2.5:返回 0.2 * x + 0.5

linear

1
linear(x)

线性激活函数(即不做任何改变)

Keras 安装配置

Keras配置文件

$HOME/.keras/keras.json

1
2
3
4
5
6
7
8
9
10
{
"image_data_format": "channel_last",
# 指定Keras将要使用数据维度顺序
"epsilon": 1e-07,
# 防止除0错误数字
"flaotx": "float32",
# 浮点数精度
"backend": "tensorflow"
# 指定Keras所使用后端
}

Matplotlib约定

函数书写声明

  • 函数书写声明同Python全局
  • 以下常用参数如不特殊注明,按照此解释

Pyplot

  • data=dict/pd.DataFrame

    • 其他
      • 属于kwargs中参数
      • 传参时,相应键值对替代对应参数

Matplotlib 配置

配置文件matplotlibrc

配置文件路径

  • /current/dir/matplotplibrc
  • $MATPLOTLIBRC/matplotlibrc
  • ~/.config/matplotlib/matplotlibrc(~/.matplotlib/matplotlibrc)
  • /path/to/matlabplot/mpl-data/matplotlibrc

查看实际路径

1
$ python -c 'import matplotlib as mpl; print(mpl.matplotlib_fname())'

中文问题

字符编码问题

  • python2中默认字符编码方案是ascii,需要更改为utf-8

    1
    2
    3
    import sys
    reload(sys)
    sys.setdefaultencoding("utf8")
  • python3则默认为utf-8编码,无需其他操作

字体文件缺失

  • mpl不兼容ttc文件,只能识别ttf文件
  • mpl默认使用/path/to/matplotlib/mpl-data/fonts中的字体 文件
  • ttc和ttf格式参见cs_program/character

管理单个图表

  • 通过mpl字体管理器管理单个图表元素字体
    • 对每个需要使用该字体的图表元素,都需要传递相应的参数
    • 无需字体都不需要安装
1
2
ch=mpl.font_manager.FontProperties(fname=/path/to/font.ttf)
ax.set_title(name, fontproperties=ch)

运行时配置MPL默认字体

1
2
3
4
5
6
7
 # 必须在`plt.plot()`类似的绘图语句执行之前执行
# `font-name`为已安装字体名称而不是字体文件名
mpl.rcParams['font.default-font-family'].insert(0, font-name)
# 查看当前默认font-family
mpl.font_manager.FontProperties().get_family()
# 一般默认字体族是"sans-serif",所以应该将字体名称插入其首位
mpl.rcParams['font.sans-serif'].insert(0, font-name)
  • 运行时指定“已安装”字体给当前执行mpl配置中默认字体

    • 系统中已安装ttf字体,即fc-查找目录

      • /usr/share/fonts/
      • $HOME/.local/share/fonts/
      • $HOME/.fonts/
    • /path/to/matplotlib/mpl-data/fonts/中字体文件对应 字体

  • 已安装字体指mpl.font_manager.FontManager能找到字体,但 不是所有系统已安装字体,mpl均可找到、使用

    1
    2
    # 获取mpl所有可用字体并排序
    sorted([i.name for i in mpl.font_manager.FontManger().ttflist])
    • 字体文件问题:mpl不兼容ttc字体文件

    • 缓存问题:mpl可能在~/.cache/matplotlib/下有cache 文件,mpl会直接从中获取可用字体列表,新字体可能需 删除才能在mpl中生效

      1
      2
      # 获取mpl缓存文件夹
      mpl.get_cachedir()

修改MPL配置文件

  • 修改配置文件更改全局默认字体

    • 将字体名称添加在默认字体族首位,作为最优先候选字体

      1
      font.sans-serif : font-name,
  • 同样要求mpl能够找到、使用相应的字体文件

图片显示

X11依赖

  • mpl一般在常用于包含有X11的图形化界面中,所以若X11不可用 则需修改mpl配置

  • 对生成pdf、png、svg等,可以修改后端为Agg

    • 运行时修改

      1
      2
      3
      4
      import matplotlib as mpl
      # 须在导入`pyplot`前执行
      mpl.use("Agg")
      from matplotlib import pyplot as plt
    • 修改配置文件

      1
      backend: TkAgg

By default, matplotlib ships configured to work with a graphical user interface which may require an X11 connection. Since many barebones application servers don’t have X11 enabled, you may get errors if you don’t configure matplotlib for use in these environments. Most importantly, you need to decide what kinds of images you want to generate(PNG, PDF, SVG) and configure the appropriate default backend. For 99% of users, this will be the Agg backend, which uses the C++ antigrain rendering engine to make nice PNGs

Matplotlib.plot笔记

图像元素

Figure

整个窗口(句柄)

1
2
fig=plt.figure(num=None, figsize=None, dpi=None,
facecolor=None, edgecolor=None, frameon=True)

Axes

图像(子图)(句柄)

1
2
3
4
5
6
7
8
9
10
11
12
13
None=plt.subplot(*arg, **karg)
// 创建并激活axes
None=plt.subplot(num=int(row-col-index)
None=plt.subplot(row, col, index)

fig, axs=plt.subplots(rows=int, cols=int)

fig.add_subplot(rows=int, cols=int, index=int)

ax=fig.add_axes(rect=[left,buttom,width,height],
projection='aitoff'/'hammer'...)
// 指定地点、大小子图
// `rect`参数是百分比

Axies

说明

  • 这三个图像元素都是以句柄形式操作,可以理解为每次操作 都是在一个“容器”中操作,容器由plt管理,每次 plt.show()将图像全部展示之后,容器被回收,创建新容器

  • 因此plt.show()之后,之前容器中的元素更改无法影响到新容器

  • plt可以当作当前激活状态的axes元素的句柄使用

绘图

线图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

None=ax(*args, **kwargs)
# `args`
# [x]=range(len(y))/list
# y=list
# [fmt]=str

# `kwargs`
# data:类似df、dict的indexable对象,传递时x、y可用
标签代替
# linewidth
# markersize
# color
# marker
# linestyle

# examples
None=ax([x], y, [fmt], [x2], y2, [fmt2], **kwargs)
None=ax('xlabel', 'ylabel', data=indexable_obj)
None=ax(2d-array[0], 2d-array[1:])

柱状图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

list=ax.bar(*args, **kwargs)

# `args`
# x=list
# height=num/list
# [width]=num/list
# [bottom]=num/list

# `kwargs`
# align='center'/'edge'
# agg_filter=func
# alpha=None/float
# capstyle='butt'/'round'/'projecting'
#todo

饼图

1
2
3
4
5
6
7
list=ax.pie(x, explode=None/list(%), labels=None/list,
colors=None/list(color), autopct=None/str/func,
pctdistance=0.6, shadow=False, labeldistance=1.1,
startangle=None, radius=None/float,
counterclock=True, textprops=None, center=(0,0),
frame=False, rotatelables=False, hold=None,
data=None/dict(param_above))

箱线图

1
2
list=ax.boxplot(x, notch=False, sym=None/str,
vert=True, whis=1.5/str/list)

Jupyter 常用基础

配置文件

生成配置文件

1
2
$ jupyter notebook --generate-config
# 生成配置文件,默认为`~/jupyter/jupyter-notebook-config.py`

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
c.NotebookApp.password = u'sha1:xxxxxxxx'
# 配置sha1格式密文,需要自己手动生成
c.NotebookApp.ip = "*"
# 配置运行访问ip地址
c.NotebookApp.open_brower = False
# 默认启动时不开启浏览器
c.NotebookApp.port = 8888
# 监听端口,默认
c.NotebookAPp.notebook_dir = u"/path/to/dir"
# jupyter默认显示羡慕路径
c.NotebookApp.certfile = u"/path/to/ssl_cert_file"
c.NotebookAppp.keyfile = u"/path/to/ssl_keyfile"
# jupyter使用ssl证书文件
# 一般只有使用自己生成证书

生成密文

1
2
3
from notebook.auth import passwd
passwd()
# 输入密码两次,然后就会返回对应密文,写入配置文件

远程访问

jupyter必须使用https登陆、访问

  • 因此服务端必须有ssl证书,

    • 自己生成的证书默认浏览器不认可,浏览器访问会高危, 高级进入即可
      1
      openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout key_name.key -out cert_name.pem
  • 访问时也必须加上https://前缀,一般默认http://前缀 会报服务器无响应(没配置重定向,应该是)

Pandas数据结构

DataFrame

可以看作包含两个Index类(index、columns)、一个二维ndarray类 (values)

  • 二维values + 结构化index + 结构化columns
    • values自己还有两根只能使用integer indice的轴
  • 结构同数据库表相似:列为属性,行为个体
1
2
3
4
5
6
7
8
9
DF = pd.DataFrame(
data=ndarray/{col_name: val}/DF/array-like,
index=Index/array-like,
columns=Index/array-like,
dtype=None/dtype,
copy=False)

# `data=dict`:可以通过`columns`仅使用部分键值对创建
# `copy`:仅影响`data`为DF/ndarray时,默认不使用拷贝

DF行列逻辑

可以通过DF = df1.T作转制更改行列逻辑

获取数据

列优先
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
Ser = df1[col_name]
Ser = df1.col_name
# 取列
Ser = df1[col_level_0, col_level_1,...]
Ser = df1[(col_level_0, col_level_1,...)]
Ser = df1.col_level_0.col_level_1
# 对层级索引取列

Val = df1[col_name][index_name]
Val = df1.col_name.index_name
# 取具体值
# 属性方式,要求`*_name`为字符串
# `.`、`[]`应该是覆盖过

Val = df1[col_level_0, col_level_1,...]\
[index_level_0, index_level_1,...]

Val = df1[(col_level_0, col_level_1,...)]\
[index_level_0, index_level_1,...]

Val = df1.col_level_0.col_level_1....\
.index_level_0.index_level_1...
# 对层级索引取值

DF = df1[cond1 & cond2 &...]
DF = df1[cond1][cond2]...
# `condX`为Ser(bool)
# 两种讲道理应该没差
行优先
.loc[]

行优先,逻辑和df1[]列优先类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Ser = df.loc[index_name]
# 取行
Ser = df.loc[index_level_0, index_level_1,...]
Ser = df.loc[(index_level_0, index_level_1,...)]
# 层级索引取行Ser/DF

Val = df1.loc[index_name, column_name]
# 还可以这样的取值
# 不建议使用,容易照成混淆
# Val = df1.loc.index_name`
# 不可

Val = df1.loc[index_level_0, index_level_1,...]\
[col_level_0, col_level_1,...]
# 层级索引时,index、col不能混在一起

Val = df1.loc[(index_level_0, index_level_1,...)]\
[(col_level_0, col_level_1,...)]
.iloc[]

indices locate,应视为对value(ndarray)进行操作,index和 columns的结构对其没有任何影响

  • 在层级索引情况下,仍然返回Ser
1
2
3
4
Ser = df1.iloc[indice]
# 返回values第indice行Ser对象
Val = df1.iloc[index_indice, col_indice]
# 取得values第index_indice行、第col_indice列元素
.ix[]

.loc.iloc的封装,不建议使用

  • 优先使用.loc,除非参数为int、且Index不是int类型
1
Ser = df1.ix[index]
行优先快速版本

只能必须取一个值

  • 不能用于获取切片
  • 对于多重索引必须将Index、Columns所有level全部指定

  • .iat

    1
    Val = df1.iat[index_indice, col_indice]
  • .at

    1
    2
    3
    4
    Val = df1.at[index_name, col_name]
    # 单索引
    Val = df1.at[(index_level_0, index_level_1,...), (col_level_0, col_level_1,...)]
    # 多重索引必须指定全部level保证只取到一个值

切片

Values切片

切片对象是values

1
2
3
4
5
DF = df1.iloc[irow_start: irow_end, icol_start: icol_end]
# 对values的切片,参数都是indices
# 这个应该就是ndarray切片操作,不包括上限
# 如果只对行切片,可以省略`.iloc`,但不建议,因为这个
# 同时也可以表示Index切片(优先)

Index切片

切片对象是index,包括上限

全切片
1
2
3
4
DF = df1.loc[
(index_0, index_1,...): (index_0, index_1,...),
(col_0, col_1,...): (col_0, col_1,...)]
# `.loc`可以替换为`.ix`,但不能删除,不建议使用
行切片
1
2
3
4
DF = df1.loc[[(index_0, index_1,...),...]]
DF = df1.loc[(index_0, index_1,...): (index_0, index_1,...)]
# index_level可以不用指定到最低level,
# 同样的,`.loc`可以替换为`.ix`,但不建议使用
列切片
1
2
3
4
DF = df1[[col_name,...]]
DF = df1.loc[:, (col_0,...): (col_0,...)]
# `.loc`可以替换为`.ix`,但是不能删除,不建议使用
# 列切片没有`:`语法,只能通过设置行切片为`:`得到

DF数据共享逻辑

DF数据(values)共享的逻辑

  • 一般尽量共享数据,直至无法处理(数据同时增加/删除行、列)
  • 有些方法会有copy参数,可以显式控制是否拷贝副本
    • .reindex默认拷贝副本
1
2
3
4
5
6
7
8
9
df1_T = df1.T
# 两个此时共享数据,对任一的更改会反映在另一者
df1_T["new_col_1"] = [ ]
# 添加新列后,两者仍然共享公共部分数据,只是`df1`中无法
# 访问新列
df1["new_col_2"] = [ ]
# 此时两者数据均独立

# 类似的`del`删除列也是如此逻辑

Index 索引

使用integer作为index时注意df1.ix[]的逻辑

MultiIndex 层级索引

层级索引允许以低维度形式表示高纬度数据

  • 层级索引可以使用tuple形式表示:(level_0, level_1,...)
    • 需要注意区分和tuple本身作为index
      • 打印时可以tuple有括号,而层级索引没有
      • 层级索引有时可以省略括号

from_arrays

1
2
3
4
5
6
7
8
9
10
11
Index = pd.MultiIndex.from_arrays(
arrays([[],[]]),
sortorder=None/int,
names=None/[])

Index = [
level_0_list,
level_1_list,...]
# 隐式构建层级索引,各list长度相同,其按顺序组合
# 可以在:DF构造参数、给DF对象Index赋值等使用
# 应该是可以看作pandas使用`from_arrays`处理
  • 说明:将arrays转换为MultiIndex

  • 参数

    • arrays:包含多个list作为各个level索引
      • 各list按照传递顺序决定level
      • 不会自动合并不连续labels(否则需要交换数据位置)
    • sortorder:sortedness级别?
    • names:level名

from_tuples

1
2
3
4
Index = pd.MultiIndex.from_tuples(
tuples=[tuple-like],
sortorder=None/int,
names=None)
  • 说明:将tuples转换为MultiIndex

  • 参数

    • tuples:每个tuple为一个index,按照tuple中元素顺序 决定各元素level

from_product

1
2
3
4
Index = pd.MultiIndex.from_product(
iterables([[]]/[iterables]),
sortorder=None/int,
names)
  • 说明:对iterables元素作product(积)作为MultiIndex
  1. Series:可以看作是包含一个Index类(index,存放标签)、一个一维ndarray类(values,存放数据)

    a. ser=pd.Series(data=np.darray/dict, index=list)

    b. Series对象可以处理标签不一致的数据,但是只有标签的交集才能得到有意义的结果,其余为NaN

    c. 其余性质类似于DataFrame对象

  2. Index属性#todo

    a. index属性

    1. df1.columns=[]:更改列名称,index同

    2. df1.columns.names=[]:更改列名,index同

  3. pandas库中的其他一些问题

    a. 数据类型转换:Series对象和DF对象在运算过程中dtype类型可能发生”无意义”的转换

    1. dtype=i8的对象之间的+、-结果为dtype=f8类型的对象(当然这个可能是保持和\的一致性)

    2. SeriesObj.reindex(new_index)会”可能”会改变原有数据类型(由i8->f8)(有增加新index时)