[PYTHON] [Numpy / Pandas / Matplotlib Übung 01]

Zunaechst

Obwohl Python sehr praktisch und billig zu erlernen ist, wird es unmöglich, sobald Sie das Lernen überspringen. Ich werde es daher als Memorandum buchstabieren, das die Bedeutung der Überprüfung enthält.

Vorbereitungen

Erstellen Sie eine virtuelle Lernumgebung.

Eingabeaufforderung


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

Eingabeaufforderung


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

Insbesondere,

Eingabeaufforderung


pip install japanize-matplotlib

Ich habe die Angewohnheit, es zu installieren, um Japanisch mit matplotlib zu verwenden.

Bereiten Sie eine Python-Vorlage vor

Ich denke, dass jede Person eine andere Art hat, ein Programm zu schreiben, aber ich versuche, ein Programm mit dieser Vorlage zu schreiben.

sample.py


import logging
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib	### [Japanische Unterstützung]

#Geben Sie das Protokollformat an
# %(asctime)s :Eine lesbare Darstellung der Zeit, zu der der LogRecord generiert wurde.
# %(funcName)s :Der Name der Funktion, die den Protokollierungsaufruf enthält
# %(levelname)s :Zeichenprotokollierungsstufe für Nachrichten
# %(lineno)d :Quellzeilennummer, unter der der Protokollierungsanruf ausgegeben wurde
# %(message)s : msg %Protokollnachricht als Argumente angefordert
fomatter = logging.Formatter('%(asctime)s:%(funcName)s:%(levelname)s:%(lineno)d:\n%(message)s')

#Logger-Einstellungen(INFO-Protokollstufe)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

#Handler-Einstellungen(Ausgabedatei ändern/Einstellung der Protokollebene/Protokollformateinstellungen)
handler = logging.FileHandler('handler_log.log')
handler.setLevel(logging.INFO)
handler.setFormatter(fomatter)

logger.addHandler(handler)

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

	#Ausnahmebehandlung
	except : 
		logger.info("Ausnahme aufgetreten", stack_info=True)

if __name__ == '__main__' :
	
	#Rufen Sie SampleFunc auf
	SampleFunc()

Um ehrlich zu sein, verstehe ich Funktionen, Ausnahmebehandlung und Logger nicht, aber ich kann nicht verstehen, was ich nicht verwende, und ich studiere. Daher möchte ich diese Vorlage zwangsweise als Grundlage für die Erstellung von Programmen verwenden. In Zukunft möchte ich mit der Aufteilung von Klassen und Dateien zwangsweise fortfahren.

Ausführungsergebnis

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

numpy Übung

Dieses Mal ist das Ziel, numpy zu verwenden $ \ displaystyle \ text {durchschnitt} \ qquad \ override {x} = \ frac {1} {n} \ sum_ {i = 1} ^ {n} x_ {i} $ Das Ziel ist zu berechnen.

Außerdem wird die gesamte Quelle des Programms am Ende dieses Artikels beschrieben, und nur die Punkte werden in der Mitte des Artikels beschrieben.

Erzeugung von Ndarray

Da Brüche in der Berechnungsannahme erscheinen, werde ich jetzt nicht über den Speicherverbrauch nachdenken und den Gleitkommatyp mit doppelter Genauigkeit verwenden.

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)

Ausführungsergebnis

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

Gesamtberechnung

Lassen Sie uns zunächst die Berechnung primitiv durchführen. (Ich weiß, dass Sie auch die statistische Grundfunktionssumme von ndarray verwenden können, aber da es sich um eine primitive Methode handelt, die im Notfall nützlich ist, schreibe ich sie in Eile.)

sample.py


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

logger.info(sum_data)
#Funktionsprüfung mit Summenfunktion
logger.info(sample_array.sum())

Ausführungsergebnis

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

Diese Berechnung ist \displaystyle \sum_{i=1}^{n}x_{i} Da es der Teil von ist, werde ich weiterhin den Durchschnitt finden.

Durchschnittliche Berechnung

sample.py


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

logger.info(ave_data)
#Funktionsprüfung mit der Grundfunktion von ndarray
logger.info(sample_array.mean())

Ausführungsergebnis

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

Diagrammzeichnung

Da die Berechnungsmethode für Gesamt und Durchschnitt bis zum vorherigen Kapitel bestätigt wurde, werde ich die Methode beschreiben, um dies zu veranschaulichen.

Einfache Handlung

sample.py


import logging
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib	### [Japanische Unterstützung]

#Geben Sie das Protokollformat an
# %(asctime)s :Eine lesbare Darstellung der Zeit, zu der der LogRecord generiert wurde.
# %(funcName)s :Der Name der Funktion, die den Protokollierungsaufruf enthält
# %(levelname)s :Zeichenprotokollierungsstufe für Nachrichten
# %(lineno)d :Quellzeilennummer, unter der der Protokollierungsanruf ausgegeben wurde
# %(message)s : msg %Protokollnachricht als Argumente angefordert
fomatter = logging.Formatter('%(asctime)s:%(funcName)s:%(levelname)s:%(lineno)d:\n%(message)s')

#Logger-Einstellungen(INFO-Protokollstufe)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

#Handler-Einstellungen(Ausgabedatei ändern/Einstellung der Protokollebene/Protokollformateinstellungen)
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)

		#Funktionsprüfung mit der Grundfunktion von ndarray
		#logger.info(sample_array.mean())

		make_graph(sample_data)

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


	#Ausnahmebehandlung
	except (KeyError, ValueError) as err:
		logger.exception('Error make_graph: %s', err)
	
if __name__ == '__main__' :
	
	# make_ndarray anrufen
	make_ndarray()

Ausführungsergebnis

TEST.png

Beschriftungen für X-Achse und Y-Achse hinzugefügt

sample.py


ax.set_xlabel("Beispieldaten")
ax.set_ylabel("Beispielwert")

fig.suptitle('TEST(X-Achse/Y-Achsenbeschriftung hinzugefügt)', fontweight="bold", fontsize = 12)

Ausführungsergebnis

TEST.png

Anmerkung hinzufügen

sample.py


#Begrenzen Sie den Bereich der Diagrammanzeige
ax.set_xlim([0,11])
ax.set_ylim([0,110])

#Kommentieren Sie an der angegebenen Position(annotation)Einstellen
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")

Ausführungsergebnis

TEST.png

Durchschnittliches Diagramm hinzufügen

sample.py


#Beschreiben Sie das Diagramm des Durchschnittswerts
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")

#Hinweis(annotation)Hinzufügen
#Pfeileigenschaften festlegen
arrow_dict = dict(arrowstyle = "->", color = "mediumblue")

#Eigenschaften von Textfeldern
# fc:facecolor, ec:edgecolor
text_dict = dict(boxstyle = "round",
	 fc = "white", ec = "mediumblue")

ax.annotate("Der Durchschnittswert ist" + str(ave_data), \
	xy = (9, ave_data), xytext = (9.5, ave_data+5), \
	size = 8, color = "red", \
	bbox = text_dict, arrowprops = arrow_dict)

Ausführungsergebnis

TEST.png

Addition des Gesamtgraphen (Addition der 2. Achse)

sample.py


		#Hinzufügung der zweiten Achse
		ax2 = ax.twinx()
		#Berechnung der kumulierten Summe
		sample_data_csum = np.cumsum(sample_data)
		ax2.bar(x_axis_arr, sample_data_csum, color = "blue", alpha = 0.2)
		#Begrenzen Sie den Bereich der Diagrammanzeige
		ax2.set_xlim([0,11])
		ax2.set_ylim([0,400])
		ax2.set_ylabel("Kumulative Summe der Probendaten")

Ausführungsergebnis

TEST.png

Gesamtprogramm dieses Artikels

sample.py


import logging
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import japanize_matplotlib	### [Japanische Unterstützung]

#Geben Sie das Protokollformat an
# %(asctime)s :Eine lesbare Darstellung der Zeit, zu der der LogRecord generiert wurde.
# %(funcName)s :Der Name der Funktion, die den Protokollierungsaufruf enthält
# %(levelname)s :Zeichenprotokollierungsstufe für Nachrichten
# %(lineno)d :Quellzeilennummer, unter der der Protokollierungsanruf ausgegeben wurde
# %(message)s : msg %Protokollnachricht als Argumente angefordert
fomatter = logging.Formatter('%(asctime)s:%(funcName)s:%(levelname)s:%(lineno)d:\n%(message)s')

#Logger-Einstellungen(INFO-Protokollstufe)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

#Handler-Einstellungen(Ausgabedatei ändern/Einstellung der Protokollebene/Protokollformateinstellungen)
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)

		#Funktionsprüfung mit der Grundfunktion von ndarray
		#logger.info(sample_array.mean())

		make_graph(sample_data, ave_data)

	#Ausnahmebehandlung
	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("Beispieldaten")
		ax.set_ylabel("Beispielwert")

		#Kommentieren Sie an der angegebenen Position(annotation)Einstellen
		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(X-Achse/Y-Achsenbeschriftung hinzugefügt)', fontweight="bold", fontsize = 12)

		ax.scatter(x_axis_arr, sample_data, color = "blue")
		
		#Beschreiben Sie das Diagramm des Durchschnittswerts
		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")
		
		#Hinweis(annotation)Hinzufügen
		#Pfeileigenschaften festlegen
		arrow_dict = dict(arrowstyle = "->", color = "mediumblue")

		#Eigenschaften von Textfeldern
		# fc:facecolor, ec:edgecolor
		text_dict = dict(boxstyle = "round",
			 fc = "white", ec = "mediumblue")
		
		ax.annotate("Der Durchschnittswert ist" + str(ave_data), \
			xy = (9, ave_data), xytext = (9.5, ave_data+5), \
			size = 8, color = "red", \
			bbox = text_dict, arrowprops = arrow_dict)

		#Begrenzen Sie den Bereich der Diagrammanzeige
		ax.set_xlim([0,11])
		ax.set_ylim([0,110])

		#Hinzufügung der zweiten Achse
		ax2 = ax.twinx()
		#Berechnung der kumulierten Summe
		sample_data_csum = np.cumsum(sample_data)
		ax2.bar(x_axis_arr, sample_data_csum, color = "blue", alpha = 0.2)
		#Begrenzen Sie den Bereich der Diagrammanzeige
		ax2.set_xlim([0,11])
		ax2.set_ylim([0,400])
		ax2.set_ylabel("Kumulative Summe der Probendaten")

		plt.savefig('TEST.png')

		plt.close()


	#Ausnahmebehandlung
	except (KeyError, ValueError) as err:
		logger.exception('Error make_graph: %s', err)
	
if __name__ == '__main__' :
	
	# make_ndarray anrufen
	make_ndarray()

Schließlich

Ausnahmebehandlung funktioniert nicht gut. .. .. Wenn das Diagrammzeichnungsteil in einer separaten Datei erstellt oder klassifiziert wird, ist es dann einfacher zu lesen? Es kann sein, also würde ich es gerne während des Studiums versuchen.

Recommended Posts

[Numpy / Pandas / Matplotlib Übung 01]
[Numpy / pandas / matplotlib Übung 01] Vorlage aktualisieren
Installieren Sie Python3, Numpy, Pandas, Matplotlib usw. unter Windows
Python Basic - Pandas, Numpy -
Einführung in Python numpy pandas matplotlib (für ~ B3 ~ part2)
Umgebungskonstruktion von NumPy und Matplotlib
Datenvisualisierungsmethode mit Matplotlib (+ Pandas) (5)
Pandas
Vielseitige Datenerfassung mit Pandas + Matplotlib
[Memo] Kleine Geschichte von Pandas, numpy
Datenvisualisierungsmethode mit Matplotlib (+ Pandas) (3)
Fall mit Pandas-Plot, Fall mit (reinem) Matplotlib-Plot
Datenvisualisierungsmethode mit Matplotlib (+ Pandas) (4)
[Docker] Python3.5 + Numpy + Matplotlib-Umgebungskonstruktion
Wenn Sie NumPy, Pandas, Matplotlib, IPython, SciPy unter Windows verwenden möchten
Jupyter-, Numpy- und Matplotlib-Notizen, die in Berichten verwendet werden
Zeichnen Sie eine hierarchische Achsenbeschriftung mit matplotlib + pandas
Zeichnen Sie Dreiecksfunktionen mit Numpy und Matplotlib