Python数据处理相关语法整理
- 简介
- Python自身特性总结
- 编程Tips
- 拿到新电脑配环境时做的事:
- 一些加速python代码的技巧
- Python项目代码结构
- 量化策略指标计算
- -----------------------------------------------------
- ------------------- 分割线 -------------------------
- ------------------------------------------------------
- 类
- 字符串
- 字典
- Datetime库
- Scipy.stats
- Numpy 库
- Pandas库
-
- 计算相关性
- 统计频数
- 描述性统计describe
- 多层索引Multiindex
- dataframe的整合与形变
- 数学函数
- 计算协方差和相关系数
- 对每一行每一列分别操作
- 时间窗口
- 对dataframe的列进行遍历
- 对dataframe的行进行遍历
- 对Series进行遍历
- 生成日期序列
- 读取表格
- 删除满足条件的行
- 增删改查
- 设置索引
- 取索引
- 更改Series和DataFrame列名
- 缺失值/空字符串/inf/字符串/非数值 处理
- 表格排序
- 表格画图 - df.plot()
- 采样
- 对元素进行映射apply
- Shift(num)
- 两个表的连接
- 两个表的遍历
- groupby
- 内连接,左连接,右连接,全外连接(pd.merge)
- Matplotlib.pyplot库
- Pytorch
- 随机数
- 正则表达式
- dataclasses库
- functools库 --- 缓存函数结果
- 有用的代码片段
- 多线程/并行
简介
本篇博文主要是自己在处理金融类数据、编写金融类代码的时候的总结
Email: 6763624736@qq.com
Python自身特性总结
- python的所有类,都是type这个类的实例
- metaclass可以允许父类对子类进行修改
- variable_name : DataType
python可以以这样的方式指定变量的类型 - 目录下如果有__init__.py,那么这个目录就会被当成一个包,当import这个目录的时候,会先执行__init__里面的语句
- a[::-1],表示把a的数组里的元素倒序输出,但是只限制在一维里的元素
第三个-1其实是表示步长 - 一些pip不能安装的,需要下载轮子的包的下载网址
python包下载网址
编程Tips
- 一般修改dataframe或者Series要重新赋值,比如 df = df.concat([df1,df2],axis=1)
- np.isnan 不能识别None,而pd.isnull 适用范围比较广
- 读取数据设定index后,可以使用 drop_duplicate 一下
- 如果Series的index是整数的话,索引 s[-1]会报没有-1这个key的错误
- 如果对dataframe或者Series的行进行筛选,并且要更改的话
记得使用df.loc[ ] 而不是直接 df[ ] - Pandas和Numpy常用库
拿到新电脑配环境时做的事:
-
关闭自动重启
我的电脑->管理->设置,windows update禁用,并且选项上面选择不操作点击windows图标,进入设置,设置电源选项
点击windows图标,进入设置,关闭windows更新
一些加速python代码的技巧
- 使用numba
- 尽量在循环内少用Series和Dataframe的loc进行索引,这样会造成速度下降
- 少用dataframe的loc和append来往里面加元素,最好是先在python原生的列表里操作
- numpy,dataframe,series只有在统计分析的时候才比较快(就是数据不变了已经),如果要往里面加元素,最好是原生的列表操作比较快
- 你对列表直接遍历进行操作 比 你把列表变成Series再进行apply操作要快
Python项目代码结构
量化策略指标计算
指标公式:
- Calmar(卡玛比率)= 超额收益 / 最大回撤
绝对收益率
给定收益率序列(pd.Series),计算绝对收益率
def get_absolute_return(return_s):
return ((return_s+1).cumprod().iloc[-1]-1)
最大回撤
给定累积收益率序列计算最大回撤
def compute_portfolio_max_dawdown(strategy_cumu_return_list):
# 计算最大回撤
i = int(np.argmax((np.maximum.accumulate(strategy_cumu_return_list) - strategy_cumu_return_list) /
np.maximum.accumulate(strategy_cumu_return_list)))
if i == 0:
return 0
j = int(np.argmax(strategy_cumu_return_list[:i])) # 开始位置
max_drawdown = (strategy_cumu_return_list[j] - strategy_cumu_return_list[i]) / strategy_cumu_return_list[j]
return max_drawdown
其中
np.maximum.accumulate(arr)-arr # 计算每个点的回撤绝对值
(np.maximum.accumulate(arr)-arr) /np.maximum.accumulate(arr) # 计算每个点的回撤比例
给定收益率序列计算最大回撤
def compute_portfolio_max_dawdown(portfolio_return_array):
strategy_cumu_return_list = (np.array(portfolio_return_array) + 1).cumprod()
# 计算最大回撤
i = int(np.argmax((np.maximum.accumulate(strategy_cumu_return_list) - strategy_cumu_return_list) /
np.maximum.accumulate(strategy_cumu_return_list)))
if i == 0:
return 0
j = int(np.argmax(strategy_cumu_return_list[:i])) # 开始位置
max_drawdown = (strategy_cumu_return_list[j] - strategy_cumu_return_list[i]) / strategy_cumu_return_list[j]
return max_drawdown
给定累计收益率序列计算收益率序列
def compute_return(cumu_return_lst):
shift_return_lst = [1] + list(cumu_return_lst)[:-1]
return_lst = np.array(cumu_return_lst)/np.array(shift_return_lst) - 1
return_lst[0] = 0
return return_lst
年化收益率
给定累计收益率序列,计算年化收益率
# day_num是回测天数
def compute_annual_yield(cumu_return_lst):
day_num = len(cumu_return_lst)
annual_return = cumu_return_lst[-1]**(252/day_num) - 1
return annual_return
年化波动率
给定收益率序列,计算年化波动率
def compute_annual_std(return_lst, daily_data_cnt):
annual_std = np.std(return_lst)*math.sqrt(252*daily_data_cnt)
return annual_std
夏普比率
给定收益率序列,计算夏普
def compute_portfolio_sharpe_ratio(portfolio_return_array, day_num, daily_data_cnt):
strategy_cumu_return_list = (np.array(portfolio_return_array) + 1).cumprod()
annual_yield = strategy_cumu_return_list[-1] ** (252 / day_num) - 1
annual_std = np.std(portfolio_return_array) * math.sqrt(252 * daily_data_cnt)
return (annual_yield - 0.04) / annual_std
-----------------------------------------------------
------------------- 分割线 -------------------------
------------------------------------------------------
类
-
repr
是print(class)显示的内容) -
在函数前面加@property,这个函数就编程了属性
字符串
- 字符串大小写转换
字符串大小写转换
字典
字典取数
d.get(key, default)
key是键值,若不存在,则返回default
Datetime库
字符串和日期相互转换
startDate = "2018-10-01"
endDate = "2018-10-31"
###字符转化为日期
startTime = datetime.datetime.strptime(startDate, '%Y-%m-%d').time()
endTime = datetime.datetime.strptime(endDate, '%Y-%m-%d').time()
now = datetime.datetime.now()
print(now)
###日期转化为字符串
print("--1---:" + datetime.datetime.strftime(startTime, "%Y-%m-%d"))
print("--2---:" + datetime.datetime.strftime(endTime, "%Y-%m-%d"))
天数之间的加减
两个日期直接加减可以获得天数
timedelta().days可获得天数
datetime.timedelta(days = XX)是间隔的天数
Scipy.stats
简介:scipy.stats是和数据统计相关的包,有各种统计函数
- scipy.stats.rankdata()
可对数组中的数据进行排序
例子
Numpy 库
数学函数
- np.cov(x)&np.var(x)
np.cov(x)&np.var(x)两者区别
>>> from numpy import cov
>>> cov([1, 2, 3], [2, 12, 14])
array([[ 1. , 6. ],
[ 6. , 41.33333333]])
正态分布取样 / 多元正态分布取样
正态分布取样
import numpy as np
np.random.normal(loc=mean, scale=std, size=(,))
多元正态分布取样
import numpy as np
sample = np.random.multivariate_normal(mean=[0,0], cov=[[1,0.5],[0.5,1.5]],size=200)
多元正态分布可以设置协方差矩阵
排名
降序排名:np.argsort(-arr).argsort()
升序排名:np.argsort(arr).argsort()
数组/矩阵的堆叠
- np.vstack
T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20])
S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80])
M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88])
X = np.vstack((T, S, M))
print(X)
# result
[[ 9 15 25 14 10 18 0 16 5 19 16 20]
[39 56 93 61 50 75 32 85 42 70 66 80]
[38 56 90 63 56 77 30 80 41 79 64 88]]
- np.hstack
T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20])
S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80])
M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88])
X = np.hstack((T, S, M))
print(X)
# result
[ 9 15 25 14 10 18 0 16 5 19 16 20 39 56 93 61 50 75 32 85 42 70 66 80
38 56 90 63 56 77 30 80 41 79 64 88]
矩阵(matrix)相关操作
- 将列表转换成矩阵
print(np.matrix([1,3,2]))
# result
[[1 3 2]]
-
矩阵对应位置相乘:np.multiply()
np.multiply(), np.dot(), * 的区别博客np.dot():对于秩为1的数组,执行对应位置相乘,然后再相加;
对于秩不为1的二维数组,执行矩阵乘法运算;超过二维的可以参考numpy库介绍。* 星号乘法 : 对数组执行对应位置相乘,对矩阵执行矩阵乘法运算
广播机制
生成固定的随机数
为了生成固定的随机数,我们需要使用种子(seed)
相同的种子会生成相同的随机数
用法:
randomState = np.random.RandomState(0)
a = randomState.randint(10, size=(5,6))
# 这里的randomState其实就是在前面加了 np.random.seed(0)的 np.random, 后面可以调用randint等随机数生成方法
如果是使用np.random.seed(0)再使用np.random.randint调用,每次调用之前都要加np.random.seed(0)
排序
- ndarray.sort()
np.nan的处理
np.nan其实是个float,
但是如果数组里有np.nan,在进行诸如np.argmax(),np.max()之类的统计计算的时候会反正nan
正负无穷
正无穷:np.inf
负无穷: -np.inf
Pandas库
计算相关性
# 较慢
df.corr()
# 较快
pd.DataFrame(np.corrcoef(df.values, rowvar=False), index = df.index, columns=df.columns)
统计频数
描述性统计describe
-
注意如果不是数值类型的进行describe, 会出现 count unique freq这些。
可以注意一些是否需要进行astype一下 -
如果想把Series横着加到Dataframe里出现错误,
要先把Series转换成Dataframe
多层索引Multiindex
m_index1=pd.Index([("A","x1"),("A","x2"),("B","y1"),("B","y2"),("B","y3")],names=['class1', 'class2'])
df1=pd.DataFrame(np.random.randint(1,10,(5,3)),index=m_index1)
-
df.index.names = […]
-
index.get_level_values(level)
获取多重索引第N曾的索引值 -
index.tolist()
dataframe的整合与形变
dataframe的整合与形变
注意* 要设置stack(dropna=False), dropna默认为False了
数学函数
数学函数集合:
Series及Dataframe数值计算和统计基础函数应用总结
count(),min(),quantile(),sum(),mean(),median(),std(),skew(),kurt()
cumsum(),cumprod()
value_counts(),unique()
print(df.count(),'→ count统计非Na值的数量\n')
print(df.min()