date=str(time.localtime().tm_mon)+'_'+str(time.localtime().tm_mday) withopen(r'bangumi\subjectlist_'+date+'.json','w') as fp: json.dump(subjectlist,fp)
defbangumifulldownload(bgmsubjects): for i in bgmsubjects: url='https://bangumi.tv/subject/'+i print('downloading subject '+i) try_time=0 while try_time<=5: try: r=ur.Request(url=url,headers=headers) response=opener.open(r,timeout=30) break except Exception as e: try_time+=1 if try_time>2: headers['Cookie']=update_cookie(headers['Cookie']) print('retrying with cookie=',headers['Cookie'][headers['Cookie'].rfind('utmb='):],try_time) else: raise Exception('Download Failed!!') content=str(gzip.decompress(response.read()),'utf-8') response.close()
soup=bs(content) mainWrapper=soup.find('div',class_='mainWrapper') name=soup.find('h1',class_='nameSingle') if mainWrapper==Noneor name==None: continue infobox=mainWrapper.find('ul',id='infobox') if infobox==None: continue infodict=dict() infodict.update({'subject':i,'原名':name.find('a').text if name.find('a')!=Noneelse'', '类型':name.find('small').text if name.find('small')!=Noneelse''}) summary=mainWrapper.find('div',id='subject_summary') if summary isnotNone: infodict.update({'简介':summary.text})
pic=mainWrapper.find('a',class_='thickbox cover') if pic isnotNone: pic=re.findall(picpattern,str(pic)) iflen(pic): infodict.update({'封面':'https://'+pic[0]}) info=infobox.find_all('li') for each_info in info: kv=each_info.text.split(':',maxsplit=1) infodict.update({kv[0].strip():kv[1].strip()}) tagWrapper=mainWrapper.find('div',class_='inner') if tagWrapper==None: continue tagtext=tagWrapper.select('.l span,a small') tags=[] for everytag in tagtext: tags.append(everytag.text) tags=' '.join(tags) infodict.update({'tags':tags}) chartWrapper=mainWrapper.find('div',id='ChartWarpper') infodict.update({'votes':chartWrapper.find('span',property='v:votes').text}) rating_list=[] for each_rater in chartWrapper.find_all('span',{'class':'count'}): rating_list.append(each_rater.text[1:-1]) infodict.update({'ratings':rating_list}) overall_score=0 overall_vote=0 for score inrange(10,0,-1): overall_vote+=int(infodict['ratings'][10-score]) overall_score+=score*int(infodict['ratings'][10-score]) overall_score=overall_score/overall_vote infodict.update({'rating':str('%.3f'%(overall_score))}) print(infodict) bgmdb.append(infodict)
bangumifulldownload(subjectlist)
date=str(time.localtime().tm_mon)+'_'+str(time.localtime().tm_mday) withopen(r'bangumi\bgmdb_'+date+'.json','w') as fp: json.dump(bgmdb,fp)
bgmdb2=[] for i in bgmdb: thisanime=[] for each_key in indexs: if each_key in i.keys(): thisanime.append(i[each_key]) else: thisanime.append('') bgmdb2.append(thisanime)
for each_item in bilidb2: summary=summary_dict.get(str(each_item['media_id'])) each_item.update({'简介':summary if summary isnotNoneelse''})
date=str(time.localtime().tm_mon)+'_'+str(time.localtime().tm_mday) withopen(r'bilibili\sslist_'+date+'.json','w') as fp: json.dump(sslist,fp) withopen(r'bilibili\mdlist_'+date+'.json','w') as fp: json.dump(mdlist,fp) withopen(r'bilibili\bilidb_'+date+'.json','w') as fp: json.dump(bilidb2,fp)
import numpy as np import pandas as pd from scipy import stats import matplotlib.pyplot as plt import time import os from bs4 import BeautifulSoup as bs import urllib.request as ur import urllib.parse as up import urllib.error as ue import http.cookiejar as hc
for i inrange(len(bgmdb['日期'])): if bgmdb['日期'][i] is pd.NaT: bgmdb.loc[i,'日期']=bgmdb.loc[i,'日期2'] bgmdb.drop('日期2',axis=1,inplace=True)
bgmdb['年度']=0 for i inrange(len(bgmdb)): bgmdb.loc[i,'年度']=bgmdb.loc[i,'日期'].year if bgmdb.loc[i,'日期'] isnot pd.NaT else0 bgmdb[['放送开始','上映年度','日期','年度']].head(10)
放送开始
上映年度
日期
年度
0
1998年10月23日
NaN
1998-10-23
1998
1
2004年1月1日
NaN
2004-01-01
2004
2
2002年10月1日
NaN
2002-10-01
2002
3
2008年10月2日
NaN
2008-10-02
2008
4
1995年10月4日
NaN
1995-10-04
1995
5
NaN
1995年11月18日
1995-11-18
1995
6
NaN
1997年7月19日
1997-07-19
1997
7
NaN
NaN
NaT
0
8
2009年4月5日
NaN
2009-04-05
2009
9
2017年10月14日
NaN
2017-10-14
2017
4.2.2 bilibili评分缺失值处理
需要将评分人数不足的作品的评分及评分人数从0改为nan,以便后面进行剔除:
1 2
bilidb.rating=bilidb.rating.apply(lambda x: np.nan if x==0else x) bilidb.raters=bilidb.raters.apply(lambda x: np.nan if x==0else x)
studio_dict={} for each_studio in studios: studio_dict.update({str(each_studio): bgmdb['动画制作'].dropna()[ bgmdb['动画制作'].dropna().str.contains(each_studio) ].count()})
a=bgmdb[bgmdb.['年度']==2000].sort_values(by='votes',ascending=False).loc[:,'中文名'][:5].values a.resize(5,1) for i inrange(2001,2020): b=bgmdb[bgmdb.['年度']==i].sort_values(by='votes',ascending=False).loc[:,'中文名'][:5].values b.resize(5,1) a=np.concatenate([a,b],axis=1)
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
热度第1名
犬夜叉
千与千寻
攻壳机动队 STAND ALONE COMPLEX
钢之炼金术师
混沌武士
NaN
Code Geass 反叛的鲁路修
CLANNAD
NaN
化物语
NaN
魔法少女小圆
冰菓
进击的巨人
白箱
吹响!悠风号
你的名字。
小林家的龙女仆
紫罗兰永恒花园
辉夜大小姐想让我告白~天才们的恋爱头脑战~
热度第2名
名侦探柯南 瞳孔中的暗杀者
棋魂
全金属狂潮
全金属狂潮 校园篇
哈尔的移动城堡
虫师
凉宫春日的忧郁
秒速5厘米
龙与虎
钢之炼金术师 FULLMETAL ALCHEMIST
凉宫春日的消失
命运石之门
刀剑神域
我的青春恋爱物语果然有问题
月刊少女野崎君
一拳超人
Re:从零开始的异世界生活
来自深渊
青春笨蛋少年不做兔女郎学姐的梦
进击的巨人 第三季 Part.2
热度第3名
魔卡少女樱 被封印的卡片
星际牛仔 天国之扉
火影忍者
东京教父
攻壳机动队 S.A.C. 2nd GIG
灼眼的夏娜
死亡笔记
幸运星
Code Geass 反叛的鲁路修R2
轻音少女
无头骑士异闻录
NaN
男子高中生的日常
某科学的超电磁炮S
Fate/stay night [Unlimited Blade Works]
Fate/stay night [Unlimited Blade Works] 第二季
为美好的世界献上祝福!
情色漫画老师
比宇宙更远的地方
鬼灭之刃
热度第4名
游戏王-怪兽之决斗
名侦探柯南 通往天国的倒数计时
名侦探柯南 贝克街的亡灵
名侦探柯南 迷宫的十字路口
妖精的旋律
搞笑漫画日和
银魂
福音战士新剧场版:序
魔法禁书目录
某科学的超电磁炮
我的妹妹哪有这么可爱!
我们仍未知道那天所看见的花的名字。
中二病也要谈恋爱!
斩服少女
NO GAME NO LIFE 游戏人生
路人女主的养成方法
甲铁城的卡巴内利
少女终末旅行
DARLING in the FRANXX
灵能百分百 第二季
热度第5名
吸血鬼猎人D:妖杀行
热带雨林的爆笑生活
人形电脑天使心
奇诺之旅
攻壳机动队2 无罪
蜂蜜与四叶草
NaN
永生之酒
夏目友人帐
凉宫春日的忧郁 2009
轻音少女 第二季
日常
心理测量者
打工吧!魔王大人
四月是你的谎言
我的青春恋爱物语果然有问题 续
灵能百分百
进击的巨人 第二季
佐贺偶像是传奇
约定的梦幻岛
高分作品
1 2 3 4 5 6 7
a=bgmdb[bgmdb['年度']==2000].sort_values(by='rating',ascending=False).loc[:,'中文名'][:5].values a.resize(5,1) for i inrange(2001,2020): b=bgmdb[bgmdb['年度']==i].sort_values(by='rating',ascending=False).loc[:,'中文名'][:5].values b.resize(5,1) a=np.concatenate([a,b],axis=1) pd.DataFrame(data=a,index=['评分第%d名'%i for i inrange(1,6)],columns=range(2000,2020))
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
评分第1名
第一神拳
千与千寻
攻壳机动队 STAND ALONE COMPLEX
百变之星
攻壳机动队 S.A.C. 2nd GIG
虫师
银魂
天元突破 红莲螺岩
NaN
钢之炼金术师 FULLMETAL ALCHEMIST
凉宫春日的消失
银魂'
银魂' 延长战
歌牌情缘2
白箱
水星领航员 The AVVENIRE
排球少年 乌野高校 VS 白鸟泽学园高校
3月的狮子 第二季
莉兹与青鸟
进击的巨人 第三季 Part.2
评分第2名
吸血鬼猎人D:妖杀行
星际牛仔 天国之扉
小魔女DoReMi 大合奏
钢之炼金术师
攻壳机动队2 无罪
蜂蜜与四叶草
蜂蜜与四叶草II
CLANNAD
水星领航员 第三季
福音战士新剧场版:破
四叠半神话大系
命运石之门
爆漫王。3
剧场版 魔法少女小圆 剧场版 [新篇] 叛逆的物语
虫师 续章 第2期
少女与战车 剧场版
3月的狮子
昭和元禄落语心中 -助六再临篇-
强风吹拂
瑞克和莫蒂 第四季
评分第3名
游戏王-怪兽之决斗
棋魂
十二国记
星空清理者
混沌武士
哆啦A梦
盗梦侦探
福音战士新剧场版:序
攻壳机动队2.0
化物语
Heart Catch 光之美少女!
魔法少女小圆
来自新世界
小马驹G4 第四季
虫师 续章
排球少年 第二季
吹响!悠风号 第二季
来自深渊
比宇宙更远的地方
高分少女 第二季
评分第4名
小魔女DoReMi ♯
蜡笔小新 呼风唤雨!大人帝国的反击
萩萩公主
东京教父
怪物
水星领航员
死亡笔记
物怪
剧场版 空之境界 第五章 矛盾螺旋
天元突破红莲螺岩 螺岩篇
王牌投手 振臂高挥~夏日大会篇~
日常
JOJO的奇妙冒险
辉夜姬物语
乒乓
JOJO的奇妙冒险 星尘斗士 埃及篇
昭和元禄落语心中
春宵苦短,少女前进吧!
摇曳露营△
海盗战记
评分第5名
魔卡少女樱 被封印的卡片
大~集合!小魔女DoReMi
阿滋漫画大王
全金属狂潮 校园篇
飞跃巅峰2!
交响诗篇
攻壳机动队 S.A.C. Solid State Society
永生之酒
Code Geass 反叛的鲁路修R2
剧场版 空之境界 第七章 杀人考察(后)
小马驹G4 第一季
夏目友人帐 参
冰菓
宇宙战舰大和号2199
怪诞小镇 第二季
虫师 续章 铃之雫
你的名字。
终物语(下)
JOJO的奇妙冒险 黄金之风
灵能百分百 第二季
各年度动画作品进入排行榜前100的数量
1 2 3 4 5 6 7 8 9 10 11 12 13 14
bgmdb_by_year=bgmdb.groupby(by='年度') defcount_rank(x): count=0 for i in x: if i<100: count+=1 return count TOP100_by_year=bgmdb_by_year.bgmrank.apply(count_rank)[-21:-1] print(TOP100_by_year)
TOP10=pd.DataFrame(data=[ bgmdb[bgmdb['年度']==i].sort_values( by='rating',ascending=False).loc[:,'rating'][:10].mean() for i inrange(2000,2020) ],columns=['TOP10均分'],index=range(2000,2020))
for i inrange(0,len(bgmdb)): res=[] print('item',i,'searching',bgmdb['原名'][i]) querystring={'keyword':bgmdb['原名'][i]} querystring=up.urlencode(querystring) final_url=url+querystring
interface3=list() for k,v in interface2.items(): bgm=bgmdb.loc[bgmdb.subject==k,['年度','subject','原名','中文名','别名','日期']].values[0] bili=[bilidb.loc[bilidb.media_id==each_bilimd,['year','media_id','title','date']].values for each_bilimd in v] bili=[each_bilimd[0] for each_bilimd in bili iflen(each_bilimd)] interface3.append({'bgm':bgm,'bili':bili})
matched=[] for searchres in interface3: bgm=searchres['bgm'] bili=searchres['bili'] for bilimd in bili: for bgmname in bgm[2:5]: if bilimd[2]==bgmname and bilimd[0]==bgm[0]: matched.append({'subject':bgm[1],'md':bilimd[1]})
import copy fullymatched=copy.deepcopy(matched)
然后,寻找名称不同但开播日期相同的作品,进行人工匹配,结果保存在manuallymatched中:
1 2 3 4 5 6 7 8
matched=[] for searchres in interface3: bgm=searchres['bgm'] bili=searchres['bili'] for bilimd in bili: if bilimd[2] notin bgm and (bilimd[3] isnot pd.NaT and bilimd[3]==bgm[5]): matched.append({'bgm':bgm[:-1],'bili':bilimd[:-1]}) ...
db['bgmrating_2digit']=db['bgmrating'].copy() db['bgmrating_2digit']=db['bgmrating_2digit'].apply(lambda x : ((x*10)//1)/10) bb=pd.crosstab(index=db['bgmrating_2digit'],columns=db['bilirating'])
bb.iloc[20:,40:]
bilirating
8.4
8.5
8.6
8.7
8.8
8.9
9.0
9.1
9.2
9.3
9.4
9.5
9.6
9.7
9.8
9.9
bgmrating_2digit
5.4
1
0
0
0
1
0
0
2
1
1
0
0
0
1
0
0
5.5
1
1
1
2
0
2
2
0
0
1
1
0
1
0
0
0
5.6
1
0
1
2
1
0
0
1
0
0
0
1
0
1
0
0
5.7
2
2
1
1
2
1
2
0
0
2
0
2
1
0
0
0
5.8
0
4
2
1
0
0
2
1
2
1
2
1
1
0
0
0
5.9
0
1
0
2
2
2
2
2
2
2
1
0
0
0
0
0
6.0
1
1
2
2
2
4
2
4
1
6
0
1
1
0
0
0
6.1
1
1
3
2
3
1
3
5
3
2
6
5
1
0
0
0
6.2
0
1
1
5
1
4
7
4
5
5
4
4
5
0
0
0
6.3
1
0
1
0
4
2
5
4
7
3
5
6
5
2
1
0
6.4
0
1
1
0
0
1
7
1
8
2
5
4
4
1
0
0
6.5
0
1
1
2
1
2
1
5
10
7
14
7
4
6
0
0
6.6
0
0
1
1
1
4
3
3
7
11
10
7
13
5
1
0
6.7
0
0
0
0
2
0
0
2
2
5
6
11
13
5
1
0
6.8
0
0
0
0
2
1
1
3
4
3
8
9
4
7
4
0
6.9
1
0
0
0
1
1
0
2
3
3
6
10
3
13
6
0
7.0
0
0
1
0
1
1
0
1
3
5
7
6
13
21
3
0
7.1
0
0
0
0
0
1
0
2
1
4
8
3
10
11
8
1
7.2
1
0
0
0
0
1
0
1
3
5
7
16
13
13
8
0
7.3
0
0
0
1
0
0
1
1
1
2
4
10
10
15
7
1
7.4
0
0
0
1
0
0
0
1
1
2
5
2
12
17
10
0
7.5
0
0
0
0
0
0
0
1
2
0
2
4
10
11
9
0
7.6
0
0
0
0
0
0
1
0
1
2
3
0
5
15
7
2
7.7
0
0
0
0
0
1
0
0
0
0
3
4
2
10
10
0
7.8
0
0
0
0
0
0
0
0
0
1
0
5
3
9
10
2
7.9
0
0
0
0
0
0
0
0
1
0
0
3
1
10
7
3
8.0
0
0
0
0
0
0
0
0
0
2
0
1
0
5
10
1
8.1
0
0
0
0
0
0
0
0
0
0
0
0
1
2
5
0
8.2
0
0
0
0
0
0
0
0
0
0
0
0
2
6
8
2
8.3
0
1
0
0
0
0
0
0
0
0
0
2
1
0
1
1
8.4
0
0
0
0
0
0
0
0
0
0
0
1
0
0
4
0
8.5
0
0
0
0
0
0
0
0
0
0
0
0
0
2
0
0
8.6
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
8.7
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
8.8
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
9.0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
9.1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
接着对每一个点分别作图,实现气泡图的效果:
1 2 3 4 5 6 7 8
fig=plt.figure(num=106,figsize=(8,4),dpi=200,facecolor='white') ax=fig.gca() for eachbgmrating in bb.index.tolist(): for eachbilirating in bb.columns.tolist(): ax.scatter(eachbgmrating,eachbilirating, s=bb.loc[eachbgmrating,eachbilirating]**1.1, marker='.',c='red') ax.set(title='两站评分关系图',xlabel='bangumi',ylabel='bilibili')
bgm_ninki=[ bgmdb[bgmdb.rating>=bgmdb.rating.quantile(i)].votes.mean()/ bgmdb[bgmdb.rating<=bgmdb.rating.quantile(1-i)].votes.mean() for i in np.linspace(0.5,1,51) ] bili_ninki=[ bilidb[bilidb.rating>=bilidb.rating.quantile(i)].raters.mean()/ bilidb[bilidb.rating<=bilidb.rating.quantile(1-i)].raters.mean() for i in np.linspace(0.5,1,51) ]
date=str(time.localtime().tm_mon)+'_'+str(time.localtime().tm_mday) withopen(r'bangumi\subjectlist_'+date+'.json','w') as fp: json.dump(subjectlist,fp)
defbangumifulldownload(bgmsubjects): for i in bgmsubjects: url='https://bangumi.tv/subject/'+i print('downloading subject '+i) try_time=0 while try_time<=5: try: r=ur.Request(url=url,headers=headers) response=opener.open(r,timeout=30) break except Exception as e: try_time+=1 if try_time>2: headers['Cookie']=update_cookie(headers['Cookie']) print('retrying with cookie=',headers['Cookie'][headers['Cookie'].rfind('utmb='):],try_time) else: raise Exception('Download Failed!!') content=str(gzip.decompress(response.read()),'utf-8') response.close()
soup=bs(content) mainWrapper=soup.find('div',class_='mainWrapper') name=soup.find('h1',class_='nameSingle') if mainWrapper==Noneor name==None: continue infobox=mainWrapper.find('ul',id='infobox') if infobox==None: continue infodict=dict() infodict.update({'subject':i,'原名':name.find('a').text if name.find('a')!=Noneelse'', '类型':name.find('small').text if name.find('small')!=Noneelse''}) summary=mainWrapper.find('div',id='subject_summary') if summary isnotNone: infodict.update({'简介':summary.text})
pic=mainWrapper.find('a',class_='thickbox cover') if pic isnotNone: pic=re.findall(picpattern,str(pic)) iflen(pic): infodict.update({'封面':'https://'+pic[0]}) info=infobox.find_all('li') for each_info in info: kv=each_info.text.split(':',maxsplit=1) infodict.update({kv[0].strip():kv[1].strip()}) tagWrapper=mainWrapper.find('div',class_='inner') if tagWrapper==None: continue tagtext=tagWrapper.select('.l span,a small') tags=[] for everytag in tagtext: tags.append(everytag.text) tags=' '.join(tags) infodict.update({'tags':tags}) chartWrapper=mainWrapper.find('div',id='ChartWarpper') infodict.update({'votes':chartWrapper.find('span',property='v:votes').text}) rating_list=[] for each_rater in chartWrapper.find_all('span',{'class':'count'}): rating_list.append(each_rater.text[1:-1]) infodict.update({'ratings':rating_list}) overall_score=0 overall_vote=0 for score inrange(10,0,-1): overall_vote+=int(infodict['ratings'][10-score]) overall_score+=score*int(infodict['ratings'][10-score]) overall_score=overall_score/overall_vote infodict.update({'rating':str('%.3f'%(overall_score))}) print(infodict) bgmdb.append(infodict)
bangumifulldownload(subjectlist)
date=str(time.localtime().tm_mon)+'_'+str(time.localtime().tm_mday) withopen(r'bangumi\bgmdb_'+date+'.json','w') as fp: json.dump(bgmdb,fp)
bgmdb2=[] for i in bgmdb: thisanime=[] for each_key in indexs: if each_key in i.keys(): thisanime.append(i[each_key]) else: thisanime.append('') bgmdb2.append(thisanime)
for each_item in bilidb2: summary=summary_dict.get(str(each_item['media_id'])) each_item.update({'简介':summary if summary isnotNoneelse''})
date=str(time.localtime().tm_mon)+'_'+str(time.localtime().tm_mday) withopen(r'bilibili\sslist_'+date+'.json','w') as fp: json.dump(sslist,fp) withopen(r'bilibili\mdlist_'+date+'.json','w') as fp: json.dump(mdlist,fp) withopen(r'bilibili\bilidb_'+date+'.json','w') as fp: json.dump(bilidb2,fp)
import numpy as np import pandas as pd from scipy import stats import matplotlib.pyplot as plt import time import os from bs4 import BeautifulSoup as bs import urllib.request as ur import urllib.parse as up import urllib.error as ue import http.cookiejar as hc
for i inrange(len(bgmdb['日期'])): if bgmdb['日期'][i] is pd.NaT: bgmdb.loc[i,'日期']=bgmdb.loc[i,'日期2'] bgmdb.drop('日期2',axis=1,inplace=True)
bgmdb['年度']=0 for i inrange(len(bgmdb)): bgmdb.loc[i,'年度']=bgmdb.loc[i,'日期'].year if bgmdb.loc[i,'日期'] isnot pd.NaT else0 bgmdb[['放送开始','上映年度','日期','年度']].head(10)
放送开始
上映年度
日期
年度
0
1998年10月23日
NaN
1998-10-23
1998
1
2004年1月1日
NaN
2004-01-01
2004
2
2002年10月1日
NaN
2002-10-01
2002
3
2008年10月2日
NaN
2008-10-02
2008
4
1995年10月4日
NaN
1995-10-04
1995
5
NaN
1995年11月18日
1995-11-18
1995
6
NaN
1997年7月19日
1997-07-19
1997
7
NaN
NaN
NaT
0
8
2009年4月5日
NaN
2009-04-05
2009
9
2017年10月14日
NaN
2017-10-14
2017
4.2.2 bilibili评分缺失值处理
需要将评分人数不足的作品的评分及评分人数从0改为nan,以便后面进行剔除:
1 2
bilidb.rating=bilidb.rating.apply(lambda x: np.nan if x==0else x) bilidb.raters=bilidb.raters.apply(lambda x: np.nan if x==0else x)
studio_dict={} for each_studio in studios: studio_dict.update({str(each_studio): bgmdb['动画制作'].dropna()[ bgmdb['动画制作'].dropna().str.contains(each_studio) ].count()})
a=bgmdb[bgmdb.['年度']==2000].sort_values(by='votes',ascending=False).loc[:,'中文名'][:5].values a.resize(5,1) for i inrange(2001,2020): b=bgmdb[bgmdb.['年度']==i].sort_values(by='votes',ascending=False).loc[:,'中文名'][:5].values b.resize(5,1) a=np.concatenate([a,b],axis=1)
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
热度第1名
犬夜叉
千与千寻
攻壳机动队 STAND ALONE COMPLEX
钢之炼金术师
混沌武士
NaN
Code Geass 反叛的鲁路修
CLANNAD
NaN
化物语
NaN
魔法少女小圆
冰菓
进击的巨人
白箱
吹响!悠风号
你的名字。
小林家的龙女仆
紫罗兰永恒花园
辉夜大小姐想让我告白~天才们的恋爱头脑战~
热度第2名
名侦探柯南 瞳孔中的暗杀者
棋魂
全金属狂潮
全金属狂潮 校园篇
哈尔的移动城堡
虫师
凉宫春日的忧郁
秒速5厘米
龙与虎
钢之炼金术师 FULLMETAL ALCHEMIST
凉宫春日的消失
命运石之门
刀剑神域
我的青春恋爱物语果然有问题
月刊少女野崎君
一拳超人
Re:从零开始的异世界生活
来自深渊
青春笨蛋少年不做兔女郎学姐的梦
进击的巨人 第三季 Part.2
热度第3名
魔卡少女樱 被封印的卡片
星际牛仔 天国之扉
火影忍者
东京教父
攻壳机动队 S.A.C. 2nd GIG
灼眼的夏娜
死亡笔记
幸运星
Code Geass 反叛的鲁路修R2
轻音少女
无头骑士异闻录
NaN
男子高中生的日常
某科学的超电磁炮S
Fate/stay night [Unlimited Blade Works]
Fate/stay night [Unlimited Blade Works] 第二季
为美好的世界献上祝福!
情色漫画老师
比宇宙更远的地方
鬼灭之刃
热度第4名
游戏王-怪兽之决斗
名侦探柯南 通往天国的倒数计时
名侦探柯南 贝克街的亡灵
名侦探柯南 迷宫的十字路口
妖精的旋律
搞笑漫画日和
银魂
福音战士新剧场版:序
魔法禁书目录
某科学的超电磁炮
我的妹妹哪有这么可爱!
我们仍未知道那天所看见的花的名字。
中二病也要谈恋爱!
斩服少女
NO GAME NO LIFE 游戏人生
路人女主的养成方法
甲铁城的卡巴内利
少女终末旅行
DARLING in the FRANXX
灵能百分百 第二季
热度第5名
吸血鬼猎人D:妖杀行
热带雨林的爆笑生活
人形电脑天使心
奇诺之旅
攻壳机动队2 无罪
蜂蜜与四叶草
NaN
永生之酒
夏目友人帐
凉宫春日的忧郁 2009
轻音少女 第二季
日常
心理测量者
打工吧!魔王大人
四月是你的谎言
我的青春恋爱物语果然有问题 续
灵能百分百
进击的巨人 第二季
佐贺偶像是传奇
约定的梦幻岛
高分作品
1 2 3 4 5 6 7
a=bgmdb[bgmdb['年度']==2000].sort_values(by='rating',ascending=False).loc[:,'中文名'][:5].values a.resize(5,1) for i inrange(2001,2020): b=bgmdb[bgmdb['年度']==i].sort_values(by='rating',ascending=False).loc[:,'中文名'][:5].values b.resize(5,1) a=np.concatenate([a,b],axis=1) pd.DataFrame(data=a,index=['评分第%d名'%i for i inrange(1,6)],columns=range(2000,2020))
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
评分第1名
第一神拳
千与千寻
攻壳机动队 STAND ALONE COMPLEX
百变之星
攻壳机动队 S.A.C. 2nd GIG
虫师
银魂
天元突破 红莲螺岩
NaN
钢之炼金术师 FULLMETAL ALCHEMIST
凉宫春日的消失
银魂'
银魂' 延长战
歌牌情缘2
白箱
水星领航员 The AVVENIRE
排球少年 乌野高校 VS 白鸟泽学园高校
3月的狮子 第二季
莉兹与青鸟
进击的巨人 第三季 Part.2
评分第2名
吸血鬼猎人D:妖杀行
星际牛仔 天国之扉
小魔女DoReMi 大合奏
钢之炼金术师
攻壳机动队2 无罪
蜂蜜与四叶草
蜂蜜与四叶草II
CLANNAD
水星领航员 第三季
福音战士新剧场版:破
四叠半神话大系
命运石之门
爆漫王。3
剧场版 魔法少女小圆 剧场版 [新篇] 叛逆的物语
虫师 续章 第2期
少女与战车 剧场版
3月的狮子
昭和元禄落语心中 -助六再临篇-
强风吹拂
瑞克和莫蒂 第四季
评分第3名
游戏王-怪兽之决斗
棋魂
十二国记
星空清理者
混沌武士
哆啦A梦
盗梦侦探
福音战士新剧场版:序
攻壳机动队2.0
化物语
Heart Catch 光之美少女!
魔法少女小圆
来自新世界
小马驹G4 第四季
虫师 续章
排球少年 第二季
吹响!悠风号 第二季
来自深渊
比宇宙更远的地方
高分少女 第二季
评分第4名
小魔女DoReMi ♯
蜡笔小新 呼风唤雨!大人帝国的反击
萩萩公主
东京教父
怪物
水星领航员
死亡笔记
物怪
剧场版 空之境界 第五章 矛盾螺旋
天元突破红莲螺岩 螺岩篇
王牌投手 振臂高挥~夏日大会篇~
日常
JOJO的奇妙冒险
辉夜姬物语
乒乓
JOJO的奇妙冒险 星尘斗士 埃及篇
昭和元禄落语心中
春宵苦短,少女前进吧!
摇曳露营△
海盗战记
评分第5名
魔卡少女樱 被封印的卡片
大~集合!小魔女DoReMi
阿滋漫画大王
全金属狂潮 校园篇
飞跃巅峰2!
交响诗篇
攻壳机动队 S.A.C. Solid State Society
永生之酒
Code Geass 反叛的鲁路修R2
剧场版 空之境界 第七章 杀人考察(后)
小马驹G4 第一季
夏目友人帐 参
冰菓
宇宙战舰大和号2199
怪诞小镇 第二季
虫师 续章 铃之雫
你的名字。
终物语(下)
JOJO的奇妙冒险 黄金之风
灵能百分百 第二季
各年度动画作品进入排行榜前100的数量
1 2 3 4 5 6 7 8 9 10 11 12 13 14
bgmdb_by_year=bgmdb.groupby(by='年度') defcount_rank(x): count=0 for i in x: if i<100: count+=1 return count TOP100_by_year=bgmdb_by_year.bgmrank.apply(count_rank)[-21:-1] print(TOP100_by_year)
TOP10=pd.DataFrame(data=[ bgmdb[bgmdb['年度']==i].sort_values( by='rating',ascending=False).loc[:,'rating'][:10].mean() for i inrange(2000,2020) ],columns=['TOP10均分'],index=range(2000,2020))
for i inrange(0,len(bgmdb)): res=[] print('item',i,'searching',bgmdb['原名'][i]) querystring={'keyword':bgmdb['原名'][i]} querystring=up.urlencode(querystring) final_url=url+querystring
interface3=list() for k,v in interface2.items(): bgm=bgmdb.loc[bgmdb.subject==k,['年度','subject','原名','中文名','别名','日期']].values[0] bili=[bilidb.loc[bilidb.media_id==each_bilimd,['year','media_id','title','date']].values for each_bilimd in v] bili=[each_bilimd[0] for each_bilimd in bili iflen(each_bilimd)] interface3.append({'bgm':bgm,'bili':bili})
matched=[] for searchres in interface3: bgm=searchres['bgm'] bili=searchres['bili'] for bilimd in bili: for bgmname in bgm[2:5]: if bilimd[2]==bgmname and bilimd[0]==bgm[0]: matched.append({'subject':bgm[1],'md':bilimd[1]})
import copy fullymatched=copy.deepcopy(matched)
然后,寻找名称不同但开播日期相同的作品,进行人工匹配,结果保存在manuallymatched中:
1 2 3 4 5 6 7 8
matched=[] for searchres in interface3: bgm=searchres['bgm'] bili=searchres['bili'] for bilimd in bili: if bilimd[2] notin bgm and (bilimd[3] isnot pd.NaT and bilimd[3]==bgm[5]): matched.append({'bgm':bgm[:-1],'bili':bilimd[:-1]}) ...
db['bgmrating_2digit']=db['bgmrating'].copy() db['bgmrating_2digit']=db['bgmrating_2digit'].apply(lambda x : ((x*10)//1)/10) bb=pd.crosstab(index=db['bgmrating_2digit'],columns=db['bilirating'])
bb.iloc[20:,40:]
bilirating
8.4
8.5
8.6
8.7
8.8
8.9
9.0
9.1
9.2
9.3
9.4
9.5
9.6
9.7
9.8
9.9
bgmrating_2digit
5.4
1
0
0
0
1
0
0
2
1
1
0
0
0
1
0
0
5.5
1
1
1
2
0
2
2
0
0
1
1
0
1
0
0
0
5.6
1
0
1
2
1
0
0
1
0
0
0
1
0
1
0
0
5.7
2
2
1
1
2
1
2
0
0
2
0
2
1
0
0
0
5.8
0
4
2
1
0
0
2
1
2
1
2
1
1
0
0
0
5.9
0
1
0
2
2
2
2
2
2
2
1
0
0
0
0
0
6.0
1
1
2
2
2
4
2
4
1
6
0
1
1
0
0
0
6.1
1
1
3
2
3
1
3
5
3
2
6
5
1
0
0
0
6.2
0
1
1
5
1
4
7
4
5
5
4
4
5
0
0
0
6.3
1
0
1
0
4
2
5
4
7
3
5
6
5
2
1
0
6.4
0
1
1
0
0
1
7
1
8
2
5
4
4
1
0
0
6.5
0
1
1
2
1
2
1
5
10
7
14
7
4
6
0
0
6.6
0
0
1
1
1
4
3
3
7
11
10
7
13
5
1
0
6.7
0
0
0
0
2
0
0
2
2
5
6
11
13
5
1
0
6.8
0
0
0
0
2
1
1
3
4
3
8
9
4
7
4
0
6.9
1
0
0
0
1
1
0
2
3
3
6
10
3
13
6
0
7.0
0
0
1
0
1
1
0
1
3
5
7
6
13
21
3
0
7.1
0
0
0
0
0
1
0
2
1
4
8
3
10
11
8
1
7.2
1
0
0
0
0
1
0
1
3
5
7
16
13
13
8
0
7.3
0
0
0
1
0
0
1
1
1
2
4
10
10
15
7
1
7.4
0
0
0
1
0
0
0
1
1
2
5
2
12
17
10
0
7.5
0
0
0
0
0
0
0
1
2
0
2
4
10
11
9
0
7.6
0
0
0
0
0
0
1
0
1
2
3
0
5
15
7
2
7.7
0
0
0
0
0
1
0
0
0
0
3
4
2
10
10
0
7.8
0
0
0
0
0
0
0
0
0
1
0
5
3
9
10
2
7.9
0
0
0
0
0
0
0
0
1
0
0
3
1
10
7
3
8.0
0
0
0
0
0
0
0
0
0
2
0
1
0
5
10
1
8.1
0
0
0
0
0
0
0
0
0
0
0
0
1
2
5
0
8.2
0
0
0
0
0
0
0
0
0
0
0
0
2
6
8
2
8.3
0
1
0
0
0
0
0
0
0
0
0
2
1
0
1
1
8.4
0
0
0
0
0
0
0
0
0
0
0
1
0
0
4
0
8.5
0
0
0
0
0
0
0
0
0
0
0
0
0
2
0
0
8.6
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
8.7
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
8.8
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
9.0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
9.1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
接着对每一个点分别作图,实现气泡图的效果:
1 2 3 4 5 6 7 8
fig=plt.figure(num=106,figsize=(8,4),dpi=200,facecolor='white') ax=fig.gca() for eachbgmrating in bb.index.tolist(): for eachbilirating in bb.columns.tolist(): ax.scatter(eachbgmrating,eachbilirating, s=bb.loc[eachbgmrating,eachbilirating]**1.1, marker='.',c='red') ax.set(title='两站评分关系图',xlabel='bangumi',ylabel='bilibili')
bgm_ninki=[ bgmdb[bgmdb.rating>=bgmdb.rating.quantile(i)].votes.mean()/ bgmdb[bgmdb.rating<=bgmdb.rating.quantile(1-i)].votes.mean() for i in np.linspace(0.5,1,51) ] bili_ninki=[ bilidb[bilidb.rating>=bilidb.rating.quantile(i)].raters.mean()/ bilidb[bilidb.rating<=bilidb.rating.quantile(1-i)].raters.mean() for i in np.linspace(0.5,1,51) ]