Anda dapat bekerja dengan dataset baik di excel biasa dan di notebook jupyter, bidang data dipisahkan oleh tab. Kami akan fokus pada opsi terakhir, dan semua perintah akan diberikan dengan mempertimbangkan fakta bahwa pekerjaan sedang dilakukan di notebook jupyter.
Kami akan bekerja di jendela. Oleh karena itu, gunakan cmd untuk masuk ke folder dengan kumpulan data yang diunduh dan jalankan notebook jupyter dengan perintah dengan nama yang sama.
Selanjutnya, mari impor modul.
import pandas as pd
import numpy as np
Karena kumpulan data tidak berisi header, mari kita tentukan sebelum memuat kumpulan data:
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']
Semuanya jelas di sini: judul artikel, tautan ke sana, id artikel, peringkat (jumlah plus), tanggal artikel, jumlah komentar, id penulis, peringkat meta artikel, nama penulis, tautan ke penulis, tautan ke komunitas.
Kami menghitung dataset.
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)
Berikut ini sedikit pengoptimalan nilai baca sehingga beberapa kolom muncul sebagai numerik.
Jadi kumpulan data tersebut mewakili 468.595 baris, 11 kolom.
print(df.shape)#468595 ,11
5 rekaman pertama
df.head(5)
Deskripsi statistik:
df.describe()
Bekerja dengan nilai kosong dalam kumpulan data
Terlepas dari kenyataan bahwa parser bekerja tanpa lelah, ada lubang kecil di dataset, dengan kata lain, lubang teknologi diwakili oleh celah. Celah pada panda ini memiliki nilai NaN. Mari kita lihat jumlah baris dengan rongga seperti itu:
len(df.loc[pd.isnull( df['story_title'])])
Bagaimana tampilannya di dataset:
df.loc[pd.isnull( df['story_title'])]
1444 baris dengan celah tidak merusak keseluruhan gambar, namun, bagaimanapun, mari kita singkirkan:
data1=df.dropna(axis=0, thresh=5)
Kami memeriksa bahwa penghapusan berhasil:
len(data1.loc[pd.isnull(data1['story_id'])])
Mari bekerja dengan dataset
Mari kita lihat nama kolomnya
df.columns
Mari pilih kolom pertama
col = df['story_title']
col
Mari kita lihat jumlah minimum dalam dataset
data1.min()
Maksimum
data1.max()
Hal yang sama lebih visual:
data1.loc[:,['user_name', 'data_rating', 'story_comments']].min()
Sekarang mari kumpulkan nilai dari kolom yang menarik ke dalam array:
arr = data1[['story_id', 'data_rating', 'data_timestamp','user_name']].values
Anda dapat melihat salah satu kolom dari array:
arr[:, 1] #
Mari kita lihat jumlah artikel dengan rating lebih dari 10.000:
print((arr[:, 1] > 10000.0).sum())
Hanya 2672 artikel yang memiliki rating sangat tinggi dari 450k
Mari menggambar grafik
Pertama, mari impor modul:
import matplotlib.pyplot as plt
Mari kita cari tahu apakah hubungan antara id penulis artikel dan peringkat artikel
plt.scatter(data1['data_author_id'], data1['data_rating'])
plt.xlabel('data_author_id')
plt.ylabel('data_rating')
Karena banyaknya data, sulit untuk memahami hubungannya dan, kemungkinan besar, itu hilang.
Apakah ada hubungan antara id artikel dan peringkat artikel?
plt.scatter(data1['story_id'], data1['data_rating'])
plt.xlabel('story_id')
plt.ylabel('data_rating')
Terlihat di sini bahwa posting dengan jumlah yang lebih tinggi (posting selanjutnya) menerima peringkat yang lebih tinggi, mereka lebih sering dipilih. Apakah sumber daya semakin populer?
Apakah ada hubungan antara tanggal artikel dan rating?
plt.scatter(data1['data_timestamp'], data1['data_rating'])
plt.xlabel('data_timestamp')
plt.ylabel('data_rating')
Anda juga dapat melihat hubungan antara posting selanjutnya dan peringkat posting. Konten yang lebih baik atau, sekali lagi, hanya peningkatan lalu lintas situs web?
Apakah ada hubungan antara peringkat artikel dan jumlah komentar?
plt.scatter(data1['story_comments'], data1['data_rating'])
plt.xlabel('story_comments')
plt.ylabel('data_rating')
Ada hubungan linier di sini, meskipun sangat tersebar. Ada logika tertentu, semakin tinggi peringkat postingan, semakin banyak komentar.
Mari kita lihat penulis teratas (penulis dengan total peringkat posting tertinggi):
top_users_df = data1.groupby('user_name')[['data_rating']].sum().sort_values('data_rating', ascending=False).head(10)
top_users_df
Mari tambahkan kejelasan:
top_users_df.style.bar()
Mari coba alat visualisasi lainnya. Misalnya tumbuhan laut
#
! 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
Mari buat grafik menggunakan kolom dengan id posting, peringkat dan komentarnya, simpan hasilnya di .png:
%config InlineBackend.figure_format = 'png'
sns_plot = sns.pairplot(data1[['story_id', 'data_rating', 'story_comments']]);
sns_plot.savefig('pairplot.png')
Mari kita coba alat visualisasi Plotly
from plotly.offline import init_notebook_mode, iplot
import plotly
import plotly.graph_objs as go
init_notebook_mode(connected=True)
Mari kelompokkan data berdasarkan tanggal dan total rating artikel untuk tanggal ini:
df2 = data1.groupby('data_timestamp')[['data_rating']].sum()
df2.head()
Mari kita lihat berapa banyak artikel yang diterbitkan pada tanggal (bulan) tertentu:
released_stories = data1.groupby('data_timestamp')[['story_id']].count()
released_stories.head()
Mari rekatkan dua tabel:
years_df = df2.join(released_stories)
years_df.head()
Sekarang mari menggambar menggunakan 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)
Keindahan plotly adalah interaktivitasnya. Dalam hal ini, saat mengarahkan kursor, grafik menunjukkan peringkat total artikel untuk tanggal (bulan) tertentu. Terlihat bahwa rating turun pada tahun 2020. Namun hal ini dapat dijelaskan dengan fakta bahwa jumlah artikel dari interval ini belum terkumpul secara memadai oleh para parser, serta fakta bahwa postingan belum mendapatkan nilai plus yang cukup.
Di bagian bawah grafik, garis merah juga menunjukkan jumlah artikel unik untuk tanggal tertentu secara interaktif.
Mari simpan grafik sebagai file html.
plotly.offline.plot(fig, filename='stats_pikabu.html', show_link=False);
Pengelompokan data
Mari kita lihat berapa banyak penulis dalam kumpulan data:
data1.groupby('user_name').size()
Berapa banyak artikel per penulis:
data1['user_name'].value_counts()
Siapa yang paling sering menulis (lebih dari 500 artikel):
for i in data1.groupby('user_name').size():
if i>500:
print (data1.iloc[i,8],i) #8- user_name
Jadi itulah yang "membuang" sumber daya). Jumlahnya tidak banyak:
penulis
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
Mari kita lihat berapa banyak komunitas yang ada di sumber daya secara total:
data1.groupby('story__community_link').size()
Dan mana yang paling produktif:
data1['story__community_link'].value_counts()
* Data tentang komunitas tidak sepenuhnya benar, karena komunitas yang disebutkan pertama dikumpulkan selama penguraian, dan penulis sering menunjukkan beberapa bagian.
Terakhir, mari kita lihat bagaimana menerapkan fungsi dengan output dari hasil di kolom terpisah .
Ini akan dibutuhkan untuk studi lebih lanjut dari dataset.
Fungsi sederhana untuk menetapkan peringkat artikel ke grup.
Jika rating lebih dari <5000 - buruk,> 5000 - baik.
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'
Mari terapkan fungsi ratingGroup ke DataFrame dan tampilkan hasilnya di kolom terpisah -ratingGroup
data1['ratingGroup'] = data1.apply( ratingGroup, axis = 1 )
data1.head(10)
Sebuah kolom baru akan muncul di dataset dengan nilai-nilai berikut:
Download - dataset .
Unduh kumpulan data tidak bersih untuk membersihkan duplikat Anda sendiri - kumpulan data .
* python membersihkan (menghapus baris duplikat berdasarkan id artikel) selama hampir satu jam! Jika seseorang menulis ulang kode di C ++ saya akan berterima kasih!:
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)
Pertanyaannya dihapus, tk. tanpa diduga) menemukan kamus di python yang bekerja 10 kali lebih cepat:
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()
Notebook Jupyter - unduh .