【云计算】pandas数据预处理踩坑
小标 2019-02-11 来源 : 阅读 1209 评论 0

摘要:本文主要向大家介绍了【云计算】pandas数据预处理踩坑,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】pandas数据预处理踩坑,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

在建模预测时遇见一个问题:预测结果中正例极少,导致准确率虽然很高,但是召回率非常低,0.01以下,查看了数据比例,训练集有三万多条,其中有两万多条正例,这个比例很均衡,但是为什么召回率这么低呢?

后来发现,在抽取数据的地方就有问题,特征抽出来都是0,那么,为什么是0呢?



 答:因为groupby以后直接进行join等操作,groupby直接操作以后,不是Dataframe的结构,有点奇葩,所以出现了大规模的0值。


在这里总结一下可能遇到的坑。


读取数据:

pd.read_csv('test.csv',names = []) 如何保留index并且将结果存成DataFrame?

答:使用reset_index()函数。df.reset_index() 如何将层级索引“推平”?也就是取消层级显示,

答:使用unstack()函数 join有顺序的差别

答:如果处理好names的问题,merge非常好用。另外,concat是拼接,可以横着拼(axis = 1),默认竖着拼(axis=0) 有Nan怎么办?

答:具体问题具体分析,如果是观看次数这类,缺失值可以补充0代表没看过,使用fillna(0)。如果是温度等等可以使用平均值或中位数。 数据处理常用的显示信息函数:

df.info() 显示df的所有信息,包括行列个数名字占用内存数等等
df.head() 默认显示前5列,在括号里可以改成10,20,,,
df.tail() 后5列,同上
type(df)  显示df的类型,在python脚本中非常常用
len(df)   显示df的长度。


另外,apply也是合并数据的绝佳选择。在这里贴一个简单的预处理程序,希望以后忘记的时候常回来看看。原始数据是招商银行一个比赛的数据。


#coding:utf-8

import pandas as pd
import numpy as np
import time
import xgboost as xgb
import operator

from sklearn.model_selection import StratifiedKFold
from sklearn.decomposition import PCA

def Max_action_count(x):
    return np.max(x)
def Min_action_count(x):
    return np.min(x)
def Median_action(x):
    return x.median()
def Skew_action(x):
    skew = np.power((x - np.std(x))/np.mean(x),3)
    return skew
def Kurt_action(x):

    kurt = np.power((x - np.std(x))/np.mean(x),4)
    return kurt

# 读取个人信息
train_agg = pd.read_csv('train_agg.csv',sep='\t')
test_agg = pd.read_csv('test_agg.csv',sep='\t')
agg = pd.concat([train_agg,test_agg],copy=False)

# 日志信息
train_log = pd.read_csv('train_log.csv',sep='\t')
test_log = pd.read_csv('test_log.csv',sep='\t')
log = pd.concat([train_log,test_log],copy=False)

# 用户唯一标识
train_flg = pd.read_csv('train_flg.csv',sep='\t')
test_flg = pd.read_csv('submit_sample.csv',sep='\t')
test_flg['FLAG'] = -1
del test_flg['RST']
flg = pd.concat([train_flg,test_flg],copy=False)

# 特征抽取
log['OCC_TIM'] = log['OCC_TIM'].apply(lambda x:time.mktime(time.strptime(x, "%Y-%m-%d %H:%M:%S")))
log = log.sort_values(['USRID','OCC_TIM'])
log['next_time'] = log.groupby(['USRID'])['OCC_TIM'].diff(-1).apply(np.abs)
log_time = log.groupby(['USRID'],as_index=False)['next_time'].agg({
    'next_time_mean':np.mean,
    'next_time_std':np.std,
    'next_time_min':np.min,
    'next_time_max':np.max,
    'next_time_avg':np.average,
    'next_time_median':np.median,
    'next_time_var':np.var,
    'next_time_nanmean':np.nanmean,
    'next_time_nanmeadian':np.nanmedian,
    'next_time_nanstd':np.nanstd,
    'next_time_nanvar':np.nanvar
})

log_evt = pd.DataFrame()
log_evt['USRID'] = np.unique(log['USRID'])
for i in range(3):
    name = 'EVT_LBL' + str(i)
    log[name] = log['EVT_LBL'].apply(lambda x: x.split('-')[i])
    # print(log['EVT_LBL' + str(i)])
    log_event = log.groupby(['USRID', name], as_index=False)['EVT_LBL'].count()
    # print(log_event)
    log_event = log_event.groupby(['USRID'], as_index=False)['EVT_LBL'].agg({
        name + 'max': np.max,
        name + 'min': np.min,
        name + 'mean': np.mean,
        name + 'std': np.std,
        name + 'median': np.median,
        name + 'average': np.average,
        name + 'nanmean': np.nanmean,
        name + 'nanstd': np.nanstd,
        name + 'nanmedian':np.nanmedian,
        name + 'var':np.var,
        name + 'nanvar':np.nanvar
    })
    log_evt = pd.merge(log_evt, log_event, on='USRID', how='left')

log_action = log.groupby(['USRID', 'TCH_TYP'])['OCC_TIM'].count().unstack().reset_index()
log_action.rename(columns={0: 'APP', 1: 'web', 2: 'H5'}, inplace=True)  # ['OCC_TIM'].
log_action.fillna(0)
# print(log_action.iloc[:,[1,2]].head())
log_action['Max_action'] = log_action.iloc[:, [1, 2]].apply(Max_action_count, axis=1)
log_action['Min_action'] = log_action.iloc[:, [1, 2]].apply(Min_action_count, axis=1)
log_action['kurt'] = log_action.iloc[:, [1, 2]].apply(Kurt_action, axis=1)
log_action['skew'] = log_action.iloc[:, [1, 2]].apply(Skew_action, axis=1)
log_action['median'] = log_action.iloc[:, [1, 2]].apply(Median_action, axis=1)


data = pd.merge(agg,flg,on=['USRID'],how='left',copy=False)
data = pd.merge(data,log_evt,on=['USRID'],how='left',copy=False)
data = pd.merge(data,log_action,on=['USRID'],how='left',copy=False)
data = pd.merge(data,log_time,on = ['USRID'],how='left',copy=False)

# pca = PCA(n_components='mle')
# pca.fit(data.fillna(0))
# print(pca.explained_variance_ratio_)
# pcaFeature = pca.fit_transform(data)
# pcaFeature = pd.DataFrame(pcaFeature)
# pcaFeature['user_id'] = data['USRID']
#
# data = pd.merge(data, pcaFeature,on='USRID')


print(data.info())

data.to_csv('Data.csv',index=None)


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved