数据预处理的一般方法及python实现

这是一个大数据的时代。我们在很多时候都要处理各种各样的数据。但是并非所有数据都是拿来即可使用,都是要先经过一番处理后才能进行下一步操作。在我们爬到数据或者要处理一份数据文件时,首先要对数据进行清洗和除噪。本文就总结一下,一般数据预处理过程中可能要用到的方法。

  

 

1.查找数据的缺失值

在拿到第一份原始数据的时候,首先要检查数据的完整性。因为在建立模型进行回归分类分析的时候,通常需要一份完整的数据文件。除非特定的例如XGBM的算法,可以在有缺失值的基础上得出运算结果。

以下,是对数据的缺失值的查找,并计算出相应的比例。

 

def missing_values_table(df):

        # Total # of missing values

        mis_val = df.isnull().sum()

       

        # Proportion of missing values

        mis_val_percent = 100 * mis_val / len(df)

       

        # Create a table containing the results

        mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1)

       

        # Set column names

        mis_val_table_ren_columns = mis_val_table.rename(

        columns = {0 : 'Number of Missing Values', 1 : 'Percentage of Total Values (%)'})

       

        # Sort the table by percentage of missing values (descending order)

        mis_val_table_ren_columns = mis_val_table_ren_columns[

            mis_val_table_ren_columns.iloc[:,1] != 0].sort_values(

        'Percentage of Total Values (%)', ascending = False).round(3)

        

        # Print summary information

        print ("The dataframe has " + str(df.shape[1]) + " columns.\n"     

            "There are " + str(mis_val_table_ren_columns.shape[0]) +

              " columns having missing values.")

       

        # Results output

        return mis_val_table_ren_columns

 

mis_train = missing_values_table(pro_train)

print(mis_train)

 

 

 

2. 缺失值的处理

对于确实值的处理,我们有两种方式。第一是直接将缺失值所在的行或者列删除,第二则是用其他数据的平均值,众数,或者上下值来填充这个数据表格中的缺失值。

一:直接删除有缺失值的

使用dropna()函数,可以删除所有又缺失值的行

Train=train.dropna()

 

或者,可以在后面添加feature,选择你要删除哪些feature的缺失项。这是因为有些特征对于结果的影响非常的重要,哪怕有很大的缺失率(达到60%-70%),也依然要将其保留,然后用其他值去填充进去。

pro_train.dropna(subset=['CNT_FAM_MEMBERS','AMT_ANNUITY','AMT_GOODS_PRICE',

                         'EXT_SOURCE_2','OBS_30_CNT_SOCIAL_CIRCLE',

                         'DEF_60_CNT_SOCIAL_CIRCLE','OBS_60_CNT_SOCIAL_CIRCLE',

                         'DEF_30_CNT_SOCIAL_CIRCLE','NAME_TYPE_SUITE'], inplace = True)

       

mis_train = missing_values_table(pro_train)

 

 

 

 

二.使用平均值或者其他值来填充缺失项

用均值填:

data['volumn'] = data['volumn'].fillna(data['volumn'].mean()))

 

用前后值填:

data['volumn'] = data['volumn'].fillna(method='pad')

data['volumn'] = data['volumn'].fillna(method='bfill')

 

 

 

3. 用一列数据来筛选另一列的数据

 

例如,要用一列沪交所的股票代码,把一串数据中(包括所有沪深两市和可转债)的数据中筛选出来。

index = df1[‘symbol’].isin(df2['code'])

 

outfile = df1[index]

 

 

4. 聚合分类groupby的使用

做数据分析的时候,经常要把一类相同类型的数据整合起来做分析。以股市为例,我们可能会要整合tickdata,也可能以股票的代码为标的来进行整合。然后再对聚合后的数据来进行筛选(以聚合好的数据为参考对象,比如聚合好求均值,去除均值小于某一个数值的所有项)。

以下是我自己想出来用dataframe解决此类问题的一种方式,应该会有更简单的解决方法,欢迎留言谈论。

 

grouped2=train['volumepercent'].groupby(train['symbol'])

symbolmean=grouped2.sum()

select=pd.DataFrame(symbolmean)

a=select[(select["volumepercent"]>y1) & (select["volumepercent"]<y2) ].index.tolist()

 

 

另一方面,可能会用到连续求两次聚合的情况,例如第一次取平均,第二次取中位数。

以下也是我个人的解决方法,因为直接处理dataframe 的结构有点问题,所以我是处理好第一步以后,存了个新文件再读取做第二步的处理。

grsz=outfilesz.groupby([outfilesz['symbol'], outfilesz['start']])

sz=grsz.mean()

sz.to_csv('dealsz.csv')

 

new2=pd.read_csv('dealsz.csv')

grrsz=new2.groupby(new2['start'])

medsz=grrsz.median()

medsz.to_csv('sz_medianvalue.csv')

 

 

5. 选取或者删除某些特定的行

 

删除带有特定字符的行:

Outfile=ourfile[~ outfile[‘symbol’].str.contains(‘SS’)]

 

 

~是不包含的意思。

简单筛选:

c=train.loc[train["Churn"] == "Yes"]

 

 

 

6. 和并列

Final=pd.contact([a,b,c,d],axis=1)

 

这是把列合并起来。

 

7.  将非数字信息转化为数字信息

有许多影响因素是不是数字因素,是文字因素。比如调查网络使用状况的时候,可能会有移动联通电信之类的分别,要将其转化为1,2,3等数字来观察其相关性及一系列问题。

对于两种feature和两种以上feature有些许不同,一个采用标签编码,一个采用单热编码。

 

# Categorical features encoding

# Label encoding for columns with 2 or fewer classes

LE = LabelEncoder()

for f in pro_train:

    if pro_train[f].dtype == 'object':

        if len(list(pro_train[f].unique())) <= 2:

            LE.fit(pro_train[f])

            pro_train[f] = LE.transform(pro_train[f])

            pro_test[f] = LE.transform(pro_test[f])

 

# One-hot encoding for the rest categorical features (classes >=3)

pro_train = pd.get_dummies(pro_train)

pro_test = pd.get_dummies(pro_test)

 

print('Shape of training set : {}'.format(pro_train.shape))

print('Shape of testing set: {}' .format(pro_test.shape))

 

 

 

8. 计算不同feature之间的相关性

如果要做回归分类,要选取有相关性联系的feature来做模型,例如尼泊尔海啸之类的因素要舍弃。但同时互相之间相关性较强的feature,在建立同一个模型的时候也要只留下一个即可。

correlations = app_train.corr()['MonthlyCharges'].sort_values()

 

可以将相关性做个排序。

也可以用随机森林来筛选出相关性最高的feature,精确度很高,但若是数据量大的话,这速度会非常的慢。之后会总结一下随机森林的相关知识和代码。

 

数据清洗是一个很麻烦的工作,本文只是一小部分处理情况,之后可能还会来做类似的整理。