[PYTHON] [Exercice Numpy / pandas / matplotlib 01]

En premier

Bien que le python soit très pratique et bon marché à apprendre, cela devient impossible dès que vous sautez les études, je vais donc l'épeler comme un mémorandum comprenant la signification de la critique.

Préparation préalable

Créez un environnement virtuel d'apprentissage.

invite de commande


python -m venv study01
.\study01\Scripts\activate

invite de commande


python -m pip install --upgrade pip
pip install matplotlib
pip install pandas
pip install numpy
pip install japanize-matplotlib

En particulier,

invite de commande


pip install japanize-matplotlib

Quant à moi, j'ai l'habitude de l'installer pour utiliser le japonais avec matplotlib.

Préparer un modèle python

Je pense que chaque personne a une manière différente d'écrire un programme, mais j'essaie d'écrire un programme en utilisant ce modèle.

sample.py


import logging
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib	### [Support japonais]

#Spécifiez le format du journal
# %(asctime)s :Une représentation lisible par l'homme de l'heure à laquelle le LogRecord a été généré.
# %(funcName)s :Le nom de la fonction qui contient l'appel de journalisation
# %(levelname)s :Niveau de journalisation des caractères pour les messages
# %(lineno)d :Numéro de la ligne source sur laquelle l'appel de journalisation a été émis
# %(message)s : msg %Message de journal demandé en tant qu'args
fomatter = logging.Formatter('%(asctime)s:%(funcName)s:%(levelname)s:%(lineno)d:\n%(message)s')

#Paramètres de l'enregistreur(Niveau de journalisation INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

#Paramètres du gestionnaire(Modifier le fichier de sortie/Réglage du niveau de journal/Paramètres de format de journal)
handler = logging.FileHandler('handler_log.log')
handler.setLevel(logging.INFO)
handler.setFormatter(fomatter)

logger.addHandler(handler)

def SampleFunc() :
	try :
		logger.info("Hello World")

	#Gestion des exceptions
	except : 
		logger.info("Il y a une exception", stack_info=True)

if __name__ == '__main__' :
	
	#Appeler SampleFunc
	SampleFunc()

Pour être honnête, je ne comprends pas les fonctions, la gestion des exceptions et les enregistreurs, mais je ne comprends pas ce que je n'utilise pas et j'étudie, donc j'aimerais utiliser de force ce modèle comme base pour créer des programmes. À l'avenir, je voudrais procéder de force avec la division de classe et de dossier.

Résultat d'exécution

2019-11-19 23:00:52,298:SampleFunc:INFO:28:
Hello World

exercice engourdi

Cette fois, l'objectif est d'utiliser numpy $ \ displaystyle \ text {average} \ qquad \ override {x} = \ frac {1} {n} \ sum_ {i = 1} ^ {n} x_ {i} $ Le but est de calculer.

De plus, l'ensemble de la source du programme sera décrit à la fin de cet article, et seuls les points seront décrits au milieu de l'article.

Génération de ndarray

Puisque les fractions apparaîtront dans l'hypothèse de calcul, je ne penserai pas à la consommation de mémoire maintenant et utiliserai le type à virgule flottante double précision.

sample.py


sample_data = [40, 6, 56, 13, 91, 7, 11, 4, 88, 66]
sample_array = np.array(sample_data, dtype=np.float64)
logger.info(sample_array)
logger.info(type(sample_array))
logger.info(sample_array.dtype)

Résultat d'exécution

2019-11-19 23:17:46,839:make_ndarray:INFO:30:
[40.  6. 56. 13. 91.  7. 11.  4. 88. 66.]
2019-11-19 23:17:46,839:make_ndarray:INFO:31:
<class 'numpy.ndarray'>
2019-11-19 23:17:46,839:make_ndarray:INFO:32:
float64

Calcul total

Commençons par effectuer le calcul de manière primitive. (Je sais que vous pouvez également utiliser la somme des fonctions statistiques de base de ndarray, mais comme c'est une méthode primitive qui est utile en cas d'urgence, je l'écris à la hâte.)

sample.py


sum_data = 0.
for single_val in sample_data :
	sum_data += single_val

logger.info(sum_data)
#Contrôle de fonctionnement à l'aide de la fonction de somme
logger.info(sample_array.sum())

Résultat d'exécution

2019-11-19 23:25:29,815:make_ndarray:INFO:35:
382.0
2019-11-19 23:25:29,815:make_ndarray:INFO:36:
382.0

Ce calcul est \displaystyle \sum_{i=1}^{n}x_{i} Puisqu'il s'agit de la partie de, je vais continuer à trouver la moyenne.

Calcul moyen

sample.py


ave_data = 0.
ave_data = sum_data / len(sample_array)

logger.info(ave_data)
#Contrôle de fonctionnement à l'aide de la fonction de base de ndarray
logger.info(sample_array.mean())

Résultat d'exécution

2019-11-19 23:31:56,746:make_ndarray:INFO:38:
38.2
2019-11-19 23:31:56,746:make_ndarray:INFO:40:
38.2

Dessin graphique

La méthode de calcul du total et de la moyenne ayant été confirmée jusqu'au chapitre précédent, je décrirai la méthode pour illustrer cela.

Graphique simple

sample.py


import logging
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib	### [Support japonais]

#Spécifiez le format du journal
# %(asctime)s :Une représentation lisible par l'homme de l'heure à laquelle le LogRecord a été généré.
# %(funcName)s :Le nom de la fonction qui contient l'appel de journalisation
# %(levelname)s :Niveau de journalisation des caractères pour les messages
# %(lineno)d :Numéro de la ligne source sur laquelle l'appel de journalisation a été émis
# %(message)s : msg %Message de journal demandé en tant qu'args
fomatter = logging.Formatter('%(asctime)s:%(funcName)s:%(levelname)s:%(lineno)d:\n%(message)s')

#Paramètres de l'enregistreur(Niveau de journalisation INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

#Paramètres du gestionnaire(Modifier le fichier de sortie/Réglage du niveau de journal/Paramètres de format de journal)
handler = logging.FileHandler('handler_log.log')
handler.setLevel(logging.INFO)
handler.setFormatter(fomatter)

logger.addHandler(handler)

def make_ndarray() :
	try :
		sample_data = [40, 6, 56, 13, 91, 7, 11, 4, 88, 66]
		sample_array = np.array(sample_data, dtype=np.float64)

		sum_data = 0.
		for single_val in sample_data :
			sum_data += single_val

		ave_data = 0.
		ave_data = sum_data / len(sample_array)

		#Contrôle de fonctionnement à l'aide de la fonction de base de ndarray
		#logger.info(sample_array.mean())

		make_graph(sample_data)

	#Gestion des exceptions
	except (KeyError, ValueError) as err:
		logger.exception('Error make_ndarray: %s', err)

def make_graph(sample_data) :
	try :
		x_axis_arr = np.linspace(1, 10, 10)

		fig, ax = plt.subplots(1, 1, figsize=(6, 4))

		ax.scatter(x_axis_arr, sample_data)

		fig.suptitle('TEST', fontweight="bold", fontsize = 12)

		plt.savefig('TEST.png')

		plt.close()


	#Gestion des exceptions
	except (KeyError, ValueError) as err:
		logger.exception('Error make_graph: %s', err)
	
if __name__ == '__main__' :
	
	# make_appel ndarray
	make_ndarray()

Résultat d'exécution

TEST.png

Ajout d'étiquettes sur les axes X et Y

sample.py


ax.set_xlabel("Exemple de données")
ax.set_ylabel("Exemple de valeur")

fig.suptitle('TEST(Axe X/Ajout de l'étiquette de l'axe Y)', fontweight="bold", fontsize = 12)

Résultat d'exécution

TEST.png

Ajouter une annotation

sample.py


#Limiter la plage d'affichage du graphique
ax.set_xlim([0,11])
ax.set_ylim([0,110])

#Annoter à la position spécifiée(annotation)Mettre en
for x_data, y_data in zip(x_axis_arr, sample_data) :
	# logger.info(str(x_data) + ', ' + str(y_data))
	ax.annotate('(' + str(x_data) + ', ' + str(y_data) + ')', \
		xy = (x_data, y_data+3), size = 8, color = "red")

Résultat d'exécution

TEST.png

Ajouter un graphique moyen

sample.py


#Décrivez le graphique de la valeur moyenne
ave_data_xplot = np.arange(0, 12)
ave_data_yplot = np.full(12, ave_data)
ax.plot(ave_data_xplot, ave_data_yplot, color = "green")

#Remarque(annotation)Ajouter
#Définir les propriétés de la flèche
arrow_dict = dict(arrowstyle = "->", color = "mediumblue")

#Propriétés de la zone de texte
# fc:facecolor, ec:edgecolor
text_dict = dict(boxstyle = "round",
	 fc = "white", ec = "mediumblue")

ax.annotate("La valeur moyenne est" + str(ave_data), \
	xy = (9, ave_data), xytext = (9.5, ave_data+5), \
	size = 8, color = "red", \
	bbox = text_dict, arrowprops = arrow_dict)

Résultat d'exécution

TEST.png

Ajout du graphique total (ajout du 2ème axe)

sample.py


		#Ajout du deuxième axe
		ax2 = ax.twinx()
		#Calcul de la somme cumulée
		sample_data_csum = np.cumsum(sample_data)
		ax2.bar(x_axis_arr, sample_data_csum, color = "blue", alpha = 0.2)
		#Limiter la plage d'affichage du graphique
		ax2.set_xlim([0,11])
		ax2.set_ylim([0,400])
		ax2.set_ylabel("Somme cumulée des exemples de données")

Résultat d'exécution

TEST.png

Programme général de cet article

sample.py


import logging
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib	### [Support japonais]

#Spécifiez le format du journal
# %(asctime)s :Une représentation lisible par l'homme de l'heure à laquelle le LogRecord a été généré.
# %(funcName)s :Le nom de la fonction qui contient l'appel de journalisation
# %(levelname)s :Niveau de journalisation des caractères pour les messages
# %(lineno)d :Numéro de la ligne source sur laquelle l'appel de journalisation a été émis
# %(message)s : msg %Message de journal demandé en tant qu'args
fomatter = logging.Formatter('%(asctime)s:%(funcName)s:%(levelname)s:%(lineno)d:\n%(message)s')

#Paramètres de l'enregistreur(Niveau de journalisation INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

#Paramètres du gestionnaire(Modifier le fichier de sortie/Réglage du niveau de journal/Paramètres de format de journal)
handler = logging.FileHandler('handler_log.log')
handler.setLevel(logging.INFO)
handler.setFormatter(fomatter)

logger.addHandler(handler)

def make_ndarray() :
	try :
		sample_data = [40, 6, 56, 13, 91, 7, 11, 4, 88, 66]
		sample_array = np.array(sample_data, dtype=np.float64)

		sum_data = 0.
		for single_val in sample_data :
			sum_data += single_val

		ave_data = 0.
		ave_data = sum_data / len(sample_array)

		#Contrôle de fonctionnement à l'aide de la fonction de base de ndarray
		#logger.info(sample_array.mean())

		make_graph(sample_data, ave_data)

	#Gestion des exceptions
	except (KeyError, ValueError) as err:
		logger.exception('Error make_ndarray: %s', err)

def make_graph(sample_data, ave_data) :
	try :
		x_axis_arr = np.linspace(1, 10, 10)

		fig, ax = plt.subplots(1, 1, figsize=(6, 4))

		ax.scatter(x_axis_arr, sample_data)
		ax.set_xlabel("Exemple de données")
		ax.set_ylabel("Exemple de valeur")

		#Annoter à la position spécifiée(annotation)Mettre en
		for x_data, y_data in zip(x_axis_arr, sample_data) :
			# logger.info(str(x_data) + ', ' + str(y_data))
			ax.annotate('(' + str(x_data) + ', ' + str(y_data) + ')', \
				xy = (x_data, y_data+3), size = 8, color = "red")

		fig.suptitle('TEST(Axe X/Ajout de l'étiquette de l'axe Y)', fontweight="bold", fontsize = 12)

		ax.scatter(x_axis_arr, sample_data, color = "blue")
		
		#Décrivez le graphique de la valeur moyenne
		ave_data_xplot = np.arange(0, 12)
		ave_data_yplot = np.full(12, ave_data)
		ax.plot(ave_data_xplot, ave_data_yplot, color = "green")
		
		#Remarque(annotation)Ajouter
		#Définir les propriétés de la flèche
		arrow_dict = dict(arrowstyle = "->", color = "mediumblue")

		#Propriétés de la zone de texte
		# fc:facecolor, ec:edgecolor
		text_dict = dict(boxstyle = "round",
			 fc = "white", ec = "mediumblue")
		
		ax.annotate("La valeur moyenne est" + str(ave_data), \
			xy = (9, ave_data), xytext = (9.5, ave_data+5), \
			size = 8, color = "red", \
			bbox = text_dict, arrowprops = arrow_dict)

		#Limiter la plage d'affichage du graphique
		ax.set_xlim([0,11])
		ax.set_ylim([0,110])

		#Ajout du deuxième axe
		ax2 = ax.twinx()
		#Calcul de la somme cumulée
		sample_data_csum = np.cumsum(sample_data)
		ax2.bar(x_axis_arr, sample_data_csum, color = "blue", alpha = 0.2)
		#Limiter la plage d'affichage du graphique
		ax2.set_xlim([0,11])
		ax2.set_ylim([0,400])
		ax2.set_ylabel("Somme cumulée des exemples de données")

		plt.savefig('TEST.png')

		plt.close()


	#Gestion des exceptions
	except (KeyError, ValueError) as err:
		logger.exception('Error make_graph: %s', err)
	
if __name__ == '__main__' :
	
	# make_appel ndarray
	make_ndarray()

finalement

La gestion des exceptions ne fonctionne pas bien. .. .. De plus, si la partie de dessin de graphe est transformée en un fichier séparé ou classée, sera-t-elle plus facile à lire? C'est peut-être le cas, alors j'aimerais l'essayer pendant mes études.

Recommended Posts

[Exercice Numpy / pandas / matplotlib 01]
[Numpy / pandas / matplotlib Exercice 01] Mettre à jour le modèle
Installez Python3, numpy, pandas, matplotlib, etc. sous Windows
Python Basic --Pandas, Numpy-
Introduction à Python numpy pandas matplotlib (pour ~ B3 ~ part2)
Construction de l'environnement de NumPy et matplotlib
Méthode de visualisation de données utilisant matplotlib (+ pandas) (5)
Pandas
Traçage de données polyvalent avec pandas + matplotlib
[Mémo] Petite histoire de pandas, stupide
Méthode de visualisation de données utilisant matplotlib (+ pandas) (3)
Cas utilisant un tracé de pandas, cas utilisant un tracé matplotlib (pur)
Méthode de visualisation de données utilisant matplotlib (+ pandas) (4)
[docker] Construction de l'environnement python3.5 + numpy + matplotlib
Si vous souhaitez utiliser NumPy, Pandas, Matplotlib, IPython, SciPy sous Windows
Notes Jupyter, numpy, matplotlib utilisées dans les rapports
Dessinez une étiquette d'axe hiérarchique avec matplotlib + pandas
Graphiques de fonctions triangulaires avec numpy et matplotlib