s此博客是建立于爬蟲基礎之上,首先我們需要對豆瓣網(wǎng)站的圖書進行爬取,這里將不再展示爬取部分,直接進行數(shù)據(jù)清洗及可視化分析部分。
一.準備數(shù)據(jù)集
數(shù)據(jù)集在下方鏈接當中,如需請自取。
https://pan.baidu.com/s/146N5YQfE0hkkYm2JOZQsEg
import pandas as pd
import numpy as np
import re
import openpyxl
df=pd.read_csv(r'book_douban.csv',index_col=0)
print(df.head(10)) #打印前十行進行觀察
輸出結果:
?二.數(shù)據(jù)清洗
大概流程如下:
?在該數(shù)據(jù)集當中,因為存在大量“不規(guī)則”字符,我們在使用的第一步就需要將該大類數(shù)據(jù)清洗,并且補全一些缺失項數(shù)據(jù)。這樣在接下來的分析及可視化過程當中才可以順利進行。
1.重新命名
因為原數(shù)據(jù)集當中的第六列的標題為:“數(shù)”很抽象,所以我們的第一步清洗就將“數(shù)”重命名為“頁數(shù)”
df.rename(columns={'數(shù)':'頁數(shù)'}, inplace=True)
df.reset_index(drop=True, inplace=True)
df.describe()
print(df.iloc[:, 4])
輸出結果:
觀察可得,現(xiàn)在已經(jīng)將“數(shù)”改為“頁數(shù)”,接著我們將數(shù)據(jù)中的缺失值或空值刪除或替換為其他值。
2.處理缺失值與空值
#將'none'轉換為null
df = df.replace('None', np.nan)
#查看缺失值情況
print(df.isnull().sum())
#去除'ISBM'列
df = df.drop('ISBM', axis=1)
#去除指定列含有空值的行
df = df.dropna(subset=['作者','出版社','出版時間','頁數(shù)','價格','評分','評論數(shù)量'], how='any')
#重置索引
df = df.reset_index(drop=True)
#確認是否還有空值
df.isnull().sum()
3.出版時間清洗
觀察上述出版時間一列的數(shù)據(jù)可知,存在這許多不同的時間表達方式,但是為了之后對于時間的可視化描述,我們需要在這里對時間進行“歸一”化。
代碼如下:
df['出版時間']=df['出版時間'].str.replace(' ','')
for index,row in df.iterrows():
num=re.findall('\d+',row[3])
num=''.join(num)[0:4]
df.iloc[index,3]=num
# 將出版時間轉換為整數(shù)型
df.drop(df[df['出版時間'].str.len()!=4].index,axis=0,inplace=True)
df['出版時間']=df['出版時間'].astype(np.int32)
# 發(fā)現(xiàn)出版時間超出實際時間的數(shù)據(jù),將其清除
df.drop(df[df['出版時間']>2019].index,inplace=True)
?3.檢查頁數(shù)一列的數(shù)據(jù)情況
清洗“頁數(shù)”中存在亂碼/不規(guī)則/標點情況
代碼如下:
df['頁數(shù)'].str.contains('\.').value_counts()
# 規(guī)范頁數(shù)的格式,去除含有其他字符的數(shù)據(jù)比如‘.’
df['頁數(shù)']=df['頁數(shù)'].apply(lambda x:x.replace(',','').replace(' ',''))
df.drop(df[~(df['頁數(shù)'].str.isdecimal())].index,axis=0,inplace=True)
# 轉換頁數(shù)的格式
df['頁數(shù)']=df['頁數(shù)'].astype(np.int32)
df.drop((df[df['頁數(shù)']==0]).index,inplace=True) # 清除頁數(shù)為0的數(shù)據(jù)
4.對于評分,評論數(shù)量進行轉型操作
代碼如下:
# 轉換數(shù)據(jù)類型
df['評分']=df['評分'].astype(float)
df['評論數(shù)量']=df['評論數(shù)量'].astype(np.int32)
5.對于價格列的清洗
對于價格一列當中不是純數(shù)據(jù)類型的數(shù)據(jù)全部剔除
df['價格']=df['價格'].apply(lambda x:x.replace(',','').replace(' ',''))
for r_index,row in df.iterrows():
if row[5].replace('.','').isdecimal()==False:
df.drop(r_index,axis=0,inplace=True)
elif row[5][-1].isdecimal()==False:
df.drop(r_index,axis=0,inplace=True)
對于價格小于1的數(shù)據(jù)剔除
df.drop(df[df['價格']<1].index,inplace=True)
對于價格一列進行轉型操作,更方便于計算。
df['價格']=df['價格'].astype(float)
6.對于書名一列進行清洗
由于是漢語居多,所以我們此時只需清洗書名一樣的數(shù)據(jù)
代碼如下:
df['書名'].value_counts()
df['書名'].duplicated().value_counts()
# 按照評論數(shù)量排名,然后去重,以保證數(shù)據(jù)可靠性
df=df.sort_values(by='評論數(shù)量',ascending=False)
df.reset_index(drop=True,inplace=True)
# 對排序后的數(shù)據(jù)進行去重
df.drop_duplicates(subset='書名', keep='first',inplace=True)
df.reset_index(drop=True,inplace=True)
# 查看是否還有重復的數(shù)據(jù)
df['書名'].value_counts()
# 清理后的數(shù)據(jù)
df.to_excel(r'douban_book.xlsx',encoding='utf_8_sig')
輸出結果:
7.出版書籍評分最高的為哪一個?
#出版社評分最高計算:
# 先統(tǒng)計各出版社的出版作品數(shù)量
press=df['出版社'].value_counts()
press=pd.DataFrame(press)
press=press.reset_index().rename(columns={'index':'出版集團','出版社':'出版數(shù)量'})
# 將出版作品數(shù)量大于200的出版社名稱提取到列表中
lst=press[press['出版數(shù)量']>200]['出版集團'].tolist()
# 將列表中的出版社的作品平均分計算出來,并按照降序排序
press_rank=df[df['出版社'].isin(lst)].groupby(by='出版社',as_index=False).agg(
{'評分':np.mean}).sort_values(by='評分',ascending=False)
# 保存為excel
press_rank.to_excel(r'press_rank.xlsx', index=False, encoding='utf-8')
# print(press_rank)
# 打開xlsx文件
workbook = openpyxl.load_workbook('press_rank.xlsx')
# 選擇需要讀取數(shù)據(jù)的sheet
sheet = workbook['Sheet1']
# 讀取第二行第二列的數(shù)據(jù)
data1 = sheet.cell(row=2, column=1).value
data_list = []
for row in range(2, 7):
data = sheet.cell(row=row, column=1).value
data_list.append(data)
# 輸出讀取到的數(shù)據(jù)
print("出版社的書籍評分最高的為:",data1)
print("排名表已經(jīng)存于當前目錄下press_rank.xlsx中")
print("評分前五的出版社依次為:",data_list)
輸出結果:
????????
press_rank.xlsx:
?
8. 出版書籍最多的出版社是哪一個?
代碼如下:
df1=df[df['評論數(shù)量']>100]
# 再提取出評分大于等于8的作品
df1=df1[df1['評分']>=8]
# 將過濾后的的作品按作者進行統(tǒng)計
writer=df1['出版社'].value_counts()
writer=pd.DataFrame(writer)
writer.reset_index(inplace=True)
writer.rename(columns={'index':'出版社','出版社':'發(fā)表數(shù)量'},inplace=True)
writer.to_excel(r'chubanshe.xlsx', index=False, encoding='utf-8')
workbook = openpyxl.load_workbook('chubanshe.xlsx')
# 選擇需要讀取數(shù)據(jù)的sheet
sheet1 = workbook['Sheet1']
data2 = sheet1.cell(row=2, column=1).value
data3 = sheet1.cell(row=2, column=2).value
print("*************************************************************")
print("出版書籍最多的出版社為:",data2)
print("數(shù)量為:",data3)
print("剩余排名可查看當前目錄下chubanshe.xlsx")
輸出結果:
?chubanshe.xlsx:
?9.價格最高的出版社是哪一個?
代碼如下:
df = pd.read_excel('book_douban1.xlsx')
# 按照某一列進行排序
df_sorted = df.sort_values('價格', ascending=False)
# 將整體表格存入新的表格中
df_sorted.to_excel('price.xlsx', index=False)
workbook1 = openpyxl.load_workbook('price.xlsx')
# 選擇需要讀取數(shù)據(jù)的sheet
sheet2 = workbook1['Sheet1']
data5 = sheet2.cell(row=2, column=1).value
data7 = sheet2.cell(row=2, column=6).value
print("*************************************************************")
print("價格最高的出版社為:",data5)
print("價格為:",data7)
輸出結果:
三:可視化部分
這里將演示最簡單的柱形圖可視化,進階可視化圖將陸續(xù)更新。
對評分前 5名的出版社每年出版的圖書數(shù)量畫圖進行比較分析。
?代碼如下:
import openpyxl
from collections import Counter
import matplotlib.pyplot as plt
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['SimHei'] # 設置正常顯示中文標簽
rcParams['axes.unicode_minus'] = False # 解決負數(shù)坐標顯示問題
# 打開xlsx文件
wb = openpyxl.load_workbook('book_douban1.xlsx')
# 選擇第一個sheet
sheet = wb.active
# 定義函數(shù),用于生成柱狀圖
def bar_chart(title, publisher):
# 遍歷第三列,輸出包含publisher的行
lis = []
for row in sheet.iter_rows(min_row=2, min_col=3, values_only=True):
if publisher in row:
lis.append(row[1])
# 使用Counter類進行計數(shù)
counter = Counter(lis)
# 將計數(shù)結果轉換為兩個列表
x = list(counter.keys())
y = list(counter.values())
# 使用pyplot繪制柱狀圖
plt.bar(x, y)
# 添加圖表標題和坐標軸標簽
plt.title(title)
plt.xlabel('時間')
plt.ylabel('出版數(shù)量')
# 顯示圖表
plt.show()
# 調(diào)用函數(shù)生成各個出版社的柱狀圖
bar_chart('上海古籍出版社', ' 上海古籍出版社')
bar_chart('中華書局', ' 中華書局')
bar_chart('商務印書館', ' 商務印書館')
bar_chart('華東師范大學出版社', ' 華東師范大學出版社')
bar_chart('華夏出版社', ' 華夏出版社')
結果展示:
文章來源:http://www.zghlxwxcb.cn/news/detail-488444.html
?我采用最簡單易懂的方式來繪制此柱形圖,不會的朋友可以留言~文章來源地址http://www.zghlxwxcb.cn/news/detail-488444.html
到了這里,關于豆瓣圖書統(tǒng)計可視化分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!