您可以在普通excel和jupyter笔记本中使用数据集,数据字段由制表符分隔。我们将集中讨论最后一个选项,并考虑到在jupyter笔记本中完成工作这一事实,将给出所有命令。
我们将在Windows中工作。因此,使用cmd转到包含下载的数据集的文件夹,然后使用相同名称的命令运行jupyter notebook。
接下来,让我们导入模块。
import pandas as pd
import numpy as np
由于数据集不包含标题,因此在加载数据集之前先指定它们:
headers=['story_title','link','story_id','data_rating','data_timestamp','story_comments','data_author_id','data_meta_rating','user_name','user_link','story__community_link']
这里的所有内容都很清楚:文章标题,链接,文章ID,等级(加号),文章日期,评论数,作者ID,文章元等级,作者姓名,作者链接,社区链接。
我们计算数据集。
df = pd.read_csv('400k-pikabu.csv',parse_dates=['data_timestamp'],
warn_bad_lines=True,
index_col = False,
dtype ={'story_title':'object','link':'object','story_id':'float32','data_rating':'float32',
'story_comments':'float32','data_author_id':'float32'},
delimiter='\t',names=headers)
这是读取值的略微优化,以便某些列显示为数字。
因此,数据集代表468,595行,11列。
print(df.shape)#468595 ,11
前5个条目
df.head(5)
统计说明:
df.describe()
处理数据集中的空值
尽管解析器孜孜不倦地工作,但数据集中仍然存在小漏洞,换句话说,就是由间隙表示的技术漏洞。熊猫的这些差距带来了NaN的价值。让我们看一下带有这样的空隙的行数:
len(df.loc[pd.isnull( df['story_title'])])
它在数据集上的外观:
df.loc[pd.isnull( df['story_title'])]
1444条带有缝隙的线不会破坏整体效果,但是,让我们摆脱它们:
data1=df.dropna(axis=0, thresh=5)
我们检查删除是否成功:
len(data1.loc[pd.isnull(data1['story_id'])])
让我们使用数据集
让我们看看列名
df.columns
让我们选择第一列
col = df['story_title']
col
让我们看一下数据集中的最小值
data1.min()
最大值
data1.max()
相同的是更具描述性的:
data1.loc[:,['user_name', 'data_rating', 'story_comments']].min()
现在让我们从有趣的列中将值收集到一个数组中:
arr = data1[['story_id', 'data_rating', 'data_timestamp','user_name']].values
您可以查看数组的其中一列:
arr[:, 1] #
让我们看一下评分超过10,000的文章数:
print((arr[:, 1] > 10000.0).sum())
只有2672篇文章的评分超过45万,为超高评分
让我们画图
首先,让我们导入模块:
import matplotlib.pyplot as plt
让我们找出文章作者的ID与文章的评级之间是否存在联系?
plt.scatter(data1['data_author_id'], data1['data_rating'])
plt.xlabel('data_author_id')
plt.ylabel('data_rating')
由于数据量很大,因此很难把握这种关系,并且很可能会丢失这种关系。
文章编号和文章等级之间有关系吗?
plt.scatter(data1['story_id'], data1['data_rating'])
plt.xlabel('story_id')
plt.ylabel('data_rating')
此处值得注意的是,具有较高编号(较晚的职位)的帖子获得较高的评级,它们的投票频率更高。资源是否越来越受欢迎?
文章日期与评分之间是否有关系?
plt.scatter(data1['data_timestamp'], data1['data_rating'])
plt.xlabel('data_timestamp')
plt.ylabel('data_rating')
您还可以查看以后的帖子和帖子等级之间的关系。更好的内容,还是只是网站流量的增加?
文章的等级与其评论数之间有联系吗?
plt.scatter(data1['story_comments'], data1['data_rating'])
plt.xlabel('story_comments')
plt.ylabel('data_rating')
尽管高度分散,但这里存在线性关系。有一定的逻辑,帖子的评分越高,评论越多。
让我们看一下顶级作者(具有最高总评分的作者):
top_users_df = data1.groupby('user_name')[['data_rating']].sum().sort_values('data_rating', ascending=False).head(10)
top_users_df
让我们增加清晰度:
top_users_df.style.bar()
让我们尝试其他可视化工具。例如seaborn
#
! pip3 install seaborn
from __future__ import (absolute_import, division,
print_function, unicode_literals)
#
import warnings
warnings.simplefilter('ignore')
# jupyter'e
%pylab inline
# svg
%config InlineBackend.figure_format = 'svg'
#
from pylab import rcParams
rcParams['figure.figsize'] = 6,3
import seaborn as sns
让我们使用带有帖子ID,其等级和注释的列来构建图形,然后将结果保存在.png中:
%config InlineBackend.figure_format = 'png'
sns_plot = sns.pairplot(data1[['story_id', 'data_rating', 'story_comments']]);
sns_plot.savefig('pairplot.png')
让我们尝试Plotly可视化工具
from plotly.offline import init_notebook_mode, iplot
import plotly
import plotly.graph_objs as go
init_notebook_mode(connected=True)
让我们按日期和该日期文章的总评分对数据进行分组:
df2 = data1.groupby('data_timestamp')[['data_rating']].sum()
df2.head()
让我们看看在某个日期(一个月)发表了多少篇文章:
released_stories = data1.groupby('data_timestamp')[['story_id']].count()
released_stories.head()
让我们粘贴两个表:
years_df = df2.join(released_stories)
years_df.head()
现在让我们使用plotly绘制:
trace0 = go.Scatter(
x=years_df.index,
y=years_df.data_rating,
name='data_rating'
)
trace1 = go.Scatter(
x=years_df.index,
y=years_df.story_id,
name='story_id'
)
data = [trace0, trace1]
layout = {'title': 'Statistics'}
fig = go.Figure(data=data, layout=layout)
iplot(fig, show_link=False)
情节之美在于它的互动性。在这种情况下,悬停时,该图将显示特定日期(月份)的商品总评分。可以看出,该等级在2020年下降了。但这可以解释为以下事实:解析器未充分收集此时间间隔内的文章数量,以及帖子尚未获得足够的加号。
在图的底部,红线还交互显示特定日期的唯一文章数。
让我们将图表另存为html文件。
plotly.offline.plot(fig, filename='stats_pikabu.html', show_link=False);
资料分组
让我们看看数据集中有多少作者:
data1.groupby('user_name').size()
每位作者多少篇文章:
data1['user_name'].value_counts()
谁写得最多(超过500篇文章):
for i in data1.groupby('user_name').size():
if i>500:
print (data1.iloc[i,8],i) #8- user_name
因此,这就是“堵塞”资源的人)。没有那么多:
作家
crackcraft 531
mpazzz 568
kastamurzik 589
pbdsu 773
RedCatBlackFox 4882
Wishhnya 1412
haalward 1190
iProcione 690
tooNormal 651
Drugayakuhnya 566
Ozzyab 1088
kalinkaElena9 711
Freshik04 665
100pudofff 905
100pudofff 1251
Elvina.Brestel 1533
1570525 543
Samorodok 597
Mr.Kolyma 592
kka2012 505
DENTAARIUM 963
4nat1k 600
chaserLI 650
kostas26 1192
portal13 895
exJustice 1477
alc19 525
kuchka70 572
SovietPosters 781
Grand.Bro 1051
Rogo3in 1068
fylhtq2222 774
deystvitelno 539
lilo26 802
al56.81 2498
Hebrew01 596
TheRovsh 803
ToBapuLLI 1143
ragnarok777 893
Ichizon 890
hoks1 610
arthik 700
mpazzz 568
kastamurzik 589
pbdsu 773
RedCatBlackFox 4882
Wishhnya 1412
haalward 1190
iProcione 690
tooNormal 651
Drugayakuhnya 566
Ozzyab 1088
kalinkaElena9 711
Freshik04 665
100pudofff 905
100pudofff 1251
Elvina.Brestel 1533
1570525 543
Samorodok 597
Mr.Kolyma 592
kka2012 505
DENTAARIUM 963
4nat1k 600
chaserLI 650
kostas26 1192
portal13 895
exJustice 1477
alc19 525
kuchka70 572
SovietPosters 781
Grand.Bro 1051
Rogo3in 1068
fylhtq2222 774
deystvitelno 539
lilo26 802
al56.81 2498
Hebrew01 596
TheRovsh 803
ToBapuLLI 1143
ragnarok777 893
Ichizon 890
hoks1 610
arthik 700
让我们看看资源上总共有多少个社区:
data1.groupby('story__community_link').size()
哪个是最多产的:
data1['story__community_link'].value_counts()
*有关社区的数据并不完全正确,因为在分析过程中收集了第一个提到的社区,因此作者经常指出一些内容。
最后,让我们看看如何将函数与输出一起应用于单独的column。
这对于进一步研究数据集将是必需的。
一个简单的功能,可以将文章的评分分配给组。
如果评级大于<5000-差,> 5000-良好。
def ratingGroup( row ):
# , NaN
if not pd.isnull( row['data_rating'] ):
if row['data_rating'] <= 5000:
return 'bad'
if row['data_rating'] >= 20000:
return 'good'
# NaN, Undef
return 'Undef'
让我们将ratingGroup函数应用于DataFrame,并将结果显示在单独的列-ratingGroup中
data1['ratingGroup'] = data1.apply( ratingGroup, axis = 1 )
data1.head(10)
带有以下值的新列将出现在数据集中:
下载-数据集。
下载未清理的数据集以便自己清理重复数据集。
* python清理(根据文章ID删除重复的行)将近一个小时!如果有人用C ++重写代码,我将不胜感激!:
with open('f-final-clean-.txt','a',encoding='utf8',newline='') as f:
for line in my_lines:
try:
b=line.split("\t")[2]
if b in a:
pass
else:
a.append(b)
f.write(line)
except:
print(line)
问题已删除,tk。意外地)在python中找到了一个字典,其工作速度提高了10倍:
a={}
f = open("f-final.txt",'r',encoding='utf8',newline='')
f1 = open("f-final-.txt",'a',encoding='utf8',newline='')
for line in f.readlines():
try:
b=line.split("\t")[2]
if b in a:
pass
else:
a[b]=b
#print (a[b])
f1.write(line)
except:
pass
f.close()
f1.close()
Jupyter笔记本-下载。