Sie können mit dem Datensatz sowohl in normalem Excel als auch in Jupyter Notebook arbeiten. Datenfelder sind durch Tabulatoren getrennt. Wir werden uns auf die letzte Option konzentrieren, und alle Befehle werden unter BerĂŒcksichtigung der Tatsache gegeben, dass die Arbeit in einem Jupyter-Notizbuch ausgefĂŒhrt wird.
Wir werden in Fenstern arbeiten. Verwenden Sie daher cmd, um zu dem Ordner mit dem heruntergeladenen Datensatz zu wechseln und jupyter notebook mit dem gleichnamigen Befehl auszufĂŒhren .
Als nÀchstes importieren wir die Module.
import pandas as pd
import numpy as np
Da das Dataset keine Header enthÀlt, legen Sie diese vor dem Laden des Datasets fest:
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']
Hier ist alles klar: Titel des Artikels, Link dazu, Artikel-ID, Bewertung (Anzahl der Pluspunkte), Artikel-Datum, Anzahl der Kommentare, Autoren-ID, Artikel-Meta-Bewertung, Autorenname, Link zum Autor, Link zur Community.
Wir zÀhlen den Datensatz.
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)
Hier ist eine leichte Optimierung der Lesewerte, sodass einige Spalten als numerisch angezeigt werden.
Der Datensatz reprÀsentiert also 468.595 Zeilen, 11 Spalten.
print(df.shape)#468595 ,11
Erste 5 DatensÀtze
df.head(5)
Statistische Beschreibung:
df.describe()
Arbeiten mit leeren Werten in einem Datensatz
Trotz der Tatsache, dass die Parser unermĂŒdlich arbeiteten, gibt es kleine Löcher im Datensatz, dh technologische Löcher, die durch LĂŒcken dargestellt werden. Diese LĂŒcken in Pandas haben den Wert NaN. Sehen wir uns die Anzahl der Zeilen mit solchen HohlrĂ€umen an:
len(df.loc[pd.isnull( df['story_title'])])
Wie es auf dem Datensatz aussieht:
df.loc[pd.isnull( df['story_title'])]
1444 Zeilen mit LĂŒcken beeintrĂ€chtigen das Gesamtbild nicht, aber lassen Sie uns sie trotzdem loswerden:
data1=df.dropna(axis=0, thresh=5)
Wir ĂŒberprĂŒfen, ob der Löschvorgang erfolgreich war:
len(data1.loc[pd.isnull(data1['story_id'])])
Lassen Sie uns mit dem Datensatz arbeiten
Sehen wir uns die Spaltennamen an
df.columns
WĂ€hlen wir die erste Spalte aus
col = df['story_title']
col
Schauen wir uns das Minimum im Datensatz an
data1.min()
Maximal
data1.max()
Das gleiche ist visueller:
data1.loc[:,['user_name', 'data_rating', 'story_comments']].min()
Sammeln wir nun die Werte aus den interessanten Spalten in einem Array:
arr = data1[['story_id', 'data_rating', 'data_timestamp','user_name']].values
Sie können sich eine der Spalten des Arrays ansehen:
arr[:, 1] #
Schauen wir uns die Anzahl der Artikel mit einer Bewertung von ĂŒber 10.000 an:
print((arr[:, 1] > 10000.0).sum())
Nur 2672 Artikel haben eine ultrahohe Bewertung von 450.000
Zeichnen wir Diagramme
Importieren wir zunÀchst das Modul:
import matplotlib.pyplot as plt
Lassen Sie uns herausfinden, ob es einen Zusammenhang zwischen der ID des Autors des Artikels und der Bewertung des Artikels gibt.
plt.scatter(data1['data_author_id'], data1['data_rating'])
plt.xlabel('data_author_id')
plt.ylabel('data_rating')
Aufgrund der groĂen Datenmenge ist es schwierig, die Beziehung zu erfassen, und höchstwahrscheinlich fehlt sie.
Gibt es einen Zusammenhang zwischen Artikel-ID und Artikelbewertung?
plt.scatter(data1['story_id'], data1['data_rating'])
plt.xlabel('story_id')
plt.ylabel('data_rating')
Hier fÀllt auf, dass BeitrÀge mit einer höheren Anzahl (spÀtere BeitrÀge) eine höhere Bewertung erhalten und hÀufiger gewÀhlt werden. Wird die Ressource immer beliebter?
Gibt es einen Zusammenhang zwischen dem Datum des Artikels und der Bewertung?
plt.scatter(data1['data_timestamp'], data1['data_rating'])
plt.xlabel('data_timestamp')
plt.ylabel('data_rating')
Sie können auch die Beziehung zwischen spÀteren Posts und dem Post-Rank sehen. Bessere Inhalte oder wiederum nur eine Steigerung des Website-Verkehrs?
Gibt es einen Zusammenhang zwischen der Bewertung eines Artikels und der Anzahl der Kommentare dazu?
plt.scatter(data1['story_comments'], data1['data_rating'])
plt.xlabel('story_comments')
plt.ylabel('data_rating')
Hier besteht eine lineare Beziehung, obwohl sie stark gestreut ist. Es gibt eine bestimmte Logik: Je höher die Bewertung des Beitrags, desto mehr Kommentare.
Werfen wir einen Blick auf die Top-Autoren (Autoren mit den höchsten Gesamtbewertungen):
top_users_df = data1.groupby('user_name')[['data_rating']].sum().sort_values('data_rating', ascending=False).head(10)
top_users_df
FĂŒgen wir Klarheit hinzu:
top_users_df.style.bar()
Probieren wir andere Visualisierungstools aus. Zum Beispiel 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
Lassen Sie uns Diagramme mit Spalten mit Post-ID, deren Bewertung und Kommentaren erstellen und das Ergebnis in .png speichern:
%config InlineBackend.figure_format = 'png'
sns_plot = sns.pairplot(data1[['story_id', 'data_rating', 'story_comments']]);
sns_plot.savefig('pairplot.png')
Probieren wir das Plotly-Visualisierungstool aus
from plotly.offline import init_notebook_mode, iplot
import plotly
import plotly.graph_objs as go
init_notebook_mode(connected=True)
Gruppieren wir die Daten nach Datum und Gesamtbewertung der Artikel fĂŒr dieses Datum:
df2 = data1.groupby('data_timestamp')[['data_rating']].sum()
df2.head()
Mal sehen, wie viele Artikel an einem bestimmten Datum (Monat) veröffentlicht wurden:
released_stories = data1.groupby('data_timestamp')[['story_id']].count()
released_stories.head()
Kleben wir zwei Tabellen:
years_df = df2.join(released_stories)
years_df.head()
Zeichnen wir nun mit 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)
Das Schöne an Plotly ist seine InteraktivitĂ€t. In diesem Fall zeigt die Grafik beim Hover die Gesamtbewertung der Artikel fĂŒr ein bestimmtes Datum (Monat). Es ist ersichtlich, dass die Bewertung im Jahr 2020 gesunken ist. Dies kann jedoch durch die Tatsache erklĂ€rt werden, dass die Anzahl der Artikel aus diesem Intervall von den Parsern nicht ausreichend erfasst wurde, sowie durch die Tatsache, dass die BeitrĂ€ge noch nicht genĂŒgend Pluspunkte erhalten haben.
Am unteren Rand des Diagramms zeigt eine rote Linie auch interaktiv die Anzahl der eindeutigen Artikel fĂŒr ein bestimmtes Datum.
Speichern wir das Diagramm als HTML-Datei.
plotly.offline.plot(fig, filename='stats_pikabu.html', show_link=False);
Datengruppierungen
Mal sehen, wie viele Autoren im Datensatz sind:
data1.groupby('user_name').size()
Wie viele Artikel pro Autor:
data1['user_name'].value_counts()
Wer schreibt am hÀufigsten (mehr als 500 Artikel):
for i in data1.groupby('user_name').size():
if i>500:
print (data1.iloc[i,8],i) #8- user_name
Das ist es also, der die Ressource "verstopft". Es gibt nicht so viele von ihnen:
Autoren
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
Mal sehen, wie viele Communities sich insgesamt auf der Ressource befinden:
data1.groupby('story__community_link').size()
Und welches ist das produktivste:
data1['story__community_link'].value_counts()
* Die Daten ĂŒber die Community sind nicht ganz korrekt, da die zuerst erwĂ€hnte Community wĂ€hrend des Parsens gesammelt wurde und die Autoren hĂ€ufig mehrere Teile angeben.
Lassen Sie uns abschlieĂend sehen, wie Sie die Funktion mit der Ausgabe des Ergebnisses in einer separaten Spalte anwenden .
Dies wird fĂŒr die weitere Untersuchung des Datensatzes benötigt.
Einfache Funktion zum Zuweisen der Bewertung eines Artikels zu einer Gruppe.
Wenn die Bewertung mehr als <5000 - schlecht,> 5000 - gut ist.
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'
Wenden wir die Funktion ratioGroup auf den DataFrame an und zeigen das Ergebnis in einer separaten Spalte -ratingGroup an
data1['ratingGroup'] = data1.apply( ratingGroup, axis = 1 )
data1.head(10)
Im Datensatz wird eine neue Spalte mit den folgenden Werten
angezeigt : Download - Datensatz .
Laden Sie einen nicht gereinigten Datensatz herunter, um Duplikate selbst zu bereinigen - einen Datensatz .
* Python bereinigt (entfernt doppelte Zeilen basierend auf der Artikel-ID) fĂŒr fast eine Stunde! Wenn jemand den Code in C ++ umschreibt, bin ich dankbar!
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)
Die Frage wird entfernt, tk. unerwartet) hat ein Wörterbuch in Python gefunden, das zehnmal schneller funktioniert:
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 Notebook - herunterladen .