数据预处理的一般方法
在我们爬到数据或者要处理一份数据文件时,首先要对数据进行清洗和除燥。本文就总结一下,一般数据预处理过程中可能要用到的方法。
- 查找数据的缺失值
在拿到第一份原始数据的时候,首先要检查数据的完整性。因为在建立模型进行回归分类分析的时候,通常需要一份完整的数据文件。除非特定的例如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,精确度很高,但若是数据量大的话,这速度会非常的慢。之后会总结一下随机森林的相关知识和代码。
数据清洗是一个很麻烦的工作,本文只是一小部分处理情况,之后可能还会来做类似的整理。