数据整理
收集
首先是收集各个数据集。将twitter-archive-enhanced.csv
、image-predictions.tsv
和tweet_json.txt
加载为DataFrame
。
其中image-predictions.tsv
需要从网络上获取,用urllib.request
的urlretrieve
方法获取。
三个DataFrame
分别命名为twitter_archive
、image_predict
和extra_data
。
评估
目测评估
用肉眼分别观察三个数据集。首先是twitter_archive
表,很明显可以看到列['in_reply_to_status_id', 'in_reply_to_user_id', 'retweeted_status_id', 'retweeted_status_user_id', 'retweeted_status_timestamp', 'doggo', 'floofer', 'pupper', 'puppo']
都有很多空值(NaN
或None
)。
观察timestamp
列,发现每个值后面都带有+0000
,但这不是我们需要的。还有就是值是由日期加时间组成的,例如2017-07-30 15:58:51
。在我看来应该拆分成两列,一列为date
日期,一列为time
时间。
接下来观察image_predict
表,列名p1[2,3], p1[2,3]_conf,p1[2,3]_dog中p意义不明。应该写成predict
更加意思明确的单词。
extra_data
表目测评估没看出来问题。
编程评估
编程评估主要是用DataFrame
的info()
和describe()
方法打印整体表格信息,然后用value_counts()
方法打印单个字段信息,以及视情况用其它代码进行评估。以下为评估结果。
- 日期应该为
datetime
类型 - 数据中包含了转发的数据(retweeted_status_id非空)
-
rating_numerator
和rating_denominator
有三位数和四位数,且数据类型为int
- 考虑增加一列
rating
存放 -
source
不需要标签和链接等,保留文本内容即可 -
name
缺少部分数据,且有一些名字为a
,an
,the
等 - 缺失值填充为
None
,没有被当成空值
最终结果
质量
twitter_archive
table
- column ['in_reply_to_status_id', 'in_reply_to_user_id', 'retweeted_status_id', 'retweeted_status_user_id', 'retweeted_status_timestamp', 'doggo', 'floofer', 'pupper', 'puppo'] 缺少数据
-
timestamp
后面多了+0000
-
timestamp
应该为datetime类型 - 数据中包含了转发的数据(retweeted_status_id非空)
-
rating_numerator
和rating_denominator
有三位数和四位数,且数据类型为int
- 考虑增加一列
rating
存放 -
source
不需要标签和链接等,保留文本内容即可 -
name
缺少部分数据,且有一些名字为a
,an
,the
等 - 缺失值填充为
None
,没有被当成空值
整洁度
-
twitter_archive
表中的timestamp
应该拆分成两列date
和time
-
image_predict
字段名p1,p2,p3意义不明 -
extra_data
的favorite_count
和retweet_count
应合入twitter_archive
表格中 - 将
image_predict
和twitter_archive
合并
清理
清理第一步是要将各个DataFrame
备份好。然后再按照前面评估结果清洗数据。
首先是缺失值的处理。列['in_reply_to_status_id', 'in_reply_to_user_id', 'retweeted_status_id', 'retweeted_status_user_id', 'retweeted_status_timestamp', 'doggo', 'floofer', 'pupper', 'puppo']
都有很多空值,其中['doggo', 'floofer', 'pupper', 'puppo']
填充的是None
,且宠物狗的地位数据未确定是否进行分析,暂时保留。而另外几列是不加入分析的,考虑丢弃掉。用drop()
丢弃不要的列之后,再进行测试,看代码是否有效。后面的步骤都是类似,清洗后进行测试,知道都有这个步骤就行,后面不再赘述。
timestamp
用切片舍弃+0000
,保留日期和时间。
用str.split
将timestamp
拆分成两列date
和time
,然后用drop
删除timestamp
列。
用to_datetime
将列date
的类型转换成datetime
类型。time
保持字符串(object类型),后面方便提取数据。
过滤retweeted_status_id
非空的行,将转发的数据都过滤掉,然后丢弃retweeted_status_id
将rating_numerator
和rating_denominator
转换成正确的数字,且数据类型改为float
计算并存到新列rating
用str.extract
提取并保留source
的文本内容
用replace
将name
列中的a
,an
等不是名字的单词替换成np.NaN
用replace
方法将所有None
替换成np.NaN
用replace
将p1,p2,p3改为predict1,predict2,predict3
用merge
将twitter_archive
、image_predict
和extra_data
三表合并
再评估
经过前面的数据清洗之后,需要再进行一次评估,确保数据是干净的。结果发现合并完的数据集还有三个数据质量问题。
质量
- 关于狗的地位的信息只有317条,远小于总条数
-
name
缺失过多数据 -
source
应该为category
类型
再清理
从text
中提取狗的地位存放到stage
,然后删掉4列狗的地位
从text
中提取狗的名字
用astype
将source
的数据类型换成category
最后的检查
最后再检查一下,发现从text
提取狗狗地位的时候,空值并不是np.NaN
。所以需要将狗的地位为空的记录替换成np.NaN
保存
最终用pandas.to_csv
保存为csv文件。也可以选择保存为Excel文件或者保存到数据库。
网友评论