皮卡布数据集

建议从datastatistics的角度查看pikabu.ru的帖子数据集。数据集本身由450个部分组成,由最佳的全天候解析器组装,用加味剂处理以除去重复的物品,并且还填充了其他列,其含义仅适用于启动者。在这里,数据集本身并不像分析此类站点的方法那么有趣。在接下来的文章中,我们将尝试将机器学习中的元素应用于分析。







您可以在普通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



让我们看看资源上总共有多少个社区:



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笔记本-下载



All Articles