数据预处理的一般方法及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,精确度很高,但若是数据量大的话,这速度会非常的慢。之后会总结一下随机森林的相关知识和代码。
数据清洗是一个很麻烦的工作,本文只是一小部分处理情况,之后可能还会来做类似的整理。