首页 > 其他分享 >(12-3-06)动漫推荐系统:数据分析(6)

(12-3-06)动漫推荐系统:数据分析(6)

时间:2024-04-07 11:32:59浏览次数:23  
标签:数据分析 ... 12 06 0.0 top anime text data

12.4.9  动漫类型

(1)下面开始探索动漫数据集中的类型,首先将动漫数据集中的类型字段按逗号拆分,并通过explode函数将其展开为单独的行。接着,对拆分后的类型进行标题化处理。最后,统计并输出唯一类型的总数以及每个类型的出现次数。

top_anime_temp3 = top_anime[["genre"]]
top_anime_temp3["genre"] = top_anime_temp3["genre"].str.split(", | , | ,")
top_anime_temp3 = top_anime_temp3.explode("genre")
top_anime_temp3["genre"] = top_anime_temp3["genre"].str.title()

print(f'Total unique genres are {len(top_anime_temp3["genre"].unique())}')
print(f'Occurrences of unique genres:')
top_anime_temp3["genre"].value_counts().to_frame().T.style.set_properties(**{"background-color": "#2a9d8f","color":"white","border": "1.5px  solid black"})

执行后会输出唯一类型的总数以及每个类型的出现次数,如图12-21所示。

图12-21  唯一类型的总数以及每个类型的出现次数

(2)使用 WordCloud 库创建了一个词云图,展示了动漫数据集中类型的分布。词云图的背景色为黑色,使用 RdYlGn 颜色映射,最大字体大小为100。最后,通过调用 show() 方法展示生成的词云图。

# 导入必要的库
from wordcloud import WordCloud

# 创建 WordCloud 对象
wordcloud = WordCloud(width=800, height=250, background_color="black", colormap="RdYlGn",
                      max_font_size=100, stopwords=None, repeat=True).generate(top_anime["genre"].str.cat(sep=", | , | ,"))

# 绘制词云图
print("Let's explore how genre's wordcloud looks like\n")
plt.figure(figsize=(20, 8), facecolor="#ffd100")
plt.imshow(wordcloud)
plt.axis("off")
plt.margins(x=0, y=0)
plt.tight_layout(pad=0)
plt.show()

生成的词云图效果如图12-22所示。

图12-22  词云图效果

12.4.10  最终数据预处理

(1)通过如下代码进行了最终的数据预处理。首先,将用户评分中的值为-1的替换为NaN。接着,通过 dropna 函数删除包含NaN值的行。最后,输出处理后数据中的空值数量。

data = fulldata.copy()
data["user_rating"].replace(to_replace=-1, value=np.nan, inplace=True)
data = data.dropna(axis=0)
print("Null values after final pre-processing :")
data.isna().sum().to_frame().T.style.set_properties(**{"background-color": "#2a9d8f","color":"white","border": "1.5px  solid black"})

(2)下面的代码首先计算了每个用户的评分数量,并筛选出至少有50个评分的用户。然后,通过 pivot_table 函数创建了一个以动漫名称为行、用户ID为列、用户评分为值的数据透视表。空缺值被填充为0。

selected_users = data["user_id"].value_counts()
data = data[data["user_id"].isin(selected_users[selected_users >= 50].index)]

data_pivot_temp = data.pivot_table(index="name", columns="user_id", values="user_rating").fillna(0)
data_pivot_temp.head()

执行后会输出:

user_id	3	5	7	11	14	17	21	23	24	27	...	73495	73499	73500	73501	73502	73503	73504	73507	73510	73515
name																					
"0"	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
"Bungaku Shoujo" Kyou no Oyatsu: Hatsukoi	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	10.0	0.0	0.0	0.0	0.0	0.0
"Bungaku Shoujo" Memoire	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	6.0	0.0
"Bungaku Shoujo" Movie	0.0	0.0	0.0	0.0	8.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	10.0	0.0	0.0	0.0	0.0	0.0
"Eiji"	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0
5 rows × 32967 columns

(3)下面这段代码定义了一个 text_cleaning 函数,用于清理动漫名称中的一些特殊字符。然后,应用该函数清理了数据集中的动漫名称,并通过 pivot_table 函数创建了一个以动漫名称为行、用户ID为列、用户评分为值的数据透视表。

def text_cleaning(text):
    text = re.sub(r'"', '', text)
    text = re.sub(r'.hack//', '', text)
    text = re.sub(r''', '', text)
    text = re.sub(r'A's', '', text)
    text = re.sub(r'I'', 'I\'', text)
    text = re.sub(r'&', 'and', text)
    
    return text

data["name"] = data["name"].apply(text_cleaning)

data_pivot = data.pivot_table(index="name", columns="user_id", values="user_rating").fillna(0)
print("After Cleaning the anime names, let's see how it looks like.")
data_pivot.head()

执行后会输出:

user_id	3	5	7	11	14	17	21	23	24	27	...	73495	73499	73500	73501	73502	73503	73504	73507	73510	73515
name																					
0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
001	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
009 Re:Cyborg	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
009-1	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
009-1: RandB	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	...	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0	0.0
5 rows × 32967 columns

标签:数据分析,...,12,06,0.0,top,anime,text,data
From: https://blog.csdn.net/asd343442/article/details/137457490

相关文章

  • 【蚂蚁笔试题汇总】[全网首发] 2024-04-06-蚂蚁春招笔试题-三语言题解(CPP/Python/Jav
    ......
  • UVA1223 Editor 题解
    题目传送门前置知识后缀数组简介解法一个子串出现至少\(2\)次等价于有至少连续\(2\)个后缀以这个子串作为公共前缀。进行一次后缀排序后,有\(\max\limits_{i=1}^{|s|}\{height_{i}\}\)即为所求。代码#include<bits/stdc++.h>usingnamespacestd;#definelllong......
  • COCI2011-2012#3 ROBOT 题解
    洛谷题面部分分做法直接依照题意模拟即可。可以获得\(48\)分的好成绩。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;longlongn,m;structnode{ longlongx; longlongy;}point[100005];longlongrobotx=0,roboty=0;longlongquery(){......
  • 软件测试2024.04.06
    学习目标2024.04.06多张表查询(容易出面试题)1.掌握内连接2.掌握左连接和右连接3.掌握自关联与子查询一.连接查询当查询结构源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的结果返回。内连接:查询的结果只显示两个表中满足连接条件的部分。(交集)内连接语法1:s......
  • 基于51单片机智能电子秤称重压力检测阈值报警仪蓝牙设计20-412
    20-412、51单片机电子秤称重压力检测阈值报警仪系统+蓝牙上传设计产品功能描述:本系统由STC89C52单片机、LCD1602液晶显示、HX711称重传感器、蜂鸣器报警、按键、蓝牙模块及电源组成。1、LCD602液晶实时显示重量和设置阈值。2、按键可以设置报警阈值,阈值范围0-5000g,实际重量......
  • Google Chrome 123 All In One
    GoogleChrome123AllInOnedevtoolseasteregg/复活节彩蛋寻找复活节彩蛋为了庆祝今年的愚人节,开发者工具团队在开发者工具的某个地方隐藏了一颗复活节彩蛋。要想找到它,请寻找色彩缤纷的......
  • 手把手教你做阅读理解题-初中中考阅读理解解题技巧012-Instructions for Daily Use
    PDF格式公众号回复关键字:ZKYD012阅读理解技巧,在帮助读者有效获取和理解文本信息方面发挥着重要作用,熟练掌握如下6个技巧,可快速突破阅读理解1预览文章结构在开始深入阅读之前,快速浏览文章的标题、段落开头和结尾,可以迅速把握文章的主题、大致内容和结构标题通常能概括文章......
  • Debian 12 设置
    1、禁用休眠Debian12主机上线后只连接了电源和网线,为省去插拔键盘鼠标的麻烦,这里使用SSH登录主机,命令行操作。禁用休眠命令:sudosystemctlmasksleep.targetsuspend.targethibernate.targethybrid-sleep.target作者:帽帽里装佳佳https://www.bilibili.com/read/cv283774......
  • 【Web爬虫】爬⾍⿊⻰江省与四川省农机补贴以及数据分析
    目录一、实验目的二、实验内容2.1实验爬取数据选择2.2python代码爬取数据2.3数据处理与分析三、实验原理3.1python 连接网页的两种方式3.1.1使用requests连接网页3.1.2使用fromseleniumimportwebdriver连接网页,创建网页测试3.2python 获取网页内容的两种方......
  • 2024-04-06
    2024-04-06太空飞行计划问题最小割模型源点向实验连边,容量是收益仪器向汇点连边,容量是花费割掉一条边,代表放弃实验/购买仪器合法的情况就是源点汇点不连通,代表要么买了仪器,要么用到这台仪器的所有实验都放弃记录总收益为sum,最小割为res\(ans=sum-res\)(这题读入特别恶心......