数据清洗中的问题与对策转载本文请联系数据仓库宝贝图书馆公众号。现实世界中的数据量越来越大,并且更容易受到噪声、缺失值和不一致数据的影响。数据库太大。如果有不同的来源,那么脏数据的问题肯定会存在,这是不可避免的。为了尽量减少数据中各种问题对我们建模的影响,需要对数据进行预处理。在实际操作中,数据预处理通常分为两步,一是数据清洗,二是对数据进行基础分析。这两个步骤不一定按顺序执行,通常会相互影响。例如,一些错误的数据(不可能出现的极值)必须通过基本的统计分析才能发现。有一种说法,数据预处理会占据大部分工作量,有的甚至达到总工作量的80%,而真正的建模和算法工作量实际上只有20%。这个结论在互联网或者传统IT领域确实是成立的,尤其是面对大量非结构化数据的时候。所以第一步,也是非常关键的一步,就是数据清洗。为了清洗数据,我们必须知道可能存在的问题,然后我们才能针对相应的问题设计相应的方法。原始数据可能存在以下三个问题。缺失数据:缺失数据的问题在高频数据中尤为常见。而且由于很多投资者自己实时下载数据,即使后来发现也很难补上。噪声或异常值:由于系统或人为错误,数据中存在明显错误。比如某只股票的价格应该在12元左右,突然出现了100元的价格数据。数据不一致:很多投资者为了保证数据的正确性,会使用多个数据源进行交叉验证,这时候往往会出现数据不一致的情况。即使是同一个数据源,有时也会出现数据不一致的情况。比如期货市场数据,Wind、文华、MC数据可能存在不一致。数据频率越高,出现不一致的可能性就越大。01缺失值对于缺失值,在实际操作中,需要两套程序:一套是??检查缺失值,一套是填补缺失值。大致流程是先检查缺失值,研究缺失值,选择填充方式,进行填充,再检查。如此循环往复,直到缺失的数据被控制在可接受的范围内。缺失值的类型也很多。一种是“正常失踪”。比如一只股票在某一天停牌,那么就没有当天的成交数据。一种是“异常缺席”,比如有交易,但没有交易数据。比如下载5分钟的数据,发现20160104的数据丢失了,但是Wind上的数据显示当天的交易状态是“交易”。实际情况是当天发生了“熔断”。因为是新机制,Wind还没来得及准备一个字段来表示当天的交易状态。这种情况属于数据“正常缺失”,只是交易状态与数据不一致。Wind的交易状态字段如下图所示。在检查缺失值的时候,这两种缺失需要区分清楚,因为不同的缺失值有不同的处理方式。检查缺失值后,您需要处理它们。先处理“异常删除”,大致流程如下。1)检查提取数据是否有错误。有时,数据源本身是完整的,但在提取数据时出现问题。比如笔者在使用市场某公司的金融高频数据时,下载了5分钟的数据计算高频波动,发现有很多数据缺失。查询了公司后台,发现他们的数据库里居然有这个数据,说明下载数据的过程中出现了问题。2)从其他数据源中提取。有些数据源本身就缺少数据,这种情况下可以找另外一个数据源来补充。算法填充。有时,我们没有办法使用多个数据源来补充,有些数据本身就有差距,无法补充。这时候可以取nextbestthing,用算法填充。常用的算法包括正向填充和反向填充。所谓前向填充是指用最新的数据填充空值。向后填充是指用最新的数据填充空值。Pandas提供了数据填充的功能。示例代码如下:df=pd.DataFrame([[np.nan,2,np.nan,0],...[3,4,np.nan,1],...[np.nan,np.nan,np.nan,5],...[np.nan,3,np.nan,4]],...columns=list('ABCD'))dfABCD0NaN2.0NaN013.04.0NaN12NaNNaNNaN5例子正向填充代码如下:df.fillna(method='ffill')ABCD0NaN2.0NaN013.04.0NaN123.04.0NaN533.03.0NaN4除了正向填充,该函数还支持反向填充,但是必须使用具体的值对于灌装。有些数据缺失,无法通过简单的正向填充或反向填充来处理。比如你用Wind下载A股复盘数据,你会发现1999年之前的交易状态trade_status为空,虽然实际有交易,但如果直接按照trade_status='transaction'的条件过滤,1999年之前的所有数据都将被移除。这时候就需要设计一个算法按照逻辑进行填充,比如将所有交易量>0的交易填充为“交易”。02噪声或异常值噪声或异常值一般有两种情况。一种是由数据错误引起的。例如本应为10.0的数据显示为10000;另一个是它本身就是真实的数据,但异常值,例如金融危机中的回报率或波动率,可能非常极端而成为异常值。一般处理步骤如下。1)通过一定的算法识别异常值。一般是用数据的标准差多少次来判断的。例如,在正分布中,正负三倍标准差的概率为99.7%,可以识别为可疑异常值。2)人工判断离群值是错误数据引起的还是正常的离群值。3)处理异常值。通常,需要纠正或删除错误的异常值。正常离群值需要额外的建模进行分析。03数据不一致为了保证数据的准确性,有时需要使用多个数据源进行交叉验证。比如在研究港股的时候,对比Wind和Bloomberg复牌后的数据,我们发现两者有很大的不同。这就是数据不一致的问题,但是我们不确定到底哪个是正确的,所以我们加入了对比Flush和CSMAR的数据,发现后者的数据和Wind的是一致的。所以可以确定是彭博的问题,所以用的是Wind的数据。当然,在实际工作中,数据清洗的问题远不止这里介绍的这些,需要系统、谨慎地对待。本书节选自《Python量化投资:技术、模型与策略》,经出版社授权发布。
