@[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)

df.info()

二.数据清洗
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()

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)

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()

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)

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

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

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

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

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

三.数据分析与可视化
3.1各年作品出版数量折线图

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

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

; 3.4作者作品评分条形图

3.5作品评分树状图

Original: https://blog.csdn.net/m0_49263811/article/details/122220339
Author: CHRN晨
Title: 【Python数据分析实战】豆瓣读书分析(含代码和数据集)
相关阅读
Title: 【深度学习】3-从模型到学习的思路整理
前言
活动地址:CSDN21天学习挑战赛
🌍 python很适合机器学习领域,给大家推荐一款好用的刷题网站:《牛客网》
🌍 用来做一些练习快速熟悉基本语法非常的棒,而且题解也是非常的丰富🚀 个人主页:阿阿阿阿锋的主页_CSDN
🌊 本文整理了从模型,到损失,再到损失关于权值的梯度的一些思路
🔥 希望和大家一起加油,一起进步!

文章目录
; 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。学习一个多元函数,可以看成是分别学习多个一元的函数。


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,使函数关于 所有这些数据点的损失(或者说平均损失)不断变小。

; 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的值。
同样,如果梯度是负的,我们就要增大对应的权值。


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 前进的方向,有可能从整个的数据集中来看并不是恰当的方向。因此,我们把一个数据集划分成许多个小批量后,每个小批量都会使用,且会进行多轮(多个周期)的训练,以将整个数据集的特征都充分展现出来。

感谢阅读
Original: https://blog.csdn.net/m0_63238256/article/details/126345455
Author: 清风莫追
Title: 【深度学习】3-从模型到学习的思路整理
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/312702/
转载文章受原作者版权保护。转载请注明原作者出处!