在因子选股当中,如果直接对整个数据库进行操作,对于股价历史数据,经常出现由于股票退市等造成的缺失值,但是在回测时,如果只用有值的股票,会由于维度不匹配而报错。
因此,经常需要把整张数据表中的非空数据取出,进行处理,再填回因子矩阵中。
由于基本上每次都会用到,所以本人专门写了函数来完成这个操作。
首先,导入numpy
import numpy as np
使用numpy包来进行矩阵操作
第一个函数,用来取出矩阵中的非空值
# 取出数组非空值及其坐标
def get_not_nan(arr):
# 判断维数
# 如果是1维,则直接使用np.isnan来判断,再将返回值作为索引取出非空值
# 如果是多维,则取出没有空值的列
dimension = len(arr.shape)
# print("是{0:}维数组".format(dimension))
# 一维直接索引,多维取出没有nan的列
if dimension > 1:
column = np.argwhere(np.isnan(arr).sum(axis=0) == 0).flatten()
# np.argwhere()接收一个数组作为参数,返回值为True的位置的索引
# np.isnan()接收一个数组作为参数,返回一个维度相同的由布尔值构成的数组,nan为True,其他为False
# arr.flatten()方法能够压平一个数组,把任何维度的数组压平为1维
arr_num = arr[:, column]
# 返回取出的不含nan的列队值,以及列的索引
return arr_num, column
else:
# 得到空值的索引
arr_nan = np.isnan(arr)
index = ~arr_nan
# 取出非空的值
arr_num = arr[index]
return arr_num, index
对于np.argwhere(np.isnan(arr).sum(axis=0) == 0).flatten()
,先判断数组中的空值,再按列求和,再判断和0的关系,最后得到0值的索引并展平
第二个函数,用来把取出来并处理后的值加回到数组里
def get_back_num(arr, column, num_arr):
"""
:param arr: 原数组
:param column: 新数组中有值的位置的索引
:param num_arr: 要填进去的值
:return: 除了填进去的值,其他都是nan
"""
if len(arr.shape) > 1:
length = arr.shape[1]
else:
length = arr.shape
full_nan = np.full(length, np.nan)
# np.full(维度,填充物)建立一个以填充物填充的数组,这里以nan填充
full_nan[column] = num_arr
# 通过上一个函数返回的列索引,把处理后的结果加回到数组
factor = full_nan
return factor
在因子选股中,假如有5000支股票,每列为一只股票,行为日期,其中800只在时间段内退市,则可能存在nan,因此使用get_not_nan
来取出不含nan的列,即没退市的股票,进行回归等分析后,再使用get_back_num
把处理结果,即因子值,返回到一个(5000,)的数组中,并按照最开始的位置摆放,则未退市股票有因子值,退市股票位置为nan,之后便可进行回测。
标签:arr,索引,python,nan,np,num,数组,选股,缺失 From: https://blog.csdn.net/m0_70629983/article/details/140307159