【Python数据分析实战】豆瓣读书分析(含代码和数据集)

@[TOC]豆瓣

一.导入数据

数据集:
链接:douban.csv
提取码:pmls


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df=pd.read_csv(r'/PythonTest/Data/book_douban.csv',index_col=0)

df.head(10)
![在这里插入图片描述](https://img-blog.csdnimg.cn/eb27ca3a59a44089a587da9b2774fbf2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQ0hSTuaZqA==,size_20,color_FFFFFF,t_70,g_se,x_16)


df.info()

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

二.数据清洗


df=df.rename(columns={'数':'页数'})

df.reset_index(drop=True,inplace=True)

df.shape

df.describe()

2.1清理null值


df.replace('None',np.nan,inplace=True)

df.isnull().sum()

del df['ISBM']

df.dropna(axis=0,subset=['作者','出版社','出版时间','页数','价格','评分','评论数量'],
          how='any',inplace=True)

df.reset_index(drop=True,inplace=True)

df.isna().sum()

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

2.2清洗出版时间列

从数据集可以发现,发布时间有1999、1999、2012、2012、12、1923-4、2019年6月等多种数据格式,因此需要提取年份。

[En]

From the data set, it can be found that there are various data formats of publication time, such as 1999, 1999, 2012, 2012, 12, 1923-4, and June 2019, so it is necessary to extract the year.


import re
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

df.drop(df[df['出版时间'].str.len()!=4].index,axis=0,inplace=True)
df['出版时间']=df['出版时间'].astype(np.int32)

df.drop(df[df['出版时间']>2019].index,inplace=True)

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

2.3转换评分及平均数量的数据类型


df['评分']=df['评分'].astype(float)
df['评论数量']=df['评论数量'].astype(np.int32)

2.4清洗页数列


df['页数'].str.contains('\.').value_counts()

结果:
False 46173
True 7
Name: 页数, dtype: int64


df['页数']=df['页数'].apply(lambda x:x.replace(',','').replace(' ',''))
df.drop(df[~(df['页数'].str.isdecimal())].index,axis=0,inplace=True)

df['页数']=df['页数'].astype(np.int32)

df.drop((df[df['页数']==0]).index,inplace=True)

2.5清洗价格列


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)

df['价格']=df['价格'].astype(float)

df.drop(df[df['价格']<1].index,inplace=True)

2.6去除书名重复的数据


df['书名'].value_counts()

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

df['书名'].duplicated().value_counts()

结果:
False 42813
True 2073
Name: 书名, dtype: int64


df=df.sort_values(by='评论数量',ascending=False)
df.reset_index(drop=True,inplace=True)

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

df.drop_duplicates(subset='书名', keep='first',inplace=True)
df.reset_index(drop=True,inplace=True)

df['书名'].value_counts()

df.to_excel(r'/PythonTest/Data/douban_book.xls',encoding='utf_8_sig')
df

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

2.7哪个出版社的书籍评分较高?


press=df['出版社'].value_counts()
press=pd.DataFrame(press)
press=press.reset_index().rename(columns={'index':'出版集团','出版社':'出版数量'})
press

lst=press[press['出版数量']>200]['出版集团'].tolist()

press_rank=df[df['出版社'].isin(lst)].groupby(by='出版社',as_index=False).agg(
    {'评分':np.mean}).sort_values(by='评分',ascending=False)

press_rank.to_excel(r'/PythonTest/Data/press_rank.xls',encoding='utf_8_sig')
press_rank

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

2.8哪些书值得一读?


sor=df[df['评论数量']>50000].sort_values(by='评分',ascending=False)
sor

df['评分'].mean()

sor.eval('加权总分=(((评论数量/(评论数量+50000))*评分)+(50000/(评论数量+50000)))',inplace=True)
book_rank=sor.sort_values(by='加权总分',ascending=False).reset_index(drop=True).head(20)

book_rank.to_excel(r'/PythonTest/Data/book_rank.xls',encoding='utf_8_sig')
book_rank

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

2.9作者排名(10部作品及以上)


df1=df[df['评论数量']>100]

df1=df1[df1['评分']>=8]

writer=df1['作者'].value_counts()
writer=pd.DataFrame(writer)
writer.reset_index(inplace=True)
writer.rename(columns={'index':'作家','作者':'作品数量'},inplace=True)
writer

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

lst1=writer[writer['作品数量']>=10]['作家'].tolist()

writer_rank=df1[df1['作者'].isin(lst1)].groupby(by='作者',as_index=False).agg(
    {'评分':np.mean}).sort_values(by='评分',ascending=False).reset_index(drop=True).head(20)

writer_rank.to_excel(r'/PythonTest/Data/writer_rank.xls',encoding='utf_8_sig')
writer_rank

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

三.数据分析与可视化

3.1各年作品出版数量折线图

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

; 3.2各价位作品数量直方图

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

3.3各出版社出版作品数量条形图&评分折线图

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

; 3.4作者作品评分条形图

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

3.5作品评分树状图

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

Original: https://blog.csdn.net/m0_49263811/article/details/122220339
Author: CHRN晨
Title: 【Python数据分析实战】豆瓣读书分析(含代码和数据集)



相关阅读

Title: 【深度学习】3-从模型到学习的思路整理

前言

活动地址:CSDN21天学习挑战赛

🌍 python很适合机器学习领域,给大家推荐一款好用的刷题网站:《牛客网
🌍 用来做一些练习快速熟悉基本语法非常的棒,而且题解也是非常的丰富

🚀 个人主页:阿阿阿阿锋的主页_CSDN
🌊 本文整理了从模型,到损失,再到损失关于权值的梯度的一些思路
🔥 希望和大家一起加油,一起进步!

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

文章目录

; 1. 模型

神经网络的模型可以就看作为一个函数,模型学习(训练)的过程,就可以看成是给函数寻找合适的参数的过程。比如,下面就是一个简单的模型,它所表示的函数就是 y = w 1 x 1 + w 2 x 2 y = w1x1+w2x2 y =w 1 x 1 +w 2 x 2

这个函数在两个侧面的投影,就是 y = w 1 x 1 y=w1x1 y =w 1 x 1 和 y = w 2 x 2 y=w2x2 y =w 2 x 2。学习一个多元函数,可以看成是分别学习多个一元的函数。

【Python数据分析实战】豆瓣读书分析(含代码和数据集)【Python数据分析实战】豆瓣读书分析(含代码和数据集)

2. 损失

损失,也就是模型和数据的 不贴合程度
衡量损失常用的一个函数是 均方损失函数:l o s s = ∑ i = 1 n ( y i ^ − y i ) 2 loss=\displaystyle\sum_{i=1}^n(\hat{y_{i}}-y_{i})^2 l o s s =i =1 ∑n ​(y i ​^​−y i ​)2,其中 n 为数据点数量。
函数也可以写成 l o s s = ∑ i = 1 n ( W X i − y i ) 2 loss=\displaystyle\sum_{i=1}^n(WX_{i}-y_{i})^2 l o s s =i =1 ∑n ​(W X i ​−y i ​)2,其中 W 为模型的所有权值,X i X_{i}X i ​ 为第 i 个数据点的所有自变量。

既然衡量损失有了一个确定的函数,那训练模型的过程就可以变成一个 最小化损失的过程,方法就是不断地改变权值W,使函数关于 所有这些数据点的损失(或者说平均损失)不断变小。

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

; 3. 损失loss关于权值W的梯度

通常来说,应该函数的权值 W 是固定的,而数据的特征 X 作为自变量。但我们是要通过一个固有的数据集,来优化权值W,所以在优化过程中,我们要把损失函数l o s s loss l o s s中的 W看作自变量

然后我们求 l o s s loss l o s s 关于 W W W 的梯度,遵循着梯度的指引来改变 W W W。

如果某个权值的梯度是正的,说明随着权值w w w的增大,损失l o s s loss l o s s也会增大。那我们为了让损失变小,就要减小w w w的值。
同样,如果梯度是负的,我们就要增大对应的权值。

【Python数据分析实战】豆瓣读书分析(含代码和数据集)【Python数据分析实战】豆瓣读书分析(含代码和数据集)

W W W 中的每个 w w w 的移动,可以看成是相对独立、互不干扰的。更新一个有很多权值的复杂模型,就成了很多重复的这样更新单个权值的操作。

4. 求梯度——数值梯度

在具体求梯度的过程中,计算机本身是不会公式演算的。但我们并不需要对损失函数求出梯度的表达式,而只需求函数在每个 权值w w w处的梯度值。

数值梯度的方法,就人为地设置了一个确定的微小值 h h h,比如 1 0 − 5 10^{-5}1 0 −5(具体根据实际需要)。
l o s s g = l o s s ( w + h ) − l o s s ( w − h ) 2 h loss_ g = {loss(w+h)-loss(w-h) \over 2h}l o s s g ​=2 h l o s s (w +h )−l o s s (w −h )​

因此,我们更新 w w w 的方式,就像是先试探着往一个方向走一小步,如果发现合适,就再往那个方向走一大步;否则,就往反方向走。

5. 梯度下降中的小批量

小批量随机梯度下降法是机器学习中一种常用的方法,为什么要用到小批量?

前面每次计算损失,都是计算模型函数关于整个样本数据集的损失。那么在样本数据很大时,比如十万、百万的数据量时,这样计算资源的消耗就太大了,而且是 不必要的。

使用小批量,就是起到部分代表整体的作用。我们假装一个小批量,就体现着整个数据集的特征。然而这难免有些 片面性,通过小批量所指引的 w w w 前进的方向,有可能从整个的数据集中来看并不是恰当的方向。因此,我们把一个数据集划分成许多个小批量后,每个小批量都会使用,且会进行多轮(多个周期)的训练,以将整个数据集的特征都充分展现出来。

【Python数据分析实战】豆瓣读书分析(含代码和数据集)

感谢阅读

Original: https://blog.csdn.net/m0_63238256/article/details/126345455
Author: 清风莫追
Title: 【深度学习】3-从模型到学习的思路整理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/312702/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总