python中缺失值处理——在因子选股中的应用

​在因子选股当中,如果直接对整个数据库进行操作,对于股价历史数据,经常出现由于股票退市等造成的缺失值,但是在回测时,如果只用有值的股票,会由于维度不匹配而报错。

因此,经常需要把整张数据表中的非空数据取出,进行处理,再填回因子矩阵中。

由于基本上每次都会用到,所以本人专门写了函数来完成这个操作。

首先,导入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,之后便可进行回测。

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值