[PYTHON] J'ai recherché des œuvres hautement évaluées par Naro

Complètement pour moi. Tout d'abord, je ne connais pas le format Markdown, donc je ne le montre pas aux gens. Si vous ne voulez connaître que le résultat, ici

Aperçu

Le classement des œuvres de Naruro n'est-il pas fiable? → Je veux connaître des œuvres intéressantes! !! → Classement à partir du classement mensuel et du classement trimestriel basé sur le score d'évaluation moyen

→ Les œuvres avec une note de 500 ou moins peuvent être biaisées (la loi des grands nombres), donc je les ai exclues même si c'est mauvais! La valeur d'écart est également ajoutée aux points d'évaluation, vous pouvez donc voir les œuvres que vous jugez intéressantes d'un coup d'œil! Tu l'as fait!

Cliquez-ici pour le code! J'ai tout écrit en pythonista sur iphone! Je suis lycéen et pardonne-moi les codes sales!

Je l'ai fait en désordre avec l'élan, donc même si je fais une erreur, ce n'est pas quelque chose qui peut être montré aux gens.


import requests,json,datetime,math
import console #Peut-être une bibliothèque pythonista?
from statistics import mean,stdev
#from time import sleep(Pour le débogage)
#from pprint import pprint(Pour le débogage)


today = datetime.date.today().strftime('%Y%m%d')

bg = {
	1: 'amour',
	2: 'Fantaisie',
	3: 'Arts littéraires',
	4: 'SF',
	99: 'Autre',
	98: 'Non-genre'
	}
gg = {
	101: 'Un autre monde [amour]',
	102: 'Monde réel [amour]',
	201: 'Haute fantaisie [fantaisie]',
	202: 'Faible fantaisie [fantaisie]',
	301: 'Littérature pure [littérature]',
	302: 'Drame humain [arts littéraires]',
	303: 'Histoire [littérature]',
	304: 'Raisonnement [littérature]',
	305: 'Horreur [arts littéraires]',
	306: 'Action [littérature]',
	307: 'Comédie [littérature]',
	401: 'Jeu VR [SF]',
	402: 'Espace [SF]',
	403: 'Fantaisie scientifique [SF]',
	404: 'Panique [SF]',
	9901: 'Histoire pour enfants [Autre]',
	9902: 'Poésie [Autre]',
	9903: 'Essai [Autre]',
	9904: 'Rejouer [Autre]',
	9999: 'Autre [Autre]',
	9801: 'Non-genre [non-genre]'
}


def uni(seq):
	seen = []
	return [x for x in seq if x not in seen and not seen.append(x)]


#Obtenez des informations de classement mensuel
def otherlist():
	u = 'https://api.syosetu.com/rank/rankget/?&out=json&rtype='+today[:6]+'01-m'
	al = requests.get(u)
	ali = json.loads(al.text)
	return ali


#narrow.Lisez le type que vous avez ajouté au txt
def get_add_data():
	with open('narrow.txt') as f:
		l_strip = [s.strip() for s in f.readlines()]
	return uni(list(filter(lambda a: a != '', l_strip)))#Évitez la duplication avec des données vides et retournez
	


#Passez le ncode de votre roman préféré et un fichier pour des données supplémentaires(narrow.txt)Écrire à
def add_data(ncode):
	with open('narrow.txt', mode='a') as f:
		f.write(ncode+'\n')
	print('success')
	
def getdata():
	c = 0
	#Analyse à partir du classement trimestriel
	u1 = 'https://api.syosetu.com/rank/rankget/?&out=json&rtype='+today[:6]+'01-q'
	zen = requests.get(u1)
	zeli = json.loads(zen.text)
	#Obtenez de nouvelles informations de classement trimestriel
	
	add_list = otherlist()
	#Ajout des données de classement mensuel
	for i in get_add_data():
		#Plus étroit.Ajouter un ncode écrit en txt
		add_list = add_list +[dict(ncode=i)]
	for a in add_list:
		zeli.append(a)
		
	#À ce stade, zeli a un quart,Classement mensuel+narrow.Contient des données supplémentaires pour txt
	
	all_data = list()
	errors = list()
	l = len(zeli)
	for n in zeli:
		url='https://api.syosetu.com/novelapi/api/?out=json&of=t-w-r-a-ah-bg-g-ka&ncode='+n['ncode']
		#Obtenez de nouvelles informations de ncode
		
		detail = dict()
		
		res = requests.get(url)
		text = json.loads(res.text)
		
		i=zeli.index(n)
		
		#Une belle barre de chargement trouvée sur le net
		bar_template = "\r[{0}] {1}/{2}   {3}"
		x = math.ceil(l/30)
		p = math.ceil(((l-i)/x))
		
		#Réglage pour empêcher la barre de s'effondrer(Sans cela, il sera saccadé tous les multiples de 10.)
		if(p+i/x < 30):p = p + 1
		elif (p+i/x > 30):p = p - 1
		
		if(i!=l):com='Chargement'
		else:com='Chargement terminé'
		bar = "#" * math.ceil(i/x) + " " * p
		print(bar_template.format(bar,i,l,com), end="")
		
	
		if(text[0]['allcount']==0):
			errors.append('Error:Ncode='+n['ncode'])
			
		else:
			text=text[1]
			detail['Nombre de personnes à évaluer']=text['all_hyoka_cnt']
			detail['Note moyenne']=math.ceil(text['all_point']*10000/text['all_hyoka_cnt'])/1000
			
			detail['Titre du travail']=text['title']
			detail['Nombre d'avis']=text['review_cnt']
			detail['Taux de conversation']=text['kaiwaritu']
			detail['Grand genre']=bg[text['biggenre']]
			detail['Petit genre']=gg[text['genre']]
			all_data.append(detail)
			c = c + 1
			
			#if c == 10:
				#return all_data
			
	for error in errors:
		print('\n'+error)
	#Il crache ncode qui était une erreur de lecture car il a été supprimé
	
	return all_data
	


def main():
	sources = getdata()
	l = len(sources)
	sources = uni(sources)
	
	ex = 0
	lr = []
	l0 = []
	l1 = []	#Numéro d'évaluation de 1000 ou plus
	l2 = []
	l3 = []
	l4 = []
	l5 = []
	
	console.clear()
	#Console claire de pythonista3
	
	for data in sources:
		if(data['Nombre de personnes à évaluer'] < 500):
			#Exclut moins de 500 évaluations(Pour éviter les biais tels que 10 points par une évaluation)
			ex = ex + 1
			#Mesure du nombre d'exclusion
		else:
			lr.append(data['Titre du travail'])		#Titre du travailリスト
			l0.append([data['Titre du travail'], data['Note moyenne']])	#Titre du travailとNote moyenneの関係
			l1.append(data['Note moyenne'])	#Liste des points d'évaluation
			l3.append([data['Titre du travail'], data['Petit genre']])	#Titre du travailとPetit genreの対応
			l4.append([data['Titre du travail'], data['Taux de conversation']])	#Titre du travailとTaux de conversationの対応
			l5.append([data['Titre du travail'], data['Nombre d'avis']])	#Titre du travailとNombre d'avisの対応
	
	mn = mean(l1)	#Points d'évaluation moyens de tous les travaux analysés
	sd = stdev(l1)	#Écart type du point d'évaluation
	k = 0
	
	for x in l1:	#Trouvez la valeur d'écart h
		h = ((x-mn)*10/sd)+50
		l2.append([lr[k],math.ceil(h*100)/100])
		k=k+1

	d1 = dict(l0)	#Nom de l'œuvre et points d'évaluation
	d2 = dict(l2)	#Nom du travail et valeur d'écart
	
	d3 = dict(l3)	#Titre et petit genre
	d4 = dict(l4)	#Titre du travail et taux de conversation
	d5 = dict(l5)	#Titre des travaux et nombre de revues
	
	d1_sorted = sorted(d1.items(), key=lambda x:x[1], reverse=True)	#Trier les points d'évaluation par ordre de classement
	d2_sorted = sorted(d2.items(), key=lambda x:x[1], reverse=True)	#Trier les valeurs d'écart
	
	w = 0
	print('Nombre total de données:'+str(l))
	print('Nombre de cas non évalués(Numéro d'évaluation inférieur à 500):'+str(ex))
	print('Nombre de données nettes sans duplication:{}'.format(len(sources)))
	print('Note moyenne:'+str(math.ceil(mn*10000)/10000))
	for y in d1_sorted:
		print('##'+str(w+1)+'Rang\n###『'+y[0]+'』\n genre:'+d3[y[0]]+'\n Points d'évaluation:'+str(y[1])+'\n Valeur de l'écart d'évaluation:'+str(d2_sorted[w][1])+'\n Taux de conversation des phrases:'+str(d4[y[0]])+'%\n Nombre d'avis:'+str(d5[y[0]]))
		#La note d'évaluation moyenne est de 100 points
		w = w + 1	#Découvrez quelle valeur
		
if __name__ == '__main__':
	main()
	#Si vous souhaitez rechercher un roman, veuillez rechercher avec un autre éditeur

Et le résultat

Le top 10 des œuvres qui semblaient intéressantes (note moyenne élevée) était le suivant.

Au fait, mon préféré est Rebuild World.

Il y avait des œuvres que je ne connaissais pas du tout, je vais donc les lire.

1ère place "Amoureux des livres Shimojo-je ne peux pas choisir le moyen de devenir commis-"

2ème place "Matière qui a été rendue un humain inutile par l'ange d'à côté"

3e place "Shangri-La Frontier-Fucking Game Hunter, essayant de défier le jeu de Dieu-"

4ème place "Holy Cup of Ellis"

5ème place "Rebuild World"

6e place "Le fantôme du deuil veut prendre sa retraite - Le chasseur le plus faible rêve d'un héros - [Version Web]"

7e place "À la suite d'un mariage déguisé avec un collègue otaku, chaque jour est très amusant! 』\

8e place "Rosa, le noble veut veiller sur l'amour de l'ombre"

9ème place "Le roi des morts dans le palais des morts [version Web]"

10e place "Diacre de la fille méchante-Elle que j'ai élevée est très mignonne- (version sérialisée)"

Les résultats détaillés sont ici

Recommended Posts

J'ai recherché des œuvres hautement évaluées par Naro
J'ai recherché des commandes de CD.
J'ai cherché un nombre premier avec python
[Python] J'ai recherché différents types! (Dactylographie)
J'ai essayé d'installer un pilote pour une carte réseau qui n'est pas reconnue par Linux