提醒自己应该学什么。这篇博客作为长期的任务0001
刚刚接触人工智能,机器学习,深度学习的朋友,可能都会比较看重算法部分,一旦在教程中看到了数据的处理也都将其简单看看就匆匆带过了。如果之前没有很好地基础的话,到真正拿到数据的时候,很难灵活的按照自己的需要将数据进行清洗。
在网上直接找到的pandas的教程,一般都不会有实际应用中的问题那么灵活。所以需要自己的在刻意的补一下基础。
1. pandas的使用
2. 文本处理
正则表达式 官方API 字符串相关的处理函数 使用案例1 python正则表达式详解
3. 实际的找典型的数据清洗的代码,记录他们的清洗中用到的知识点
-----001. 数据清洗代码 寒老师(NLP类型的数据) cPickle数据存储load和dump from collections import defaultdict字典用于给每一个词分配一个独立的数字进行表示Word作为key,数字作为value sys用于处理路径 join函数将list连成一个字符串 split函数分割 set用于将分割后的字符去掉重复值 字典里存储label、原始输入、词数统计、split 文件打开文件一行行读取并处理 strip()字符串去除左右端空格 dict里面统计所有的词并变成数字,同时还要将词存在一个list里面方便使用 正则表达式 re.sub对于搜索到的字符串,用另一字符串replacement替换。返回替换后的字符串。 比如以后我想清理时想删除所有数字,或者只保留所有数字也可以使用正则表达式
-----002. 2018腾讯广告算法大赛baseline 线上0.73
pandas读取文件
os.path.exists(''../data/userFeature_'')判断某文件是否存在
字符串的split和join多次组合制作dict的key和value(虽然简单,但不单独说出来,初学者可能也没有这个意识直接这么写啊┓( ´∀` )┏)
pd.read_csv('..')读取feature
user_feature.to_csv('../data/userFeature_' + str(cnt) + '.csv', index=False)存文件时如何合理的命名
user_feature = pd.concat([pd.read_csv('../data/userFeature_' + str(i) + '.csv') for i in range(cnt + 1)]).reset_index(drop=True) concat原来不止是两个,多个名字类似的文件应该这样concat
数据较大时可以存成多个csv,读取成df,然后concat,再存成一个大csv。以后考虑这样做好在哪,就多一个思路。
读取文件都自己写了程序叫get_data。用exist分两种情况,有的时候read_csv,没有的时候从头开始制作
表里面的label不是你想要的,就用这个方法更改train.loc[train['label']==-1,'label']=0
pd.concat([train,predict])
pd.merge(data,ad_feature,on='aid',how='left')
data.fillna('-1')填充Nan
删除某一个dataframe 用del user_feature
one-hot应该怎么写?import什么包,词放进list里, for循环list,LabelEncoder().fit_transform还得搭配个try-except
dataframe的这几个操作。
train=data[data.label!=-1]
train_y=train.pop('label') train和label分开了。
test=data[data.label==-1]
enc = OneHotEncoder() enc.fit(data[feature].values.reshape(-1, 1))
train_x= sparse.hstack((train_x, train_a))
cv=CountVectorizer()-for feature in vector_feature: - cv.fit(data[feature])- cv.transform( train[feature])
#数据分片处理,对每片分别训练预测,然后求平均如何实现看代码
-----003. IJCAI-18 阿里妈妈搜索广告转化预测亚军解决方案 BRYAN大神IJCAI-18比赛思路详解
天池比赛汇总 时间是将一天分为48个时间段。
(1)df.apply(f)将一列作为f的参数时不加axis或者写axis = 0;将一行作为参数时写axis=1; df['..]加上列名则只对这一列操作,不加列名则对所有列都进行操作 这个操作用来每一行记录的处理,如统计某一个格里面有几个更小的概念。对时间进行拆分,日期,小时,48个数代表的时间段各成一列。axis = 1的时候可以综合统计同一个id的记录里面存放在不同列的数据;axis = 0的时候可以综合统计整个一列的分布情况,或者去重后总共有多少值。如何往apply的function里面存储多个参数
data_df['remark'].apply(segment_sentence, args=(word_list,)
(3) pd.concat ----将多个df放进list中。确认好取交集还是并集,axis = 0纵向拼接,axis = 1横向拼接 keys参数是用来给list中的不同df做标记的,方便以后 区分开。
(4)len([i for i in reduce((lambda x, y: x + y), [i.split(':')[1].split(',') for i in x.split(';') if len(i.split(':'))>1]) if i != '-1'])如果一个value被分成了好几个层次,先是用;分,再是用冒号分,最后又用逗号分。然后想要求他们的累加值的话,依然可以一行搞定。关于list的加法:['456','ctt']+['wer','wer','ue']输出为['456', 'ctt', 'wer', 'wer', 'ue'] 可见就相当于把多个list合并成一个list. 所以这个方法再统计property这种层次很复杂的数据的时候会使用,目的是求得property的总数。
(5)字符串的join。一个原本打乱了顺序的字符串,里面可能有多个有顺序的小概念,将大字符串逐层的分解,再sorted排序,之后再join。起到的作用:原来是一个字符串,我还保持你是一个字符串,只是顺序调整一下。
(6)sorted 排序的意思,再数据清洗上可以用来将一系列事件如query按照一个固定顺序来排列。具体是什么意图,可能有些事件本身就有先后顺序,然后字符串上又能体现出来,这个时候用sorted就很有用。 sorted([['456','ctt'],['234','ctt'],['wer','wer','ue']])输出为[['234', 'ctt'], ['456', 'ctt'], ['wer', 'wer', 'ue']] 也可以用于统计出一个广告出现最多的属性,按照出现次数将属性排列,再将钱1,2,3,4,5,10个join成不同的feature。
(7)pd.merge merge,join,concat好难想明白各种情况该选择哪个。 ①merge用于将原始df以及按行统计出的新feature结合在一起 ②t_data = pd.merge(data, user, on='user_id').reset_index(drop=True) user是data中将user_id提取出来,data和user进行merge会产生什么效果:原本data表里面是一个user_id对应好几行,现在应该是一个user_id对应一行了。等以后自己用时测试一下。这样用的目的就是将同一个user的信息整合到一起。
(8) LabelEncoder 用整数表示类;OneHotEncoder用one-hot表示类。都是用于表示类别的。一般是在数据清洗完毕之后,在补全类所有分类之后再对各个feature转化成数字。LabelEncoder先fit,再transform.
enc=LabelEncoder()
enc.fit(data['instance_id'].values)
data['instance_id']=enc.transform(data['instance_id'])
df列,简单的用fit_transform 操作就好。
def encode(data):
id_features=['shop_id', 'item_id', 'user_id', 'item_brand_id', 'item_city_id', 'user_gender_id','item_property_list', 'predict_category_property',
'user_occupation_id', 'context_page_id','top1','top2','top3','top4','top5','top10','query1','query','cate']
for feature in id_features:
data[feature] = LabelEncoder().fit_transform(data[feature])
return data
(9) 排名用groupby加rank; full feature多达200多个特征。
(10)df按某一列或几列进行排序data = data.sort_values(by=['user_id', 'context_timestamp']).reset_index(drop=True)
-----004. 天池直播有很多的讲解
-----005. 遇到的问题
(1)dataframe读取完之后,既有空值,又有int,还有float.导致想将整个列变成float,则空值不能满足,将整个列变成string 时float不可以。在Pandas中更改列的数据类型【方法总结】 pd.to_numeric(s, errors='coerce')
(2)将某一列的数据类型统一更改:df = pd.DataFrame(data=d, dtype=np.int8)
(3)df怎么复制 DataFrame.copy(deep=True)
(4)df在从文件中导入时如何确定每一列的数据类型 对于刚收集来的数据最好还是先以object类型读取比较好,容易进行类型转换。
(5)选择非空的行 # df为需要筛选的数据框,col为选择非空依赖的列 df = df[(df[col].notnull) & (df[col] != "")]
(6) pandas如何把dataframe中的值进行排序 sorted_values+pandas Dataframe按指定列值排序问题df.sort_values(by="sales" , ascending=False) DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
(7)划窗统计。data['sum_Times']=data['Times'].groupby(['userID']).cumsum()
-----006. pandas的绘制 present_year[:10].plot(kind='bar', stacked=True)