<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	 xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>Python &#8211; Nearshore Software Development Company &#8211; IT Outsourcing Services</title>
	<atom:link href="https://nearshore-it.eu/pl/tag/python-2/feed/" rel="self" type="application/rss+xml" />
	<link>https://nearshore-it.eu/pl/</link>
	<description>We are Nearshore Software Development Company with 14years of experience in delivering a large scale IT projects in the areas of PHP, JAVA, .NET, BI and MDM.</description>
	<lastBuildDate>Wed, 28 May 2025 09:30:54 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://nearshore-it.eu/wp-content/uploads/2023/01/cropped-inetum-favicon-300x300-1-32x32.png</url>
	<title>Python &#8211; Nearshore Software Development Company &#8211; IT Outsourcing Services</title>
	<link>https://nearshore-it.eu/pl/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Python i AI, Float i nie tylko – czyli jak produktywniej pracować z Pythonem? </title>
		<link>https://nearshore-it.eu/pl/artykuly/python-i-ai/</link>
					<comments>https://nearshore-it.eu/pl/artykuly/python-i-ai/#respond</comments>
		
		<dc:creator><![CDATA[Patryk Fiedorowicz]]></dc:creator>
		<pubDate>Tue, 11 Feb 2025 12:08:19 +0000</pubDate>
				<category><![CDATA[Artykuły]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://nearshore-it.eu/?p=34615</guid>

					<description><![CDATA[Jak zwiększyć efektywność pracy w Pythonie i zadbać o czysty kod? Jak asystenci AI wspierają codzienną pracę programistów? Przeczytaj artykuł i odkryj, jak programować efektywniej dzięki narzędziom AI i Machine Learning! ]]></description>
										<content:encoded><![CDATA[
<p>Podczas konferencji Python Summit 2024 zorganizowanej przez społeczność PyData i PyWaw w Warszawie w grudniu ubiegłego roku, miałem możliwość zapoznania się z prelekcjami na temat generatywnej sztucznej inteligencji, uczenia maszynowego, inżynierii danych, technologii webowych, cyberbezpieczeństwa, testowania, architektury systemów czy dobrych praktyk pisania czystego kodu. W pamięć zapadły mi szczególnie dwie prelekcje, które zainspirowały mnie do napisania tego artykułu. Pierwsza z nich dotyczyła produktywnej pracy z Pythonem (prelegent: Sebastian Buczyński, Software Architect / Consultant / Trainer z Bottega IT Minds), natomiast druga obejmowała temat liczb zmiennoprzecinkowych Float w Pythonie (Konrad Gawda, Cloud Evangelist z Orange Polska).</p>



<p>Zrozumienie poruszonych aspektów pozwala odpowiedzieć na istotne pytania. Jakie struktury wykorzystywać, by uniknąć krytycznych błędów? Jak zwiększyć efektywność pracy w Pythonie i zadbać o czysty kod? Jak asystenci AI wspierają codzienną pracę programistów?</p>



<div class="table-of-contents">
    <p class="title"></p>
    <ol>
                    <li><a href="#przykłady-problemów-z-liczbami-zmiennoprzecinkowymi">1.  Przykłady problemów z liczbami zmiennoprzecinkowymi</a></li>
                    <li><a href="#Float-–-liczby-zmiennoprzecinkowe-w-Pythonie">2.  Float – liczby zmiennoprzecinkowe w Pythonie</a></li>
                    <li><a href="#Developer-Experience-–-jak-mierzyć-efektywność-developera?">3.  Developer Experience – jak mierzyć efektywność developera?</a></li>
                    <li><a href="#Narzędzia-do-efektywnej-pracy-w-Pythonie">4.  Narzędzia do efektywnej pracy w Pythonie</a></li>
                    <li><a href="#Asystenci-AI-jako-wsparcie-produktywnej-pracy">5.  Asystenci AI jako wsparcie produktywnej pracy</a></li>
                    <li><a href="#Podsumowanie">6.  Podsumowanie</a></li>
            </ol>
</div>


<h2 class="wp-block-heading" id="przykłady-problemów-z-liczbami-zmiennoprzecinkowymi">Trochę historii na początek – przykłady problemów z liczbami zmiennoprzecinkowymi</h2>



<h3 class="wp-block-heading">Błąd systemu obrony przeciwrakietowej Patriot&nbsp;</h3>



<p>Podczas wojny w Zatoce Perskiej w 1991 roku system nie zadziałał prawidłowo i nie przechwycił rakiety Scud, która uderzyła w koszary wojskowe w Dhahran w Arabii Saudyjskiej, zabijając 28 osób. Przyczyną był błąd w obliczeniach czasu. System śledził czas za pomocą liczby całkowitej reprezentującej liczbę taktów zegara, przy czym każdy takt odpowiadał za około 0.1 sekundy. Aby obliczyć dokładny czas, liczba całkowita była mnożona przez 0.1, która w pamięci była reprezentowana jako liczba przybliżona ze względu na ograniczenia formatu IEEE 754. Z każdym kolejnym cyklem zegara błąd się kumulował, przez aż 100 godzin od uruchomienia systemu, ostatecznie narastając do około 0.34 sekundy. Ta różnica spowodowała, że system obliczył błędne położenie rakiety Scud i nie zadziałał na czas. Po incydencie wprowadzono aktualizację oprogramowania, która resetowała zegar systemowy częściej, zmniejszając wpływ kumulacji błędów. Ta tragiczna w skutkach historia amerykańskiego systemu obrony rakietowej Patriot to jeden z klasycznych przykładów błędu wynikającego z ograniczeń liczb zmiennoprzecinkowych. Ta historia pokazuje, że w tak istotnych obliczeniach należy unikać stosowania przybliżeń i używać precyzyjniejszych typów danych.&nbsp;&nbsp;</p>



<h3 class="wp-block-heading">Wybory parlamentarne w Schleswig-Holstein&nbsp;</h3>



<p>Innym przykładem są wybory parlamentarne z 1992 r. w niemieckim Schleswig-Holstein. W tym, jak i w większości niemieckich landów, obowiązuje system proporcjonalny, w którym partie muszą uzyskać co najmniej 5% głosów, aby otrzymać mandaty w parlamencie. Wyniki wyborów były prezentowane w procentach, a zaokrąglenia miały miejsce na różnych etapach obliczeń. Partia Zielonych uzyskała 4.97%, ale na etapie prezentacji wyników wartość została zaokrąglona do 5%, a więc próg został spełniony, co całkowicie zmieniło rozkład mandatów w parlamencie. Doprowadziło to do wielu kontrowersji i publicznej debaty, jednak mimo to wyniki zostały uznane za wiążące. W systemie nie przewidziano procedury na wypadek błędu zaokrąglenia.&nbsp;&nbsp;</p>



<h2 class="wp-block-heading" id="Float-–-liczby-zmiennoprzecinkowe-w-Pythonie">Float – liczby zmiennoprzecinkowe w Pythonie</h2>



<p>W tym kontekście bardzo ciekawą prelekcją z mojej perspektywy była ta o typie Float, czyli liczbach zmiennoprzecinkowych w Pythonie.&nbsp;&nbsp;</p>



<p>Liczby te można tworzyć na różne sposoby, poprzez dosłowne przekazanie liczby, czyli np. 1.0, używając klasy tj. float(1) lub poprzez działania matematyczne takie jak 1/1.&nbsp;</p>



<h3 class="wp-block-heading">Standard IEEE 754 binary64&nbsp;</h3>



<p>Z dokumentacji Pythona dowiadujemy się, że we wszystkich znanych implementacjach interpretera Pythona float zdefiniowany jest jako double. Bardziej szczegółowo typ ten jest opisany według standardu IEEE 754 binary64 i wygląda to następująco:&nbsp;</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="756" height="150" src="https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_1.png" alt="Python i AI" class="wp-image-34637" title="Python i AI, Float i nie tylko – czyli jak produktywniej pracować z Pythonem?  1" srcset="https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_1.png 756w, https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_1-300x60.png 300w, https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_1-495x98.png 495w" sizes="(max-width: 756px) 100vw, 756px" /></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Patrząc po kolei od lewej:&nbsp;</p>



<ul class="wp-block-list">
<li>1 bit jest poświęcony na znak (liczba dodatnia lub ujemna).&nbsp;</li>



<li>11 bitów wyraża wykładnik potęgowy.&nbsp;</li>



<li>52 bity wyrażają ułamek.&nbsp;</li>
</ul>



<p>A wszystko to można przedstawić za pomocą poniższego wzoru:&nbsp;</p>



<p>(-1)^sign x 2^(exp-1023) x 1.fraction&nbsp;</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="756" height="160" src="https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_2.png" alt="Python i AI" class="wp-image-34640" title="Python i AI, Float i nie tylko – czyli jak produktywniej pracować z Pythonem?  2" srcset="https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_2.png 756w, https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_2-300x63.png 300w, https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_2-495x105.png 495w" sizes="(max-width: 756px) 100vw, 756px" /></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Według omówionego standardu poniżej kilka przykładów reprezentacji binarnej:&nbsp;</p>



<p><strong>a) Liczba 0.0&nbsp;</strong></p>



<p>0 (sign) 00000000000 (exponent) </p>



<p>(0).0000000000000000000000000000000000000000000000000000 (fraction)&nbsp;</p>



<p><strong>b) Liczba 1.0 = 1 x 1.0 = 2^0 x 1.0 = 2^(1024-1024) x 1.0&nbsp;</strong></p>



<p>0 (sign) 01111111111 (exponent) </p>



<p>(1).0000000000000000000000000000000000000000000000000000 (fraction)&nbsp;</p>



<p><strong>c) Liczba 3.0 = 2 x 1.5 = 2^1 x 1.5 =2^(1025-1024) x 1.5&nbsp;</strong></p>



<p>0 (sign) 10000000000 (exponent) </p>



<p>(1).1000000000000000000000000000000000000000000000000000 (fraction)&nbsp;</p>



<h3 class="wp-block-heading">Precyzja typu Float&nbsp;</h3>



<p>Powyższe przykłady są dość proste z punktu widzenia reprezentacji binarnej, jednak problem pojawia się przy liczbach niecałkowitych, ponieważ nie zawsze jesteśmy w stanie zapisać je w pamięci z pełną precyzją. Można to zaobserwować, używając w Pythonie metody as_integer_ratio(), aby sprawdzić, jakie liczby są użyte do dzielenia, by uzyskać oczekiwany wynik. Jak widać na poniższym przykładzie, dla liczby 0.1 nie ma liczb 1 i 10, jak byśmy tego oczekiwali, tylko 3602879701896397 i 36028797018963968. Są to liczby, które dają najbardziej precyzyjne przybliżenie do 0.1 i możliwe do zapisu w pamięci według omawianego standardu. Natomiast to, że wywołując print() na obliczeniu 1/10 otrzymujemy 0.1, wynika wyłącznie z tego, że print() automatycznie zaokrągla nam do najkrótszego zapisu dziesiętnego, który się mieści w ramach ostatniego bitu precyzji.&nbsp;&nbsp;</p>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="756" height="54" src="https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_3.png" alt="Python i AI" class="wp-image-34644" title="Python i AI, Float i nie tylko – czyli jak produktywniej pracować z Pythonem?  3" srcset="https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_3.png 756w, https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_3-300x21.png 300w, https://nearshore-it.eu/wp-content/uploads/2025/02/nearshore_2025.02.05_graphic_3-495x35.png 495w" sizes="(max-width: 756px) 100vw, 756px" /></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Inną przydatną metodą w Pythonie, pozwalającą zyskać więcej informacji na temat floatów, jest <strong>sys.float_info. </strong>Dzięki niej możemy się dowiedzieć, że float pozwala na przechowywanie do 15 cyfr znaczących (dodatkowo ewentualnie znak plus-minus i/lub przecinek).&nbsp;&nbsp;</p>



<p>To wszystko może sprawić, że zaczniemy się zastanawiać nad tym, jak dużo ucieka nam precyzji podczas używania typu float. Do tego przydatna jest metoda <strong>math.ulp() </strong>(czyli Unit in the Last Place), co w praktyce zwraca nam różnicę pomiędzy podaną liczbą a następną, którą jesteśmy w stanie zapisać w tym formacie w pamięci. W przypadku małych liczb te różnice są bardzo marginalne, jednak przy takiej liczbie jak 2^52 ta różnica wynosi już równo 1.0. Oznacza to, że właściwie od tej liczby wzwyż całkowicie tracimy części ułamkowe. Idąc dalej, przy 2^53 różnica ta wynosi już 2.0. Zatem ważnym wnioskiem jest, by tak dużych liczb, nawet całkowitych, nie przechowywać jako float, ponieważ tylko liczby parzyste w tym przypadku zachowałyby swoją precyzję.&nbsp;</p>



<h3 class="wp-block-heading">Symbole specjalne&nbsp;</h3>



<p>W standardzie IEEE 754 przewidziano również miejsce dla specjalnych symboli. Jeśli 11-bitowa część exponent jest cała wypełniona jedynkami, a 52-bitowa część wyrażająca ułamek wypełniona zerami, to mamy do czynienia z reprezentacją binarną nieskończoności. Zapełniając zerem bit odpowiedzialny za znak otrzymujemy plus nieskończoność, a jedynką minus nieskończoność.&nbsp;</p>



<p>Z kolei mając również 11-bitową część exponent wypełnioną jedynkami, ale także część wyrażającą ułamek wypełnioną jedynkami, otrzymujemy symbol NaN (Not a Number). Wszelkie operacje porównujące takie jak =, &gt;, &lt; z udziałem NaN zwracają False, co może być problematyczne w różnych okolicznościach. Zwłaszcza kiedy użytkownik ma braki w danych i sądzi, że porównywana jest faktyczna liczba, a nie pusta reprezentacja w postaci NaN.&nbsp;&nbsp;</p>



<h3 class="wp-block-heading">Zaokrąglenia&nbsp;</h3>



<p>Co jednak, jeśli nie jest potrzebna nam aż taka dokładność i chcemy uprościć jakieś obliczenia? Odpowiedzią są zaokrąglenia i należy wiedzieć, że uzyskać je można na różne sposoby. Co istotne, nie różnią się jedynie nazwy funkcji, ale ich implementacje mają odrębne podejścia. W prezentacji podczas Python Summit 2024 przedstawiono następujące metody:&nbsp;</p>



<ol start="1" class="wp-block-list">
<li><strong>Funkcja round() </strong>– zaokrągla zadaną liczbę do najbliższej liczby z określoną liczbą miejsc po przecinku, domyślnie do liczby całkowitej. Natomiast szczególnym przypadkiem jest sytuacja, gdy liczba jest równo w połowie i w obie strony jest taka sama odległość. Wtedy najmniej znacząca cyfra zaokrąglana jest do liczby parzystej, co według statystyków minimalizuje skumulowany błąd podczas wykonywania wielu operacji zaokrąglania. Czyli przykładowo zarówno 1.5, jak i 2.5 zostaną zaokrąglone do 2, jeśli interesuje nas liczba całkowita. Co ciekawe, w przypadku takich liczb jak 1.15 i 1.25 również obie powinny zostać zaokrąglone do 1.2, gdyby chcieć zachować dokładność do jednego miejsca po przecinku. Jednak tylko 1.25 zwróci poprawnie 1.2, a dla 1.15 zostanie zwrócone 1.1. Wynika to właśnie z tego, że liczby 1.15 nie da się precyzyjnie przechować w pamięci według standardu IEEE 754, a będzie to 1.1499999999999999. Czyli nie jest to de facto równo w połowie, a więc zaokrągli w dół do 1.1.&nbsp;</li>
</ol>



<ol start="2" class="wp-block-list">
<li><strong>int() lub math.trunc()</strong> – co prawda nie są to funkcje zaokrąglające, tylko obcinające liczbę, ale ich efekt działa tak, jakbyśmy zaokrąglali liczbę w kierunku 0. Czyli przykładowo 1.9 zostanie ucięte (zaokrąglone) do 1, natomiast -1.9 zostanie sprowadzone do -1.&nbsp;&nbsp;</li>
</ol>



<ol start="3" class="wp-block-list">
<li><strong>math.floor() lub x // 1</strong> – pierwsza z nich po prostu zaokrągla w dół, w kierunku –nieskończoności. Natomiast druga to dzielenie bez reszty, przy czym dzieląc przez jeden, uzyskamy ten sam efekt co w przypadku pierwszej funkcji. Przykładowo dla obu z nich -1.9 zostanie zaokrąglone do -2, a 1.9 do 1.&nbsp;</li>
</ol>



<ol start="4" class="wp-block-list">
<li><strong>math.ceil() </strong>– zaokrąglanie w górę, w kierunku + nieskończoności. Używając tego samego przykładu -1.9 zostanie zaokrąglone do -1, natomiast 1.9 zaokrągli do 2.&nbsp;</li>
</ol>



<h2 class="wp-block-heading" id="Developer-Experience-–-jak-mierzyć-efektywność-developera?">Developer Experience – jak mierzyć efektywność developera?</h2>



<p>W przeszłości na różne sposoby próbowano mierzyć efektywność developerów. Jedną z bardziej popularnych, a zarazem nietrafionych metod, było mierzenie efektywności poprzez liczbę napisanych linii kodu. Podczas drugiej z wspomnianych prezentacji przytoczono koncepcję, która nie tyle pozwala na mierzenie produktywności, co pomaga zadbać o efektywne środowisko pracy. Mowa tutaj o DevEX (Developer Experience), które wyróżnia 3 filary:&nbsp;</p>



<ol start="1" class="wp-block-list">
<li><strong>Stan przepływu (Flow state)</strong> – z punktu widzenia developera jest to stan głębokiego skupienia, w którym jesteśmy w stanie spokojnie pracować. Jeśli cele nie są jasno doprecyzowane, może wystąpić konieczność przerwania zadania, by ustalić nieścisłości.&nbsp;</li>



<li><strong>Pętle zwrotne (Feedback loops) </strong>– oznacza, ile czasu mija, zanim developer się dowie, że kod nie działa. W przypadku testów jednostkowych ten feedback jest bardzo szybki, ale w przypadku code review na feedback trzeba zaczekać dłużej.&nbsp;</li>



<li><strong>Ładunek kognitywny (Cognitive load)</strong> – oznacza wysiłek umysłowy wymagany do skutecznego pisania kodu. Jeśli programista spotyka się z projektem o innej strukturze niż zwykle albo nie ma do dyspozycji dokumentacji, do której zawsze miał dostęp, ten ładunek będzie wyższy.&nbsp;</li>
</ol>



<h2 class="wp-block-heading" id="Narzędzia-do-efektywnej-pracy-w-Pythonie">Narzędzia do efektywnej pracy w Pythonie</h2>



<p>Wielu programistów rozpoczyna przygodę z Pythonem, gdyż zachęca ich intuicyjna składnia i wszechstronność zastosowań tego języka w analizie danych. W miarę rozwoju umiejętności w naturalny sposób poszukujemy narzędzi pozwalających zwiększyć efektywność pracy i ułatwiających życie. Podczas kolejnej prezentacji, w której miałem okazję brać udział w trakcie Python Summit 2024, zostały omówione takie narzędzia:&nbsp;</p>



<ol start="1" class="wp-block-list">
<li><strong>Formatery&nbsp;</strong>&nbsp;</li>
</ol>



<p>Formatowanie kodu to bardzo istotny aspekt, ponieważ to od tego głównie będzie zależało, czy programiście wygodnie się czyta oraz pisze kod. Jednak każdy z nas może mieć nieco inne preferencje, przyzwyczajenia, dlatego najlepiej, aby został przyjęty jeden ściśle określony sposób formatowania. Zaleca się korzystanie ze standardu PEP 8. Jest to dość długi dokument, dlatego dbanie samodzielnie o każdy szczegół mogłoby być bardzo czasochłonne – ładunek kognitywny rośnie. Dodatkowo podczas code review to byłaby rzecz, na którą trzeba zwracać uwagę, zatem przekłada się to na dodatkowy czas poświęcony po stronie zespołu, a i pętla zwrotna się wydłuża. I tutaj z pomocą przychodzą formatery kodu, które mogą wykonać całą pracę za nas. Przykładowe formatery kodu w Pythonie to:<strong> black, isort, ruff, yapf.</strong>&nbsp;</p>



<ol start="2" class="wp-block-list">
<li><strong>Lintery</strong>&nbsp;</li>
</ol>



<p>Są to narzędzia do statycznej analizy kodu, dzięki którym możemy dowiedzieć się o niektórych błędach jeszcze przed uruchomieniem kodu. Ponadto lintery są w stanie naprawiać za nas takie błędy jak np. literówki powstałe poprzez użycie nieistniejącej zmiennej. Inne kwestie, które mogą być sprawdzane automatycznie, to ilość znaków w każdej linii, długość nazw funkcji, zmiennych, ilość argumentów do funkcji itp. Przykłady linterów w Pythonie to: <strong>pylint, flake8, ruff.</strong>&nbsp;<br>&nbsp;</p>



<ol start="3" class="wp-block-list">
<li><strong>Adnotacje typów i type checkery</strong>&nbsp;</li>
</ol>



<p>W kwestii typów zmiennych Python jest bardzo liberalny, ponieważ mamy tu do czynienia z typowaniem dynamicznym. Mimo to określanie typów, jakie przewidujemy dla danych zmiennych, jest postrzegane jako dobra praktyka w Pythonie. Jest to funkcja, która została wprowadzona od wersji Pythona 3.5. Należy mieć na uwadze, że adnotacje typów są jedynie komentarzem i nie są uwzględniane przez program, o ile nie ma zewnętrznej biblioteki, która by je interpretowała. Używając jednak PyCharma, jednego z najpopularniejszych IDE dla Pythona, możemy odnieść korzyści z adnotacji typów natychmiastowo. PyCharm posiada wbudowany type checker, dzięki czemu będziemy widzieć różne podpowiedzi dotyczące typów. Inne popularne zewnętrzne type checkery to: <strong>mypy, pyright </strong>czy też<strong> pyre.</strong>&nbsp;</p>



<p>Rekomendacja dotycząca omówionych narzędzi bardzo przypadła mi do gustu. Według prelegentów Python Summit 2024 dobrym wyborem będzie <strong>ruff</strong>, ponieważ świetnie sprawdza się zarówno jako formater, jak i linter. Zastępuje inne narzędzia oraz jest bardzo szybki. Dodatkowym argumentem, by się bliżej przyjrzeć tej bibliotece, jest to, że w planach jest rozszerzenie jej funkcjonalności również o type checker. Jednak na ten moment należy korzystać ze sprawdzonych i popularnych narzędzi do sprawdzania typów, takich jak <strong>mypy </strong>oraz <strong>pyright.&nbsp;</strong>&nbsp;</p>



<h2 class="wp-block-heading" id="Asystenci-AI-jako-wsparcie-produktywnej-pracy">Asystenci AI jako wsparcie produktywnej pracy</h2>



<p>Na koniec temat, bez którego trudno obecnie wyobrazić sobie przyszłość programowania – mianowicie narzędzia sztucznej inteligencji. Poza wspomnianymi tradycyjnymi narzędziami do usprawniania pracy w Pythonie podczas konferencji w prezentacjach osobną część poświęcono nowoczesnym podejściom do tworzenia oprogramowania wykorzystującym asystentów AI.&nbsp;&nbsp;</p>



<p>O ile obecnie raczej nie ma co liczyć na to, że napiszą za nas cały program, o tyle mogą świetnie się sprawdzić jako usprawnienie pracy. Zainstalowanie takiej wtyczki jak chociażby Copilot może przyspieszyć proste operacje czy też tworzenie komentarzy dzięki trafnym podpowiedziom.&nbsp;&nbsp;</p>



<p>Jeśli nie pamiętamy składni, argumentów biblioteki etc., sprawdzanie dokumentacji może okazać się już zbędne. Asystenci AI mogą również przyspieszyć pisanie prostych testów jednostkowych. Warto jednak najpierw napisać kilka z nich samodzielnie, by asystent mógł lepiej rozpoznać poprawny wzór.&nbsp;</p>



<p>Poniżej kilka przykładów najbardziej popularnych narzędzi programistycznych.&nbsp;&nbsp;&nbsp;</p>



<ul class="wp-block-list">
<li><strong>GitHub Copilot</strong> – narzędzie analizuje kontekst kodu i pozwala zautomatyzować, a tym samym przyspieszyć uzupełnianie fragmentów kodu. Przydatny w tworzeniu i przeglądzie dokumentacji oraz wyszukiwaniu konkretnych rozwiązań.&nbsp;</li>



<li><strong>Supermaven</strong> – sugeruje zależności i poprawki w kodzie, eliminując błędy i optymalizując wydajność aplikacji. Narzędzie może zasugerować użycie najlepszej biblioteki pod kątem danego projektu, co skraca czas analizy i przyspiesza proces wdrażania nowych rozwiązań.&nbsp;</li>



<li><strong>Cursor AI</strong> – usprawnia pracę programistów Python dzięki inteligentnemu autouzupełnianiu, generowaniu kodu na podstawie języka naturalnego oraz możliwości szybkiego refactoringu.&nbsp;</li>



<li><strong>Tabnine </strong>– pozwala uzupełniać kod w czasie rzeczywistym, co zwiększa produktywność i pomaga unikać błędów składniowych, a także eliminuje powtarzalność zadań związanych z pisaniem kodu.&nbsp;</li>



<li><strong>S</strong><strong>ourcegraph Cody</strong> <strong>– </strong>sprawdza się świetnie w<strong> </strong>zaawansowanym przeszukiwaniu kodu. Pozwala na zrozumienie zależności w projektach oraz – dzięki kontekstowej analizie całej bazy kodu – na szybkie odnajdywanie i poprawianie błędów.&nbsp;</li>
</ul>


</style><div class="promotion-box promotion-box--image-left "><div class="tiles latest-news-once"><div class="tile"><div class="tile-image"><img decoding="async" src="https://nearshore-it.eu/wp-content/uploads/2025/02/Code-Faster-Tlo-2.jpg" alt="Code Faster Tlo 2" title="Python i AI, Float i nie tylko – czyli jak produktywniej pracować z Pythonem?  4"></div><div class="tile-content"><p class="entry-title client-name">AI w programowaniu | bezpłatny e-book</p>
Zautomatyzuj kodowanie z AI! Pobierz darmowy e-book i odkryj nowe możliwości
<br /><br />
<a class="btn btn-primary" href="https://www.engage.inetum.com/ebook-code-faster-build-smarter/" target="_blank" rel="noopener">Pobierz teraz!</a></div></div></div></div>



<h2 class="wp-block-heading" id="Podsumowanie">Podsumowanie</h2>



<p>Mnogość dostępnych technologii w świecie IT potrafi przyprawić o zawrót głowy. Samo określenie roli w projekcie IT jeszcze nie determinuje wyboru narzędzi, z których będziemy korzystać. Decydować o tym będą w głównej mierze wymagania systemu. Czy powinien być nastawiony na wydajne przetwarzanie dużych ilości danych, czy może bardziej istotna jest prostota w implementacji i szybkie wdrożenie rozwiązania kosztem niższej wydajności? Odpowiedzenie sobie na te pytania czasem nie wystarczy, ponieważ bywa, że kilka technologii spełnia wszystkie wymagania i wybór sprowadza się do względów czysto estetycznych i preferencji osobistych.&nbsp;&nbsp;</p>



<p>Na szczęście są społeczności i organizacje, które skupiają ludzi zainteresowanych określoną tematyką i pomagają odnaleźć się w gąszczu wiedzy oraz poszerzać horyzonty, by być na bieżąco. Dla osób związanych zawodowo z językiem programowania Python takim miejscem jest właśnie konferencja Python Summit. Prelekcje dostępne w trakcie Python Summit 2024 i zagadnienia, które omówiłem, stanowią tylko mały wycinek wiedzy, jaki można było wynieść z tego spotkania. Zapewniam, że każdy znalazłby coś dla siebie, nawet jeśli wybrane przeze mnie tematy nie są w centrum zainteresowania danego programisty.&nbsp;</p>



<p>Przeczytaj także nasze artykuły dotyczące bibliotek Python:&nbsp;&nbsp;</p>



<ul class="wp-block-list">
<li><a href="https://nearshore-it.eu/pl/artykuly/numpy-wstep-do-biblioteki-python/" target="_blank" rel="noreferrer noopener">NumPy</a>&nbsp;</li>



<li><a href="https://nearshore-it.eu/pl/artykuly/biblioteka-matplotlib/" target="_blank" rel="noreferrer noopener">Matplotlib</a>&nbsp;</li>



<li><a href="https://nearshore-it.eu/pl/artykuly/biblioteki-python-pandas/" target="_blank" rel="noreferrer noopener">Pandas</a>&nbsp;</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://nearshore-it.eu/pl/artykuly/python-i-ai/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Biblioteki Python &#8211; Pandas. Poznaj możliwości analizy i przetwarzania danych </title>
		<link>https://nearshore-it.eu/pl/artykuly/biblioteki-python-pandas/</link>
					<comments>https://nearshore-it.eu/pl/artykuly/biblioteki-python-pandas/#respond</comments>
		
		<dc:creator><![CDATA[Piotr Ludwinek]]></dc:creator>
		<pubDate>Wed, 09 Aug 2023 10:12:23 +0000</pubDate>
				<category><![CDATA[Artykuły]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://nearshore-it.eu/artykuly/biblioteki-python-pandas/</guid>

					<description><![CDATA[Jak łatwo wczytywać, przetwarzać i analizować dane w Pythonie? Poznaj darmową bibliotekę w języku Python: Pandas.]]></description>
										<content:encoded><![CDATA[
<p>Pandas to darmowa biblioteka w języku Python, która w znaczny sposób rozszerza możliwości analizy i przetwarzania danych. Biblioteka ta jest jednym z najważniejszych narzędzi w środowisku Python. Używana jest powszechnie jako wsparcie w różnych obszarach przemysłu. Po przeczytaniu tego artykułu dowiesz się<strong>, jak łatwo wczytywać, przetwarzać i analizować dane w Pythonie</strong>. Ta umiejętność jest ceniona w wielu dziedzinach, od finansów po rozwiązywanie problemów inżynierskich.</p>



<p></p>



<div class="table-of-contents">
    <p class="title"></p>
    <ol>
                    <li><a href="#Biblioteki-Python:-Pandas.-Dlaczego-warto-ją-poznać?-">1.  Biblioteki Python: Pandas. Dlaczego warto ją poznać? </a></li>
                    <li><a href="#Kiedy-sprawdzi-się-biblioteka-Pandas?-">2.  Kiedy sprawdzi się biblioteka Pandas? </a></li>
                    <li><a href="#Przykładowe-zastosowania-biblioteki-Pandas">3.  Przykładowe zastosowania biblioteki Pandas.</a></li>
                    <li><a href="#Jak-zainstalować-Pandas?-">4.  Jak zainstalować Pandas? </a></li>
                    <li><a href="#Jak-zaimportować-Pandas-do-swojego-projektu?-">5.  Jak zaimportować Pandas do swojego projektu? </a></li>
                    <li><a href="#Ramki-danych-i-serie-–-Pandas-DataFrame-i-Series-">6.  Ramki danych i serie – Pandas DataFrame i Series </a></li>
                    <li><a href="#Wczytywanie-danych-z-różnych-źródeł">7.  Wczytywanie danych z różnych źródeł </a></li>
                    <li><a href="#Podstawowe-operacje-na-danych">8.  Podstawowe operacje na danych </a></li>
                    <li><a href="#Wybieranie,-filtrowanie-i-sortowanie-danych">9.  Wybieranie, filtrowanie i sortowanie danych </a></li>
                    <li><a href="#Użycie-funkcji-apply-i-map">10.  Użycie funkcji apply i map </a></li>
                    <li><a href="#Czyszczenie-i-naprawa-brakujących-danych">11.  Czyszczenie i naprawa brakujących danych</a></li>
                    <li><a href="#Podstawowe-operacje-statystyczne-i-grupowanie-danych-">12.  Podstawowe operacje statystyczne i grupowanie danych </a></li>
                    <li><a href="#Przykładowa-analiza-danych-z-użyciem-Pandas-">13.  Przykładowa analiza danych z użyciem Pandas </a></li>
                    <li><a href="#Pandas,-porady-i-najpopularniejsze-funkcje-(cheat-sheet)-">14.  Pandas, porady i najpopularniejsze funkcje (cheat sheet) </a></li>
                    <li><a href="#Podsumowanie">15.  Podsumowanie </a></li>
            </ol>
</div>


<h2 class="wp-block-heading" id="Biblioteki-Python:-Pandas.-Dlaczego-warto-ją-poznać?-">Biblioteki Python: Pandas. Dlaczego warto ją poznać?&nbsp;</h2>



<p>Biblioteka została stworzona, aby ułatwić pracę z różnego rodzaju danymi, które nie zawsze są kompletne lub wymagają odpowiedniej obróbki w celu ich dalszego przetwarzania. Pandas dostarcza elastyczne i łatwe w użyciu struktury danych i narzędzia (chociaż nie zawsze wydajne, w dalszej części zdradzę, w jaki sposób sobie z tym poradzić). Obok takich bibliotek jak <strong>NumPy, Matplotlib, Seaborn czy Scikit-Learn</strong> przez wiele lat, biblioteka Pandas zapracowała na popularność i uznanie wśród kadry akademickiej, analityków, inżynierów i pasjonatów zainteresowanych pracą z danymi.&nbsp;</p>



<p><strong>Jest to idealne narzędzie do zarządzania danymi i analizowania ich (z pomocą dodatkowych bibliotek) w małych i średnich zbiorach</strong>. W przypadku zbiorów rozległych, popularnych w obszarze związanym z Big Data, przetwarzanie jest możliwe, ale wraz ze wzrostem ilości danych, rośnie prawdopodobieństwo problemów z pamięcią i wydajnością.&nbsp;</p>



<h2 class="wp-block-heading" id="Kiedy-sprawdzi-się-biblioteka-Pandas?-">Kiedy sprawdzi się biblioteka Pandas?&nbsp;</h2>



<p>Biblioteka Pandas jest dobrze przystosowana do pracy z wykorzystaniem różnych typów i źródeł danych:&nbsp;</p>



<ul class="wp-block-list">
<li>Tablicowe dane z kolumnami różnego typu (np. <strong>Excel</strong>, <strong>SQL</strong>)&nbsp;</li>



<li>Szeregi czasowe (<strong>time-series</strong>)&nbsp;</li>



<li>Dane z etykietami wierszy i kolumn (<strong>labeled data</strong>)&nbsp;</li>
</ul>



<p></p>



<h2 class="wp-block-heading" id="Przykładowe-zastosowania-biblioteki-Pandas">Przykładowe zastosowania biblioteki Pandas</h2>



<p>Oto kilka przykładów zastosowań biblioteki Pandas:&nbsp;</p>



<ul class="wp-block-list">
<li>Wczytywanie różnych formatów danych (<strong>CSV</strong>, <strong>Excel</strong>, <strong>SQL</strong>, <strong>pliki płaskie</strong> itd.)&nbsp;</li>



<li><strong>Filtrowanie</strong>, <strong>sortowanie </strong>i inne operacje z danymi&nbsp;</li>



<li>Czyszczenie danych (<strong>usuwanie wartości NaN </strong>– <strong>Not a Number</strong>), <strong>uśrednianie</strong>, <strong>zastępowanie wartości </strong>itp.)&nbsp;</li>



<li>Szybkie i efektywne <strong>obliczanie statystyk </strong>i przeprowadzanie operacji na danych&nbsp;</li>



<li><strong>Wizualizacja danych</strong> za pomocą wykresów&nbsp;</li>
</ul>



<p></p>



<p>Zanim zaczniemy korzystać z biblioteki Pandas, upewnijmy się, że jest ona zainstalowana w środowisku Python.&nbsp;</p>



<h2 class="wp-block-heading" id="Jak-zainstalować-Pandas?-">Jak zainstalować Pandas?&nbsp;</h2>



<p>Instalacja Pandas jest bardzo prosta i może zostać wykonana za pomocą narzędzia pip, które jest domyślnym menedżerem pakietów Python. Zakładam, że Python jest już zainstalowany na twoim komputerze, a jeżeli nie – tutaj jest <a href="https://wiki.python.org/moin/BeginnersGuide/Download" target="_blank" rel="noreferrer noopener">instrukcja, jak to zrobić</a>. &nbsp;</p>



<p>Następnie wystarczy otworzyć terminal i wpisać poniższą komendę:&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pip install pandas</pre>



<p>Możliwe, że będzie wymagane nadanie uprawnień do wykonania tej komendy (np. przy użyciu <strong>sudo </strong>na systemach Unixowych lub uruchamiając terminal z prawami administratora<strong> w systemie Windows</strong>), a w przypadku korzystania z konkretnego wirtualnego środowiska Python (np. <strong>venv</strong> lub <strong>conda</strong>), konieczne będzie aktywowanie tego środowiska przed zainstalowaniem pakietu. Więcej o wirtualnych środowiskach <a href="https://docs.python.org/3/library/venv.html" target="_blank" rel="noopener">przeczytasz w dokumentacji</a>.</p>



<p>Jeżeli używasz <strong>Anacondy</strong>, możesz zainstalować Pandas za pomocą polecenia:&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">conda install pandas</pre>



<h2 class="wp-block-heading" id="Jak-zaimportować-Pandas-do-swojego-projektu?-">Jak zaimportować Pandas do swojego projektu?&nbsp;</h2>



<p>Gdy biblioteka Pandas jest już zainstalowana, możemy zacząć z niej korzystać. Pierwszym krokiem jest zaimportowanie biblioteki do naszego skryptu lub projektu. Import biblioteki Pandas nie różni się niczym od jakiejkolwiek innej biblioteki w Pythonie.&nbsp;</p>



<p>Możemy to zrobić za pomocą poniższego kodu:&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd</pre>



<p>W Pythonie Pandas zazwyczaj importuje się pod aliasem ‘pd’, który jest krótkim i powszechnie przyjętym skrótem. Teraz, kiedy chcemy użyć funkcji z biblioteki Pandas, zamiast wpisywać pełne słowo „pandas”, używamy skrótu „pd”. Analogicznie sytuacja wygląda w przypadku <a href="https://nearshore-it.eu/pl/artykuly/numpy-wstep-do-biblioteki-python/" target="_blank" data-type="link" data-id="https://nearshore-it.eu/pl/artykuly/numpy-wstep-do-biblioteki-python/" rel="noreferrer noopener">biblioteki NumPy</a> (‘np’), o której pisałem w jednym z poprzednich artykułów.  </p>



<p>Przykładowo, jeśli chcielibyśmy stworzyć DataFrame (<strong>jedną z kluczowych struktur danych w Pandas</strong>), kod wyglądałby następująco:&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

data = {

    'column_1': [3, 2, 0, 1],

    'column_2': [0, 3, 7, 2]

}

example_df = pd.DataFrame(data)

print(example_df)</pre>



<p>Jak widać na powyższym przykładzie, użyłem klasy DataFrame, podstawowej struktury, którą udostępnia nam Pandas. W kolejnym rozdziale omówimy inne dwie podstawowe struktury danych – <strong>Series </strong>i <strong>DataFrame</strong>.&nbsp;</p>



<h2 class="wp-block-heading" id="Ramki-danych-i-serie-–-Pandas-DataFrame-i-Series-">Ramki danych i serie – Pandas DataFrame i Series&nbsp;</h2>



<p>Głównym celem biblioteki Pandas jest ułatwienie pracy z danymi, dlatego Pandas wprowadza dwie struktury danych: <strong>Series </strong>i <strong>DataFrame</strong>. Zrozumienie tych struktur jest kluczowe do efektywnego korzystania z tej biblioteki.&nbsp;</p>



<h3 class="wp-block-heading">Series&nbsp;</h3>



<p><strong>Series to jednowymiarowa struktura danych, a właściwie tablicy (ndarray), podobna do listy lub kolumny w tabeli.</strong> Każdy element (np. liczby całkowite, listy, obiekty, tuple) w Series ma przypisany identyfikator, który nazywany jest indeksem. Series przechowuje dane jednego typu.&nbsp;</p>



<p>Przykładowo, stworzenie Series, który zawiera listę elementów, może wyglądać tak:&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

vals_sr = pd.Series(["Val_1", "Val_2", "Val_3", "Val_4", "Val_5"])

print(vals_sr)</pre>



<p>Jeżeli chodzi o indeks, to domyślnie są to liczby całkowite (<strong>integer</strong>), zaczynając od zera. Indeks można zmienić, np. nadając etykiety. W takim przypadku należy rozszerzyć nasz kod odpowiedzialny za tworzenie Series. Służy do tego parametr index, a kod wygląda następująco:&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

vals_sr = pd.Series(["Val_1", "Val_2", "Val_3", "Val_4", "Val_5"], index=["A", "B", "C", "D", "E"])

print(vals_sr)</pre>



<p>Warto pamiętać, że liczba “etykiet” powinna odpowiadać liczbie elementów w Series. W przeciwnym razie Python interpreter zwróci nam błąd (<strong>ValueError</strong>). Jeżeli nie chcesz wyświetlać całego Series, a jedynie sprawdzić, jakie indeksy zostały nadane lub wyświetlić tylko wartości bez indeksów, możesz skorzystać z następującego fragmentu kodu:</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

vals_sr = pd.Series(["Val_1", "Val_2", "Val_3", "Val_4", "Val_5"], index=["A", "B", "C", "D", "E"])

print(vals_sr)

print(vals_sr.index) # -- zwraca obiekty typu Index

print(vals_sr.values) # -- zwraca obiekt typu ndarray</pre>



<h3 class="wp-block-heading">DataFrame</h3>



<p><strong>DataFrame to dwuwymiarowa struktura danych podobna do tabeli w bazie danych lub arkusza kalkulacyjnego Excela</strong>. DataFrame składa się z wierszy i kolumn – każda kolumna w DataFrame to Series. Jak pewnie się domyślasz, mimo że dana kolumna zawiera tylko jeden typ danych, to DataFrame może zawierać wiele kolumn, z których każda ma dane innego typu. Przykładem może być utworzenie DataFrame z danych na temat transakcji dokonywanych przez klientów, których identyfikujemy po ID.</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

ct_data = {

    'client_id': ['C34P', 'C35S', 'C35P', 'C97S', 'C58S'],

    'card_transactions': [11, 244, 31, 458, 63]

}

client_transaction_df = pd.DataFrame(ct_data)

print(client_transaction_df)</pre>



<h2 class="wp-block-heading" id="Wczytywanie-danych-z-różnych-źródeł">Wczytywanie danych z różnych źródeł</h2>



<p>Jedną z najważniejszych zalet biblioteki Pandas jest łatwość, z jaką można wczytać dane z różnych źródeł i formatów plików. Do najpopularniejszych należą:&nbsp;</p>



<ul class="wp-block-list">
<li>CSV&nbsp;</li>



<li>Excel (.xlsx)&nbsp;</li>



<li>SQL&nbsp;</li>



<li>Pliki płaskie (flat files, np. plik tekstowy)&nbsp;</li>
</ul>



<p></p>



<p>Dane z pliku CSV można wczytać do DataFrame za pomocą funkcji <strong>pd.read_csv().</strong>&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

df = pd.read_csv('path_to_your_file.csv')

print(df)</pre>



<p>Podobnie, możemy wczytać plik Excela za pomocą funkcji <strong>pd.read_excel().</strong>&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

df = pd.read_excel('path_to_your_file.xlsx')

print(df)</pre>



<p>Aby wczytać wynik zapytania SQL, musimy najpierw utworzyć połączenie do bazy danych. Na przykładzie bazy danych <strong>SQLite </strong>możemy zrobić to w następujący sposób:</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

import sqlite3

# Ustanawianie połączenia do bazy danych

conn = sqlite3.connect("database_name.db")

# Wykonanie zapytania

df = pd.read_sql_query("SELECT * FROM my_table", conn)

print(df)</pre>



<p>Zakładając, że korzystasz z innej bazy danych, musisz zainstalować odpowiedni sterownik dla Pythona i zastąpić sqlite3.connect odpowiednim połączeniem. Jeżeli chcesz dowiedzieć się więcej na temat sqlite, zachęcam cię do odwiedzenia dokumentacji <a href="https://docs.python.org/3/library/sqlite3.html#module-sqlite3" target="_blank" rel="noreferrer noopener">sqlite3</a>.</p>



<p>W następnym rozdziale omówimy podstawowe operacje na danych z wykorzystaniem Series i DataFrame.&nbsp;</p>



<h2 class="wp-block-heading" id="Podstawowe-operacje-na-danych">Podstawowe operacje na danych</h2>



<p>Kiedy już wiesz, jak wczytać dane za pomocą biblioteki Pandas, skupimy się teraz na wybieraniu, filtrowaniu i sortowaniu danych oraz zastosowaniu funkcji<strong> apply i map.</strong></p>



<h2 class="wp-block-heading" id="Wybieranie,-filtrowanie-i-sortowanie-danych">Wybieranie, filtrowanie i sortowanie danych</h2>



<p>Jedną z podstawowych i najczęściej używanych operacji jest wybieranie określonych danych z DataFrame. Pandas umożliwia wybieranie danych na wiele sposobów:&nbsp;</p>



<ul class="wp-block-list">
<li>Wybieranie kolumn: <strong>df[&#8217;nazwa_kolumny&#8217;]</strong>&nbsp;</li>



<li>Wybieranie wierszy za pomocą numerów indeksów: <strong>df.iloc[indeks]</strong>&nbsp;</li>



<li>Wybieranie wierszy za pomocą etykiet indeksów: <strong>df.loc[etykieta]</strong></li>
</ul>



<p></p>



<p>Przykładowy fragment kodu zamieszczam poniżej:&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

ct_data = {

    'client_id': ['C34P', 'C35S', 'C35P', 'C97S', 'C58S'],

    'count': [11, 244, 31, 458, 63]

}

df = pd.DataFrame(ct_data)

print(df)

# Wybieranie kolumny 'client_id'

print(df['client_id'])

 

# Wybieranie pierwszego wiersza

print(df.iloc[0])

# Wybieranie wiersza o etykiecie indeksu zero

print(df.loc[0])</pre>



<p>Filtrowanie to proces wybierania podzbioru danych na podstawie zadanych kryteriów. Przykładowo, możemy chcieć wybrać tylko te transakcje, które są dostępne w ilości większej niż 60:</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">filtered_df = df[df['count'] > 60]

print(filtered_df)</pre>



<p>Sortowanie danych jest prostym procesem, który możemy przeprowadzić za pomocą metody <strong>sort_values()</strong>:</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">sorted_df = df.sort_values('count')

print(sorted_df)</pre>



<h3 class="wp-block-heading">Operacje na kolumnach: dodawanie, usuwanie, zmiana nazw</h3>



<p>Aby dodać nową kolumnę do DataFrame, możemy po prostu przypisać dane do nowej kolumny, jak w poniższym przykładzie:&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">df['amount'] = [1200, 4500, 3000, 28000, 700] # -- dodajemy kolumnę z sumą kwot, na które wykonano transakcje

print(df)
</pre>



<p>Aby usunąć kolumnę, skorzystamy z metody <strong>drop()</strong>:</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">df = df.drop('amount', axis=1)

print(df)</pre>



<p>Zmiana nazwy kolumny jest możliwa za pomocą metody <strong>rename()</strong>:</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">df = df.rename(columns={'client_id': 'client_code', 'count': 'quantity'})

print(df)</pre>



<h2 class="wp-block-heading" id="Użycie-funkcji-apply-i-map">Użycie funkcji apply i map</h2>



<p>Funkcje apply i map pozwalają na zastosowanie wybranej funkcji do każdego elementu zapisanego w Series lub DataFrame. Przykładowo, użycie funkcji z biblioteki NumPy dla kolumny ‘quantity’.</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np

df['log_quantity'] = df['quantity'].apply(np.log)

print(df)</pre>



<p>Metoda map jest podobna do apply, ale działa tylko na Series. Jest często używana do zamiany wartości na podstawie słownika. Przykładowo, dla listy klientów chcemy dodać dodatkową cyfrę w identyfikatorze.</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">code_map = {

    'C34P': '0C34P',

    'C35S': '1C35S',

    'C35P': '1C35P',

    'C97S': '0C97S',

    'C58S': '0C58S'

}

df['client_code'] = df['client_code'].map(code_map)

print(df)</pre>



<h2 class="wp-block-heading" id="Czyszczenie-i-naprawa-brakujących-danych">Czyszczenie i naprawa brakujących danych</h2>



<p>Praca z danymi, które pochodzą ze źródeł rzeczywistych, praktycznie zawsze wiąże się z koniecznością ich czyszczenia lub poprawiania. Często dane zawierają braki, duplikaty lub typy danych, które nie są odpowiednie do planowanej analizy. W tym rozdziale omówię proste sytuacje i pokażę ci,&nbsp;jak radzić sobie z takimi problemami za pomocą narzędzi z biblioteki Pandas.</p>



<h3 class="wp-block-heading">Obsługa brakujących danych (NaN)</h3>



<p>Brakujące dane są oznaczane jako <strong>NaN (Not a Number)</strong>. Pandas oferuje kilka metod do obsługi brakujących danych i są to np.:&nbsp;</p>



<ul class="wp-block-list">
<li>Wypełnianie brakujących danych określoną wartością&nbsp;</li>



<li>Usuwanie wierszy z brakującymi danymi&nbsp;</li>
</ul>



<p></p>



<p>Metoda<strong> fillna() </strong>pozwala na wypełnienie brakujących danych określoną wartością lub za pomocą określonej metody (np. &#8217;<strong>forward fill</strong>&#8217;&nbsp; – <strong>ffill</strong>, &#8217;<strong>backward fill</strong>&#8217;&nbsp; – <strong>bfill</strong>):&nbsp;</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np

data = {

    'A': [1, 2, np.nan],

    'B': [5, np.nan, np.nan],

    'C': [1, 2, 3]

}

df = pd.DataFrame(data)

df_filled_zeros = df.fillna(value=0)  # --Wypełniamy brakujące dane wartością 0

print(df_filled_zeros)</pre>



<p>Możliwe jest też usunięcie wierszy, które zawierają brakujące dane. W przypadku dużego zbioru i niewielkiej liczby “zepsutych” wierszy nie powinno mieć to dużego wpływu na jakość danych, ale przy niewielkim zbiorze usunięcie kilku wierszy może znacząco wpłynąć na późniejszą analizę. Jeżeli jednak zdecydujesz się na usunięcie wybranych wierszy, to możesz użyć metody <strong>dropna()</strong>:.</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">df_dropped = df.dropna()  # Usuwamy wiersze z brakującymi danymi

print(df_dropped)</pre>



<p>Czasami dochodzi do sytuacji, że w naszym zbiorze znajduje się wiele duplikatów, które z punktu widzenia analizy są zbędne. Usunięcie duplikatów jest przydatne szczególnie w sytuacji, gdy stanowią one większość naszego zbioru. Pozbycie się ich pozwoli na odciążenie biblioteki i wydajniejsze operacje np. na kolumnach w DataFrame. Pandas dostarcza metodę <strong>drop_duplicates()</strong>, która pozwala na łatwe usunięcie duplikatów:</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">data = {

    'client_id': ['C34P', 'C35S', 'C35P', 'C35P','C97S', 'C58S', 'C58S'],

    'count': [11, 244, 31, 31, 458, 63, 63]

}

df = pd.DataFrame(data)

df = df.drop_duplicates()  # Usuwamy duplikaty

print(df)</pre>



<p>Więcej o pracy z brakującymi danymi dowiesz się z obszernej <a href="https://pandas.pydata.org/docs/user_guide/missing_data.html" target="_blank" rel="noreferrer noopener">dokumentacji na Pydata.org</a>.&nbsp;&nbsp;</p>



<p>Jeżeli pracujesz na danych dostarczanych przez inne osoby lub firmy, możesz spotkać się z danymi numerycznymi (liczby całkowite, cyfry, liczby zmiennoprzecinkowe), które przedstawione są jako ciągi znaków (<strong>string</strong>). Czyli np. liczba całkowita 200 w DataFrame zapisana jest jako string o wartości ‘200’. Interpreter potraktuje to jako tekst, a nie liczbę. Jeżeli chcesz wykonywać na takich danych operacje statystyczne lub matematyczne, <strong>konieczne jest zmienienie typu danych kolumny</strong> (w tym przypadku z ‘str’ na ‘int’). Możemy to zrobić za pomocą metody <strong>astype()</strong>:</p>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import pandas as pd

data = {

    'client_id': ['C34P', 'C35S', 'C35P', 'C97S', 'C58S'],

    'count': ['11', '244', '31', '458', '63']

}

df = pd.DataFrame(data)

df['count'] = df['count'].astype(int)  # Zmieniamy typ danych kolumny 'count' na int

print(df)</pre>



<p>Podsumowując, czyszczenie danych to zazwyczaj niezbędny krok w procesie przetwarzania i analizy danych. Pandas oferuje wiele narzędzi, które ułatwiają ten proces. Jeżeli chcesz dowiedzieć się więcej o pracy z plikami tekstowymi, oto link do dokumentacji: </p>
]]></content:encoded>
					
					<wfw:commentRss>https://nearshore-it.eu/pl/artykuly/biblioteki-python-pandas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib </title>
		<link>https://nearshore-it.eu/pl/artykuly/biblioteka-matplotlib/</link>
					<comments>https://nearshore-it.eu/pl/artykuly/biblioteka-matplotlib/#respond</comments>
		
		<dc:creator><![CDATA[Piotr Ludwinek]]></dc:creator>
		<pubDate>Tue, 16 May 2023 05:08:54 +0000</pubDate>
				<category><![CDATA[Artykuły]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://nearshore-it.eu/artykuly/biblioteka-matplotlib/</guid>

					<description><![CDATA[W tym artykule chciałbym wprowadzić cię do kolejnej z najpopularniejszych, obok NumPy i SciPy, bibliotek języka Python, czyli Matplotlib. Biblioteka Matplotlib pozwala na wizualizacje danych z wykorzystaniem różnego rodzaju wykresów, takich jak słupkowe, kołowe, histogramy i mapy. W dalszych akapitach zapoznasz się z podstawowymi i średniozaawansowanymi możliwościami tej biblioteki, która na co dzień wykorzystywana jest przez miliony naukowców, inżynierów i analityków na całym świecie.]]></description>
										<content:encoded><![CDATA[
<div class="table-of-contents">
    <p class="title"></p>
    <ol>
                    <li><a href="#Analiza-danych-a-odpowiednia-biblioteka-w-języku-Python">1.  Analiza danych a odpowiednia biblioteka w języku Python </a></li>
                    <li><a href="#Instalacja">2.  Instalacja</a></li>
                    <li><a href="#wykresów">3.  Podstawy tworzenia i omówienie struktury wykresów </a></li>
                    <li><a href="#wykresów-w-Matplotlib">4.  Popularne rodzaje wykresów w Matplotlib </a></li>
                    <li><a href="#Dostosowanie-wykresu">5.  Dostosowanie wykresu </a></li>
                    <li><a href="#Wykresy-wieloosiowe">6.  Wykresy wieloosiowe </a></li>
                    <li><a href="#Podsumowanie-i-cheat-sheet">7.  Podsumowanie i cheat sheet </a></li>
            </ol>
</div>


<h2 class="wp-block-heading" id="Analiza-danych-a-odpowiednia-biblioteka-w-języku-Python">Analiza danych a odpowiednia biblioteka w języku Python</h2>



<p>Jeżeli kiedykolwiek zdarzyło ci się wykonywać <a href="https://nearshore-it.eu/pl/artykuly/wizualizacja-danych/" data-type="link" data-id="https://nearshore-it.eu/pl/artykuly/wizualizacja-danych/">analizę danych</a>, to wiesz, jak ważne jest przedstawienie wyników pracy w sposób szybki i czytelny. Możesz łatwo zobrazować pewne wzorce, anomalie i trendy, które są wynikiem twojej pracy. Jest to szczególnie przydatne w przygotowaniu prezentacji lub raportów biznesowych dla osób nietechnicznych. Wizualizacja wyników pozwala na łatwiejsze przedstawienie obserwacji, a korzystając z narzędzi dostarczonych przez bibliotekę Matplotlib, masz pewność, że cały proces jest wydajny, prosty i elastyczny. Za pomocą kilku linijek kodu otrzymujesz dostęp do podstawowych i zaawansowanych funkcji, które są bezpłatne, bo Matplotlib jest biblioteką open-source.</p>



<p>Szczególnie wydajne jest połączenie możliwości tej biblioteki z innymi bibliotekami naukowymi, takimi jak <a href="https://nearshore-it.eu/pl/artykuly/numpy-wstep-do-biblioteki-python/" target="_blank" data-type="link" data-id="https://nearshore-it.eu/pl/artykuly/numpy-wstep-do-biblioteki-python/" rel="noreferrer noopener"><strong>NumPy</strong></a>, <strong><a href="https://nearshore-it.eu/pl/artykuly/biblioteki-python-pandas/" data-type="link" data-id="https://nearshore-it.eu/pl/artykuly/biblioteki-python-pandas/">Pandas</a> </strong>czy <strong>SciPy</strong>.</p>



<p>Zakładam, że znasz podstawy języka Python. Jeżeli nie, to nie przejmuj się, ponieważ kod, który tutaj przedstawiam, możesz łatwo zrozumieć i uruchomić po przejściu jednego z kursów programowania w języku Python dostępnych w sieci. Podstawowa składnia wystarczy ci do skorzystania z tego artykułu. Przejdźmy więc do instalacji i konfiguracji środowiska.</p>



<h2 class="wp-block-heading" id="Instalacja">Instalacja biblioteki Matplotlib</h2>



<p>Na komputerze powinien znajdować się zainstalowany Python w wersji <strong>3.x.</strong></p>



<p>Bibliotekę Matplotlib możesz zainstalować za pomocą menedżera pakietów ‘pip’. Otwórz terminal lub wiersz poleceń (lub PowerShell) dla systemu Windows i wpisz komendę:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pip install matplotlib</pre>



<p>Jeżeli korzystasz z Pythona <strong>2.x</strong> to skorzystaj z komendy ‘pip2’.</p>



<p>Niektórzy użytkownicy używają narzędzia <strong>Anaconda </strong>lub <strong>Miniconda</strong>. W tym przypadku skorzystaj z menadżera pakietów ‘conda’:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">conda install matplotlib</pre>



<p>W przypadku poprawnego zakończenia procesu instalacji możemy zaimportować bibliotekę do naszego projektu. Zazwyczaj importuje się główny moduł tej biblioteki, czyli ‘pyplot’. Zawiera on niezbędne funkcje do generowania wykresów.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import matplotlib.pyplot as plt</pre>



<p>Sama biblioteka korzysta z domyślnych stylów podczas „upiększania” i modyfikacji wykresów. Są to np. modyfikacje kolorystyczne, czcionki, dodawanie dodatkowych informacji, legend itd. Jeżeli chcesz zapoznać się z różnymi stylami, które oferuje Matplotlib, to zajrzyj do <a href="https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html" target="_blank" data-type="URL" data-id="https://matplotlib.org/stable/gallery/style_sheets/style_sheets_reference.html" rel="noreferrer noopener">dokumentacji </a>lub skorzystaj z komendy ‘<strong>print</strong>’:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">print(plt.style.available)</pre>



<p>W celu użycia konkretnego stylu w twoim projekcie skorzystaj z funkcji:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">plt.style.use(‘nazwa_stylu’) # np. ‘seaborn’</pre>



<p>Konfigurację możesz dostosować według własnych preferencji, modyfikując konkretne wartości parametrów z użyciem funkcji:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">plt.rcParams.update({'font.size': 10, 'figure.figsize': (10, 8)})</pre>



<p>W tym artykule będę korzystał z domyślnego stylu, ale zachęcam cię do wybrania i dostosowania tego, który najbardziej ci odpowiada. Przejdźmy teraz do podstaw tworzenia wykresów w <strong>Matplotlib</strong>.</p>



<h2 class="wp-block-heading" id="wykresów">Podstawy tworzenia i omówienie struktury wykresów</h2>



<p>Koncepcję i strukturę wykresu w bibliotece Matplotlib najprościej można wyjaśnić za pomocą wykresu liniowego. Wykresy tworzone są na podstawie tzw. Figur ‘<strong>figure</strong>’. Figura może zostać opisana jako kontener na jedną lub więcej osi ‘<strong>axes</strong>’. Osiami określamy powierzchnię wykresu, na której rysowane są dane. Jeżeli mowa o wykresie 2D, to zawierał on będzie osie X i Y, a np. wykres 3D X, Y i Z. Do danego wykresu przypisać można również elementy opisujące. Mogą to być etykiety osi, legendy, tytuły i wartości, np. nad słupkami.</p>



<p>W celu utworzenia prostego wykresu liniowego skorzystamy ze wspomnianej wcześniej biblioteki <strong>NumPy </strong>(odsyłam do mojego poprzedniego artykułu). Stworzymy listę zawierającą wartości liczbowe dla osi X oraz skorzystamy z wartości funkcji sinus dla osi Y.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np 

import matplotlib.pyplot as plt 

# Przygotowanie danych 

x = np.linspace(0, 10, 100) 

y = np.sin(x) </pre>



<p>W celu utworzenia wykresu liniowego o krzywej sinusoidalnej użyjemy funkcji ‘plot()’, a następnie wyświetlimy go za pomocą funkcji ‘show()’. Jeżeli uruchomisz poniższy kod, to powinien wyświetlić ci się na ekranie wykres liniowy, który przedstawia funkcję sinus.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">plt.plot(x, y)  # Rysowanie wykresu liniowego 

plt.show()  # Wyświetlenie wykresu </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="762" height="400" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_1.png" alt="Rys. 1. Wykres liniowy przedstawiający funkcję sinus. " class="wp-image-32111" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  5" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_1.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_1-300x157.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_1-495x260.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 1. Wykres liniowy przedstawiający funkcję sinus.</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Jak się pewnie domyślasz, wykres ten nie jest zbyt czytelny, ponieważ poza wartościami same osie nie zostały opisane, wykres nie posiada tytułu, a więc nie jesteśmy w stanie określić, co on tak naprawdę przedstawia. Możemy się domyślać, że chodzi o funkcję sinus, ale lepiej poprawić ten wykres, żeby był bardziej czytelny, szczególnie dla osoby bez znajomości wybranych zagadnień matematycznych. Dodamy zatem tytuł wykresu ‘<strong>title()</strong>’, etykiety osi ‘<strong>xlabel()</strong>’, ‘<strong>ylabel()</strong>’ oraz legendę.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">plt.plot(x, y, label='sin(x)')  # Dodanie etykiety dla serii danych (do legendy) 

plt.xlabel('X')  # Etykieta osi X 

plt.ylabel('Y')  # Etykieta osi Y 

plt.title('Wykres funkcji sinus')  # Tytuł wykresu 

plt.legend()  # Dodanie legendy 

plt.show()  # Wyświetlenie wykresu </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="762" height="400" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_2.png" alt="oprawiony wykres funkcji sinus" class="wp-image-32114" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  6" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_2.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_2-300x157.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_2-495x260.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 2. Poprawiony wykres funkcji sinus (dodano tytuł, opisy osi oraz legendę).</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Wiesz już, jak stworzyć prosty wykres liniowy, ale co w przypadku gdy istnieje potrzeba prezentacji danych za pomocą innych wykresów? Zajmiemy się nimi w dalszej części, gdzie omówię wybrane ich rodzaje.</p>



<h2 class="wp-block-heading" id="wykresów-w-Matplotlib">Popularne rodzaje wykresów w Matplotlib</h2>



<p>Omawiana biblioteka pozwala na dostosowanie naszych wizualizacji do konkretnego przypadku, a przykłady, które podaję, to tylko niektóre z oferowanych możliwości. Jeżeli spędzisz z tą biblioteką więcej czasu, to z pewnością poznasz wiele więcej funkcji i możliwości, a to przełoży się na jeszcze lepsze przedstawianie danych i intuicyjne przekazywanie informacji.</p>



<p>Poza wykresem liniowym popularne są także:&nbsp;</p>



<ol class="wp-block-list">
<li><strong>Wykresy punktowe (Scatter plot)</strong> – zbiór punktów, które nie są ze sobą połączone. Używany w wizualizacji korelacji pomiędzy zmiennymi, rozkładu wartości albo określania grup. Przykładem zastosowania może być analiza badania demograficznego pod kątem zależności między wiekiem a zarobkami lub doświadczeniem grupy badanej. Poniżej znajduje się fragment kodu, który pozwala utworzyć wykres punktowy.</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np 

import matplotlib.pyplot as plt 

# Przykładowe dane 

wiek = np.random.randint(18, 65, 100) 

zarobki = np.random.normal(50000, 10000, 100) + (wiek - 18) * 1000 

plt.scatter(wiek, zarobki) 

plt.xlabel('Wiek') 

plt.title('Związek między wiekiem a rocznymi zarobkami') 

plt.show() </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="762" height="449" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_3.png" alt="Rys. 3. Przykład wykresu punktowego zależności pomiędzy wiekiem, a zarobkami. " class="wp-image-32117" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  7" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_3.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_3-300x177.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_3-495x292.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 3. Przykład wykresu punktowego zależności pomiędzy wiekiem, a zarobkami.</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>2. <strong>Histogram</strong> – jest rodzajem wykresu słupkowego, który ilustruje rozkład wartości danych. Wykorzystywany do wizualizacji częstotliwości występowania wartości w wybranym zbiorze danych. Prostym przykładem może być wizualizacja rozkładu ocen w grupie uczniów. Poniżej zamieszczam kod, za pomocą którego wygenerujesz histogram.&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">oceny = np.random.normal(3.5, 0.5, 200) 

plt.hist(oceny, bins=20, alpha=0.7, label='Oceny uczniów') 

plt.xlabel('Ocena') 

plt.ylabel('Częstotliwość') 

plt.title('Rozkład ocen w grupie uczniów') 

plt.legend() 

plt.show() </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="762" height="398" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_4.png" alt="Rys. 4. Przykład histogramu dla częstotliwości występowania wybranych danych. " class="wp-image-32120" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  8" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_4.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_4-300x157.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_4-495x259.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 4. Przykład histogramu dla częstotliwości występowania wybranych danych.</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>3. <strong>Wykres słupkowy</strong> – jeden z najpopularniejszych wykresów, który przedstawia dane za pomocą poziomych lub pionowych słupków. Zazwyczaj ułatwia porównanie danych, które pogrupowano w konkretne kategorie. Przykładem może być porównanie średnich wyników drużyn w lidze sportowej. Poniżej zamieszczam kod i zrzut ekranu przykładowego wykresu.&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">plt.bar(druzyny, srednie_wyniki, alpha=0.7) 

plt.xlabel('Drużyny') 

plt.ylabel('Średni wynik') 

plt.title('Porównanie średnich wyników drużyn w lidze sportowej') 

plt.show() </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="762" height="452" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_5.png" alt="Rys. 5. Przykład wykresu słupkowego średniego wyniku drużyn w lidze sportowej. " class="wp-image-32123" style="aspect-ratio:1.6855828220858895;width:1099px;height:auto" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  9" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_5.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_5-300x178.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_5-495x294.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 5. Przykład wykresu słupkowego średniego wyniku drużyn w lidze sportowej.</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>4. <strong>Wykres kołowy</strong> – dane znajdują się w sektorach w obrębie koła. Doskonale obrazuje proporcje poszczególnych elementów lub grup względem całości. Przykładem może być wykres na podstawie analizy udziału dostawców energii na rynku w Unii Europejskiej. Kod i wykres zostały zamieszczone poniżej.&nbsp;&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">firmy = ['Firma A', 'Firma B', 'Firma C', 'Firma D'] 

udzialy_rynku = [35, 25, 20, 20] 

plt.pie(udzialy_rynku, labels=firmy, autopct='%.1f%%', startangle=90) 

plt.axis('equal') 

plt.title('Struktura rynkowa w sektorze energetycznym') 

plt.show() </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="762" height="450" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_6.png" alt="Rys. 6. Wykres kołowy obrazujący procentowy udział 4 firm na rynku energii. " class="wp-image-32126" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  10" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_6.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_6-300x177.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_6-495x292.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 6. Wykres kołowy obrazujący procentowy udział 4 firm na rynku energii.</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>5. <strong>Mapa ciepła (heatmap)</strong> – nie jest typowym wykresem znanym np. ze szkoły, ponieważ występuje w postaci macierzy, na której kolory odpowiadają wartościom konkretnych komórek. Dobrze obrazuje korelacje i gradienty wartości oraz wykrywa wzorce w przypadku danych dwuwymiarowych. Przykładem użycia może być poziom ekspresji genów w zależności od stworzonych warunków eksperymentalnych.&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">data = np.random.rand(10, 10) 

plt.imshow(data, cmap='hot', interpolation='nearest') 

plt.colorbar() 

plt.title('Mapa ciepła (heatmap)') 

plt.show() 

# Mapa ciepła dla ekspresji genów 

geny = 50 

warunki = 10 

ekspresja_genow = np.random.rand(geny, warunki) 

plt.imshow(ekspresja_genow, cmap='coolwarm', aspect='auto') 

plt.colorbar() 

plt.xlabel('Warunki eksperymentalne') 

plt.ylabel('Geny') 

plt.title('Poziomy ekspresji genów w warunkach eksperymentalnych') 

plt.show() </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="762" height="387" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_7.png" alt="Rys. 7 Przykład mapy ciepła dla wartości losowych. " class="wp-image-32129" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  11" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_7.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_7-300x152.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_7-495x251.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 7 Przykład mapy ciepła dla wartości losowych.</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>6. <strong>Wykres konturowy</strong> – używany jest do obrazowania danych trójwymiarowych w postaci linii poziomicy na powierzchni dwuwymiarowej. Wizualizuje wartości, które są równe dla konkretnej funkcji na danej płaszczyźnie. Przykładem może być np. wizualizacja danych pogodowych lub wartości ciśnienia atmosferycznego na mapie meteorologicznej.&nbsp;&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">x = np.linspace(-10, 40, 100)  # długość geograficzna dla Europy (w przybliżeniu) 

y = np.linspace(35, 70, 100)   # szerokość geograficzna dla Europy (w przybliżeniu) 

X, Y = np.meshgrid(x, y) 

cisnienie = 1000 + 10 * np.sin(np.sqrt((X - 10)**2 + (Y - 50)**2)) 

plt.contour(X, Y, cisnienie, levels=20, cmap='coolwarm') 

plt.xlabel('Długość geograficzna') 

plt.ylabel('Szerokość geograficzna') 

plt.title('Ciśnienie atmosferyczne na mapie meteorologicznej') 

plt.colorbar(label='hPa') 

plt.show() </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="762" height="452" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_8.png" alt="Rys. 8 Przykład mapy ciepła dla poziomu ekspresji genów. " class="wp-image-32132" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  12" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_8.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_8-300x178.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_8-495x294.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 8 Przykład mapy ciepła dla poziomu ekspresji genów.</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>7. <strong>Wykres 3D</strong> – powierzchniowy dla funkcji dwóch zmiennych, w tym przypadku funkcji sinusoidalnej na siatce punktów.&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np 

import matplotlib.pyplot as plt 

from mpl_toolkits.mplot3d import Axes3D 

# Definiowanie danych 

x = np.linspace(-5, 5, 100) 

y = np.linspace(-5, 5, 100) 

x, y = np.meshgrid(x, y) 

z = np.sin(np.sqrt(x**2 + y**2)) 

# Inicjalizacja wykresu 3D 

fig = plt.figure() 

ax = fig.add_subplot(111, projection='3d') 

# Tworzenie wykresu powierzchniowego 

surf = ax.plot_surface(x, y, z, cmap='plasma', edgecolors='k', linewidth=0.5) 

# Dodanie paska kolorów 

cbar = fig.colorbar(surf, pad=0.15, shrink=0.5, aspect=5) 

cbar.ax.yaxis.set_ticks_position('right') 

# Etykiety osi 

ax.set_xlabel('Oś X', labelpad=10) # labelpad zapobiega nakładaniu się osi 

ax.set_ylabel('Oś Y', labelpad=10) 

ax.set_zlabel('Oś Z', labelpad=10) 

# Tytuł wykresu 

ax.set_title('Wykres powierzchniowy') 

plt.show() </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="762" height="417" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_9.png" alt="Rys. 9. Przykład wykresu powierzchniowego. " class="wp-image-32135" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  13" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_9.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_9-300x164.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_9-495x271.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption">Rys. 9. Przykład wykresu powierzchniowego.&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Pamiętaj, że powyższe kody i wygenerowane wykresy to tylko przykłady i nie muszą odzwierciedlać realnych sytuacji czy danych. Zachęcam cię do sprawdzenia wszystkich rodzajów wykresów, które szczegółowo opisane są w dokumentacji: <a href="https://matplotlib.org/stable/plot_types/index.html" target="_blank" data-type="URL" data-id="https://matplotlib.org/stable/plot_types/index.html" rel="noreferrer noopener">Plot types — Matplotlib 3.7.1 documentation</a>.</p>



<p>Znasz już podstawowe rodzaje wykresów i wiesz, jak je tworzyć, dlatego w dalszej części tego artykułu na przykładzie wykresu słupkowego pokażę ci, jak możesz dostosować wizualizacje, wykorzystując kilka dodatkowych elementów, jak siatka, linie pomocnicze i wartości nad słupkami, czyli etykiety (<strong>labels</strong>).</p>



<h2 class="wp-block-heading" id="Dostosowanie-wykresu">Dostosowanie wykresu</h2>



<p>Poniżej znajduje się prosty wykres ukazujący zestawienie dochodu firmy X na przestrzeni ostatnich 7 lat. Kod i wykres zamieszczam poniżej.&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import matplotlib.pyplot as plt 

# Przykładowe dane 

lata = ['2016', '2017', '2018', '2019', '2020', '2021', '2022'] 

dochody = [32, 45, 58, 64, 49, 59, 72] 

plt.bar(lata, dochody, alpha=0.7) 

plt.xlabel('Rok budżetowy') 

plt.ylabel('Dochód (tys. PLN)') 

plt.title('Zestawienie dochodów w tys. PLN na przestrzeni 7 lat') 

plt.plot(lata, dochody) 

plt.show() </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="762" height="463" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_10.png" alt="Rys. 10. Wykres ukazujący zestawienie dochodów firmy X na przestrzeni lat. " class="wp-image-32138" style="width:762px;height:463px" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  14" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_10.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_10-300x182.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_10-495x301.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 10. Wykres ukazujący zestawienie dochodów firmy X na przestrzeni lat.</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Dodajmy do wykresu kilka dodatkowych elementów, żeby sprawić, by stał się czytelniejszy i odrobinę bardziej atrakcyjny wizualnie.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np 

import matplotlib.pyplot as plt 

# Przykładowe dane 

lata = ['2016', '2017', '2018', '2019', '2020', '2021', '2022'] 

dochody = [32, 45, 58, 64, 49, 59, 72] 

x_pos = np.arange(len(lata)) 

bars = plt.bar(x_pos, dochody, alpha=0.7) 

plt.xticks(x_pos, lata) 

plt.xlabel('Rok budżetowy') 

plt.ylabel('Dochód (tys. PLN)') 

plt.title('Zestawienie dochodów w tys. PLN na przestrzeni 7 lat') 

plt.plot(lata, dochody, 

         color='red', 

         linestyle='--', 

         linewidth=3, 

         marker='o', 

         markersize=10, 

         label='Linia') 

plt.grid(True, linestyle='--', linewidth=0.5, alpha=0.7, color='black') 

plt.gca().set_facecolor('whitesmoke') 

for bar in bars: 

    height = bar.get_height() 

    plt.text(bar.get_x() + bar.get_width() / 2, height + 1, str(height), ha='center', va='bottom') 

plt.show() </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="762" height="463" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_11.png" alt="Rys. 11. Wykres obrazujący zestawienie dochodów firmy X z dodatkowymi elementami. " class="wp-image-32141" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  15" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_11.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_11-300x182.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_11-495x301.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 11. Wykres obrazujący zestawienie dochodów firmy X z dodatkowymi elementami.</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>W powyższym przykładzie na uwagę zasługuje funkcja ‘<strong>text()</strong>’, która znajduje się w pętli ‘<strong>for</strong>’. Wspomniana funkcja dodaje wartości nad każdym ze słupków wskazujących na dochód w poszczególnych latach. Jako argumenty przekazujemy położenie na osi X <strong>(bar.get_x() + bar.get_width() / 2)</strong> oraz położenie na osi Y (<strong>height + 1</strong>), a także tekst, który ma wyświetlić się nad słupkami (<strong>str(height)</strong>) i parametry wyrównania tekstu wobec współrzędnych, odpowiednio ‘<strong>ha</strong>’ – horizontal alignment i ‘<strong>va</strong>’ – vertical alignment. W celu zapoznania się z innymi metodami i rodzajami nakładania etykiet (<strong>wartości</strong>) w wykresach słupkowych, ale też innych rodzajach wykresów, odsyłam do dokumentacji Matplotlib: <a href="https://matplotlib.org/stable/gallery/lines_bars_and_markers/bar_label_demo.html" target="_blank" data-type="URL" data-id="https://matplotlib.org/stable/gallery/lines_bars_and_markers/bar_label_demo.html" rel="noreferrer noopener">Bar Label Demo — Matplotlib 3.7.1 documentation.</a></p>



<h2 class="wp-block-heading" id="Wykresy-wieloosiowe">Wykresy wieloosiowe</h2>



<p>Czasami zdarzy się, że na jednej figurze (nie mylić z wykresem) chcesz umieścić dwa lub więcej wykresów. Na przykład, tworzysz prezentację na potrzeby szkolenia matematycznego dla licealistów i chcesz przedstawić wykres funkcji sinus i cosinus. W celu dodania kolejnego wykresu do tej samej figury możemy skorzystać z funkcji ‘<strong>add_subplot()</strong>’ lub funkcji ‘<strong>subplots()</strong>’. Oczywiście każdy wykres lub oś będzie trzeba skonfigurować osobno, ale jak już wiesz, nie są to skomplikowane operacje. Kod i wykresy na jednej figurze zamieszczam poniżej:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np 

import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 

y1 = np.sin(x) 

y2 = np.cos(x) 

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6, 6)) 

# Ustawienie odstępu między wykresami 

plt.subplots_adjust(hspace=0.5) 

ax1.plot(x, y1, color='blue', label='sin(x)') 

ax1.set_xlabel('Oś X') 

ax1.set_ylabel('sin(x)') 

ax1.legend() 

ax2.plot(x, y2, color='red', label='cos(x)') 

ax2.set_xlabel('Oś X') 

ax2.set_ylabel('cos(x)') 

ax2.legend() 

plt.show() </pre>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="762" height="480" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_12.png" alt="Rys. 12. Figura z dwoma wykresami liniowymi na dwóch osiach. " class="wp-image-32144" style="width:762px;height:480px" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  16" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_12.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_12-300x189.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_12-495x312.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 12. Figura z dwoma wykresami liniowymi na dwóch osiach.</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>Pierwszy wykres (na górze) przedstawia funkcję sinusoidalną sin(x), gdzie wartość na osi X jest przedstawiona przez x, a wartość na osi Y przedstawia sin(x). Wykres ma niebieski kolor linii i etykietę ‘sin(x)’.</p>



<p>Drugi wykres (na dole) przedstawia funkcję cosinusoidalną cos(x), gdzie wartość na osi X jest przedstawiona przez x, a wartość na osi Y przedstawia cos(x). Wykres ma czerwony kolor linii i etykietę ‘cos(x)’.</p>



<p>Oba wykresy są umieszczone w jednej kolumnie i dwóch wierszach, ze wspólną osią X, która przedstawia zakres wartości x od 0 do 10. W kolejnym przykładzie pokażę ci nałożenie wykresów na siebie.</p>



<p>Wieloosiowe wykresy mogą być przydatne w różnych zastosowaniach, takich jak:</p>



<ul class="wp-block-list">
<li>Porównywanie różnych wielkości na jednym wykresie.</li>



<li>Przedstawianie wielkości w różnych jednostkach lub zakresach wartości.</li>



<li>Prezentowanie danych związanych z czasem, gdzie wartości dla różnych wielkości mają wspólną oś czasu.</li>
</ul>



<p>Poniżej przedstawiam przykład z nałożonymi krzywymi (sinus i cosinus) na jednym wykresie.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np 

import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 

y1 = np.sin(x) 

y2 = np.cos(x) 

fig, ax1 = plt.subplots(figsize=(8, 4)) # figsize pozwala na ustalenie rozmiaru figury 

# Rysowanie sinusa na pierwszej osi 

ax1.plot(x, y1, color='blue', label='sin(x)') 

ax1.set_xlabel('Oś X') 

ax1.set_ylabel('sin(x)', color='blue') 

ax1.tick_params(axis='y', labelcolor='blue') 

# Tworzenie drugiej osi dla cosinusa 

ax2 = ax1.twinx() 

ax2.plot(x, y2, color='red', label='cos(x)') 

ax2.set_ylabel('cos(x)', color='red') 

ax2.tick_params(axis='y', labelcolor='red') 

# Dodawanie legendy 

fig.legend(loc='upper right') 

plt.grid(True, linestyle='--', linewidth=0.5, alpha=0.7, color='black') 

plt.title('Wykres wieloosiowy z sin(x) i cos(x)') 

plt.show() </pre>



<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="762" height="330" src="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_13.png" alt="Rys. 13. Wykres wieloosiowy przedstawiający porównanie krzywych funkcji sin(x) i cos(x). " class="wp-image-32147" title="Obliczenia naukowe w języku Python – wprowadzenie do biblioteki Matplotlib  17" srcset="https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_13.png 762w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_13-300x130.png 300w, https://nearshore-it.eu/wp-content/uploads/2024/09/blog_2023.05.10_graphic_13-495x214.png 495w" sizes="auto, (max-width: 762px) 100vw, 762px" /><figcaption class="wp-element-caption"><em>Rys. 13. Wykres wieloosiowy przedstawiający porównanie krzywych funkcji sin(x) i cos(x).</em>&nbsp;</figcaption></figure></div>


<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>



<p>W powyższym przykładzie, ax1 jest osią Y dla sin(x), a ax2 jest osią Y dla cos(x). Używając funkcji twinx(), utworzyliśmy drugą oś Y, która współdzieli wspólną oś X z pierwszą osią Y. Następnie narysowaliśmy funkcje sinusoidalną i cosinusoidalną na odpowiednich osiach, używając różnych kolorów dla linii i etykiet. W ten sposób obie funkcje są przedstawione na jednym wykresie z dwiema osiami Y. Rozmiar figury został zmieniony na 8 cali szerokości i 4 cale wysokości za pomocą parametru ‘<strong>figsize</strong>’. Zachęcam do eksperymentowania z parametrami w celu uzyskania optymalnych rozwiązań. Ponownie odsyłam do dokumentacji w celu zapoznania się z pełnym zakresem parametrów.</p>



<h2 class="wp-block-heading" id="Podsumowanie-i-cheat-sheet">Podsumowanie i cheat sheet</h2>



<p>Myślę, że w tym artykule udało mi się pokazać ci podstawy tworzenia wykresów i pracy z biblioteką Matplotlib. Zebrałem też najważniejsze funkcje i fragmenty kodu, które możesz wykorzystać podczas pracy z wizualizacjami, korzystając z Matplotlib.</p>



<p><strong>Importowanie biblioteki:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import matplotlib.pyplot as plt </pre>



<p><strong>Tworzenie wykresów:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Wykres liniowy 

plt.plot(x, y) 

# Wykres punktowy (scatter plot) 

plt.scatter(x, y) 

# Histogram 

plt.hist(x, bins) 

# Wykres słupkowy (bar plot) 

plt.bar(x, y) 

# Wykres kołowy (pie chart) 

plt.pie(values, labels=labels) 

# Heatmap 

plt.imshow(matrix, cmap='hot') 

# Wykres konturowy (contour plot) 

plt.contour(X, Y, Z) </pre>



<p><strong>Wyświetlanie wykresu:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">plt.show() </pre>



<p><strong>Formatowanie wykresów:</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Tytuł wykresu 

plt.title("Tytuł") 

# Etykiety osi 

plt.xlabel("Oś X") 

plt.ylabel("Oś Y") 

# Legenda 

plt.legend() 

# Siatka (grid) 

plt.grid() 

# Ograniczenie zakresu osi 

plt.xlim(min_x, max_x) 

plt.ylim(min_y, max_y) 

# Skala logarytmiczna 

plt.xscale('log') 

plt.yscale('log') </pre>



<p><strong>Personalizacja wykresów:</strong>&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Kolor linii 

plt.plot(x, y, color='red') 

# Styl linii (liniowy, przerywany, kropkowany) 

plt.plot(x, y, linestyle='-') 

plt.plot(x, y, linestyle='--') 

plt.plot(x, y, linestyle=':') 

# Znaczniki punktów 

plt.plot(x, y, marker='o') 

plt.plot(x, y, marker='x') 

plt.plot(x, y, marker='+') 

# Grubość linii 

plt.plot(x, y, linewidth=2) </pre>



<p><strong>Tworzenie wykresów wieloosiowych:</strong>&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># Tworzenie wykresów z wieloma osiami Y 

fig, ax1 = plt.subplots() 

ax2 = ax1.twinx() 

ax1.plot(x1, y1, 'g-') 

ax2.plot(x2, y2, 'b-') 

ax1.set_xlabel('Oś X') 

ax1.set_ylabel('y1', color='g') 

ax2.set_ylabel('y2', color='b') </pre>



<p><strong>Zapisywanie wykresu jako obraz:</strong>&nbsp;</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">plt.savefig("nazwa_pliku.png", dpi=300) </pre>



<p><strong>Link do dokumentacji Matplotlib:&nbsp;<br></strong><a href="https://matplotlib.org/stable/index.html" target="_blank" rel="noreferrer noopener">Matplotlib documentation — Matplotlib 3.7.1 documentation</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://nearshore-it.eu/pl/artykuly/biblioteka-matplotlib/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>NumPy – wstęp do biblioteki w języku Python</title>
		<link>https://nearshore-it.eu/pl/artykuly/numpy-wstep-do-biblioteki-python/</link>
					<comments>https://nearshore-it.eu/pl/artykuly/numpy-wstep-do-biblioteki-python/#respond</comments>
		
		<dc:creator><![CDATA[Piotr Ludwinek]]></dc:creator>
		<pubDate>Thu, 09 Mar 2023 14:31:00 +0000</pubDate>
				<category><![CDATA[Artykuły]]></category>
		<category><![CDATA[Technologie]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://nearshore-it.eu/artykuly/numpy-wstep-do-biblioteki-python/</guid>

					<description><![CDATA[Jeżeli pojęcie biblioteki Python nie jest ci znane, w tym artykule wyjaśnię, czym jest biblioteka w języku Python, oraz omówię możliwości biblioteki NumPy, która w moim przekonaniu jest jedną z ciekawszych propozycji na start.]]></description>
										<content:encoded><![CDATA[
<div class="table-of-contents">
    <p class="title"></p>
    <ol>
                    <li><a href="#Czym-właściwie-jest-biblioteka-Python?">1.  Czym właściwie jest biblioteka Python?</a></li>
                    <li><a href="#NumPy">2.  Do czego służy pakiet NumPy?</a></li>
                    <li><a href="#Instalacja-">3.  Instalacja NumPy</a></li>
                    <li><a href="#Czym-są-tablice-w-NumPy?">4.  Czym są tablice w NumPy?</a></li>
                    <li><a href="#Różnica-między-ndarray-a-array">5.  Różnica między ndarray a array</a></li>
                    <li><a href="#Funkcje-wbudowane">6.  Funkcje wbudowane</a></li>
                    <li><a href="#Porównanie-czasu-wykonania-funkcji-w-NumPy-i-bez-użycia-tej-biblioteki">7.  Porównanie czasu wykonania funkcji w NumPy i bez użycia tej biblioteki</a></li>
                    <li><a href="#Zalety i wady korzystania z NumPy">8.  Zalety i wady korzystania z NumPy</a></li>
                    <li><a href="#Podsumowanie">9.  Podsumowanie &#8211; FAQ</a></li>
            </ol>
</div>


<h2 class="wp-block-heading" id="Czym-właściwie-jest-biblioteka-Python?">Czym właściwie jest biblioteka Python?</h2>



<p>Jeżeli od pewnego czasu programujesz w języku Python, na pewno korzystasz z różnych bibliotek, które wspierają implementację rozwiązań i zwiększają wydajność zarówno twoją, jak i funkcjonalności, nad którymi pracujesz. Najpopularniejsze biblioteki w języku Python to m.in. Pandas, NumPy, TensorFlow czy SciPy. <br><br>Biblioteka w języku Python to w dużym uproszczeniu zbiór funkcji i metod, które stworzono w celu ułatwienia implementacji rozwiązań. Funkcje te można w łatwy sposób wykorzystać w programie, nie tracąc czasu na tworzenie wszystkiego od zera. To pewnego rodzaju moduły, które zostały stworzone w celu ułatwienia pracy z problemami konkretnych obszarów nauki czy biznesu.</p>



<p>Wiele bibliotek Python używanych jest np. na potrzeby medycyny (<strong>MedPy</strong>), przemysłu ciężkiego, lotnictwa, bankowości czy telekomunikacji i wojskowości. Biblioteki mogą także wspierać wąskie specjalizacje obszaru IT, takie jak przetwarzanie i wizualizacja zbiorów danych (<a href="https://nearshore-it.eu/pl/artykuly/biblioteki-python-pandas/" data-type="link" data-id="https://nearshore-it.eu/pl/artykuly/biblioteki-python-pandas"><strong>Pandas</strong>,</a> <strong><a href="https://nearshore-it.eu/pl/artykuly/biblioteka-matplotlib/" data-type="link" data-id="https://nearshore-it.eu/pl/artykuly/biblioteka-matplotlib">Matplotlib</a></strong>), sieci neuronowe (<strong>TensorFlow</strong>, <strong>PyTorch</strong>), a także obliczenia naukowe (<strong>SciPy</strong>).</p>



<p>Każda biblioteka posiada dokumentację, która objaśnia możliwości wykorzystania zawartych w niej funkcji i metod. Dokumentacja zazwyczaj zawiera też fragmenty kodu, które po niewielkim dostosowaniu można z powodzeniem użyć we własnym projekcie.</p>



<h2 class="wp-block-heading" id="NumPy">Do czego służy pakiet NumPy?</h2>



<p>Jak zapewne wiesz, analiza danych (ang. <strong>Data Science</strong>) staje się z roku na rok coraz popularniejsza, a w momencie pisania tego artykułu jej wykorzystanie stało się w zasadzie powszechne w wielu obszarach biznesu. Obok różnych procesów dotyczących przygotowania danych czy wizualizacji efektów stoją metody obliczeniowe, które wspomagają uzyskanie realnej wartości z zebranych danych. W tym artykule skupiam się na danych numerycznych.</p>



<p>Języki programowania, do których należy Python, wspomagają naukowców, analityków i programistów w implementacji rozwiązań i osiąganiu rezultatów, które z powodzeniem mogą zostać użyte w procesach decyzyjnych wyższego szczebla i mieć realny wpływ na otaczający nas świat. W przypadku wspomnianych metod obliczeniowych jedną z najpopularniejszych bibliotek jest właśnie NumPy (<strong>Numeric Python</strong>). Jak nazwa wskazuje, skupia się ona głównie na wsparciu pracy z danymi numerycznymi i umożliwia efektywne i wydajne dokonywanie operacji na macierzach, tablicach czy wektorach, które zawierają elementy tego samego typu. Po wprowadzeniu teoretycznym skupimy się bardziej na części praktycznej i bazując na prostych przykładach, zapoznasz się z możliwościami biblioteki NumPy. Zanim to jednak zrobimy, upewnij się, że biblioteka NumPy jest u ciebie zainstalowana.</p>



<h2 class="wp-block-heading" id="Instalacja-">Instalacja NumPy</h2>



<p>Instalacja NumPy została szczegółowo wyjaśniona <a href="#FAQ" data-type="internal" data-id="#FAQ">w części FAQ.</a> Jeżeli biblioteka NumPy jest już zainstalowana, możesz przejść do kolejnej części.</p>



<p>Nieważne, czy korzystasz z linii poleceń, IDE (np. <strong>PyCharm</strong>) czy notebooka (np. <strong>Jupyter</strong>). Jedyne, co musisz zrobić, żeby móc korzystać z NumPy, to napisać linijkę kodu odpowiedzialnego za import biblioteki.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np</pre>



<p>Od teraz możesz korzystać ze wszystkich możliwości, jakich dostarcza NumPy. Zachęcam cię do samodzielnego uruchomienia fragmentów kodu, które zawarte są w tym artykule, i modyfikacji według uznania, żeby lepiej zrozumieć zasady działania i możliwości omawianej biblioteki.</p>



<p>Skupmy się najpierw na rzeczach prostych, jakimi są np. podstawowe operacje arytmetyczno-logiczne. Do tego niezbędne jest zrozumienie kluczowej struktury, którą wprowadzono w NumPy, czyli <strong>tablicy</strong>.</p>



<p>Teraz pewnie zastanawiasz się, dlaczego w ogóle masz korzystać z dodatkowej biblioteki, jeżeli wszystkie funkcjonalności możesz napisać z użyciem podstawowych rozwiązań w języku Python, jakimi są <strong>pętle </strong>(ang. loop) czy <strong>listy </strong>(ang. list). W profesjonalnym podejściu i pracy na ogromnych zbiorach danych (nie tylko numerycznych) często ważnym aspektem jest czas. I w tym tkwi właśnie przewaga NumPy, czyli w <strong>szybkości działania</strong>, która dodatkowo idzie w parze z <strong>niskim progiem </strong>wejścia dla użytkownika. W dalszej części artykułu przedstawię kilka przykładów, które wprowadzą cię w podstawy NumPy. Wykorzystane funkcje poprawiają wydajność w obliczeniach. A można to osiągnąć między innymi poprzez operacje na wspomnianych wcześniej tablicach.</p>



<h2 class="wp-block-heading" id="Czym-są-tablice-w-NumPy?">Czym są tablice w NumPy?</h2>



<p><strong>Tablica </strong>(ang. <a href="https://numpy.org/doc/stable/reference/generated/numpy.array.html#numpy-array" target="_blank" data-type="URL" data-id="https://numpy.org/doc/stable/reference/generated/numpy.array.html#numpy-array" rel="noreferrer noopener">array</a>) w NumPy to struktura o jednym wymiarze lub większej liczbie wymiarów pozwalająca na działania ze zbiorami danych numerycznych, zaczynając od kilkuelementowych po ogromne zbiory przechowywane np. w chmurze. Pamiętajmy, że nie tylko wymiary charakteryzują tablicę – istnieje też kilka innych, równie ważnych cech.</p>



<ul class="wp-block-list">
<li> Tablice są stałej wielkości – nie możemy zmienić rozmiaru po jej utworzeniu.</li>



<li> Przechowują elementy tego samego typu, np. liczby całkowite (ang. <strong>Integer</strong>) lub zmiennoprzecinkowe (ang. <strong>float-point</strong>).</li>



<li> Wykorzystywane <strong>„pod spodem”</strong> algorytmy pozwalają na bardzo szybkie operacje i efektywne wykorzystanie pamięci.</li>
</ul>



<p>Niektórzy porównują tablice do list w Pythonie, ale<a href="https://numpy.org/doc/stable/user/absolute_beginners.html#whats-the-difference-between-a-python-list-and-a-numpy-array" target="_blank" data-type="URL" data-id="https://numpy.org/doc/stable/user/absolute_beginners.html#whats-the-difference-between-a-python-list-and-a-numpy-array" rel="noreferrer noopener"> listy różnią się od tablic</a>, np. możliwością przechowywania elementów różnego typu (listy mogą być heterogeniczne), a także są jednowymiarowe (chociaż możliwe jest przechowywanie jednowymiarowej listy w drugiej liście). To tyle z teoretycznego wprowadzenia. Poniżej zamieściłem kilka przykładów wraz z objaśnieniami.</p>



<p>W celu stworzenia tablicy możesz skorzystać z <a href="https://numpy.org/doc/stable/user/basics.creation.html" data-type="URL" data-id="https://numpy.org/doc/stable/user/basics.creation.html" target="_blank" rel="noreferrer noopener">kilku opcji</a>, między innymi:</p>



<p><strong>1.</strong> <strong>Konwersja listy w tablicę</strong>.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# jednowymiarowa tablica na podstawie listy
arr_1d = np.array([1, 2, 3])
# dwuwymiarowa tablica na podstawie listy
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])</pre>



<p><strong>2. Tablica o stałej wartości.</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# jednowymiarowa tablica wypełniona zerami o długości 3
arr_zeros = np.zeros(5)
# dwuwymiarowa tablica wypełniona jedynkami o wymiarach 3x3
arr_2d_ones = np.ones((3, 3))</pre>



<p><strong>3. Tablica z wartości losowych.</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># jednowymiarowa tablica z losowymi wartościami z przedziału [0,1] o długości 3
arr = np.random.rand(3)
# dwuwymiarowa tablica z losowymi wartościami z rozkładu normalnego o wymiarach 3x3
arr_2d = np.random.randn(3, 3)</pre>



<p><strong>4. Tablica na podstawie pliku wejściowego.</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# inicjalizacja tablicy za pomocą pliku wejściowego
arr_file = np.loadtxt('file_name.txt')</pre>



<p>Jak widzisz, lista opcji stworzenia tablicy nie ogranicza się do jednej czy dwóch, a powyższe przykłady jej nie wyczerpują. Ponieważ wiesz już czym są tablice i jak je stworzyć, możemy przejść do omówienia operacji z wykorzystaniem tablic numerycznych, które ułatwią obliczenia na dużych zbiorach danych.</p>



<h3 class="wp-block-heading">NumPy – podstawowe operacje</h3>



<p></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# tworzenie jednowymiarych tablic a i b
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# dodawanie tablicy b do tablicy a
c = a + b
# mnożenie tablicy a przez stałą 2
d = 2 * a</pre>



<p>Wynikiem operacji logicznych takich jak AND (koniunkcja), OR (alternatywa) czy NOT (negacja) jest tablica zawierająca wartości logiczne True i False.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# tworzenie jednowymiarych tablic a i b
a = np.array([1, 2, 3])
b = np.array([3, 2, 1])
# sprawdzamy, które elementy w tablicy a są mniejsze od odpowiadających im elementów w tablicy b
c = a &lt; b
# sprawdzamy które elementy w tablicy a są równe 2 lub 3
d = (a == 2) | (a == 3)</pre>



<p>Wynikiem operacji redukcyjnych takich jak suma, minimum, maksimum czy średnia jest skalar.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# tworzenie jednowymiarowej tablicy a
a = np.array([1, 2, 3])
# suma elementów tablicy a
b = np.sum(a)
# średnia arytmetyczna dla elementów tablicy a
c = np.mean(a)
# największy element w tablicy a
d = np.max(a)</pre>



<p>Dobrym przykładem jest także mnożenie macierzy i obliczenie wyznacznika, a także rozwiązanie układu równań liniowych.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# tworzenie macierzy a i b
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
# operacja mnożenia macierzy a i b
c = np.dot(a, b)
# obliczenie wyznacznika macierzy a
d = np.linalg.det(a)
# wyznaczenie rozwiązania układu równań liniowych Ax = b
A = np.array([[1, 2], [3, 4]])
b = np.array([5, 6])
x = np.linalg.solve(A, b)</pre>



<h2 class="wp-block-heading" id="Różnica-między-ndarray-a-array">Różnica między ndarray a array</h2>



<p>Jeżeli zagłębiłeś się chociaż trochę bardziej w tematykę tablic w bibliotece NumPy, to możliwe, że spotkałeś się z <strong>numpy.ndarray() </strong>oraz <strong>numpy.array()</strong>. Prawdopodobnie zastanawiasz się, jaka jest różnica pomiędzy nimi – dlatego proponuję krótkie wyjaśnienie. Na wstępie zaznaczę, że podstawowa wiedza z programowania obiektowego lub pojęcia typu klasa i obiekt powinny być ci znane w celu poprawnego zrozumienia różnicy pomiędzy ndarray a array. </p>



<p>Zgodnie <a href="https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html" target="_blank" data-type="URL" data-id="https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html" rel="noreferrer noopener">z dokumentacją</a> i koncepcją <a href="https://docs.python.org/3/reference/datamodel.html" target="_blank" data-type="URL" data-id="https://docs.python.org/3/reference/datamodel.html" rel="noreferrer noopener">języka Python</a> <strong>numpy.ndarray()</strong> jest klasą, a <strong>numpy.array()</strong> jest metodą/funkcją, za pomocą której tworzymy obiekt ndarray, czyli właśnie tablicę. Wcześniej omówiliśmy, w jaki sposób możesz stworzyć tablicę w NumPy. Zgodnie <a href="https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html" target="_blank" data-type="URL" data-id="https://numpy.org/doc/stable/reference/generated/numpy.ndarray.html" rel="noreferrer noopener">z dokumentacją NumPy</a> możliwe jest tworzenie tablicy bezpośrednio za pomocą <strong>numpy.ndarray()</strong>, ale zalecanym podejściem jest korzystanie<a href="https://numpy.org/doc/stable/reference/generated/numpy.empty.html" target="_blank" data-type="URL" data-id="https://numpy.org/doc/stable/reference/generated/numpy.empty.html" rel="noreferrer noopener"> z funkcji wbudowanych</a>, np. <strong>numpy.array()</strong>, <strong>numpy.zeros()</strong> lub <strong>numpy.empty()</strong>.</p>



<h2 class="wp-block-heading" id="Funkcje-wbudowane">Funkcje wbudowane</h2>



<p>Za definicją funkcji wbudowanej w NumPy nie stoi nic skomplikowanego. To po prostu funkcja, która została dostarczona przez bibliotekę. Oznacza to, że możesz wywołać taką funkcję bez potrzeby importowania dodatkowych modułów np. poza biblioteką NumPy. Funkcje wbudowane to najczęściej zbiór podstawowych funkcjonalności gotowych do wykorzystania po przekazaniu.</p>



<p>odpowiednich parametrów (jeżeli są wymagane). W przypadku NumPy jest to zbiór funkcji umożliwiających działania na tablicach, macierzach czy wektorach. Jeżeli chcesz w pełni wykorzystać potencjał biblioteki NumPy, korzystanie z funkcji wbudowanych jest niezbędne. W celu zapoznania się z pełną listą funkcji wbudowanych odsyłam cię <a href="https://numpy.org/doc/stable/reference/routines.math.html" target="_blank" data-type="URL" data-id="https://numpy.org/doc/stable/reference/routines.math.html" rel="noreferrer noopener">do dokumentacji NumPy</a>, a poniżej zamieszczam kilka wybranych przykładów.</p>



<p><strong>1. Utworzenie tablicy z równo rozłożonymi elementami w wybranym zakresie.</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# tablica z 10 równo rozłożonymi wartościami w zakresie od 0 do 2
a = np.linspace(0, 2, 10)</pre>



<p><strong>2. Utworzenie macierzy i jej transpozycja.</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# tworzenie macierzy 3x3
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# transpozycja macierzy a do macierzy b
b = np.transpose(a)</pre>



<p><strong>3. Sortowanie tablicy.</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# tworzenie tablicy z 10 elementami
a = np.array([3, 7, 3, 3, 2, 9, 7, 1, 5, 4])
# sortowanie tablicy
b = np.sort(a) </pre>



<p><strong>4. Obliczenie transformaty Fouriera dla wybranej tablicy.</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# tworzenie tablicy z 6 elementami
a = np.array([1, 2, 3, 4, 5, 6])
# obliczanie transformaty Fouriera
b = np.fft.fft(a</pre>



<p><strong>5. Wygenerowanie pięciu losowych wartości z rozkładu normalnego.</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
# ustalenie ziarna dla generatora liczb losowych
np.random.seed(12345)
# wygenerowanie pięciu losowych wartości z rozkładu normalnego
a = np.random.randn(5)</pre>



<p>Powyżej zamieściłem kilka przykładów, zaczynając od tych o niskiej złożoności, ale niektóre z nich mogą wymagać znajomości bardziej zaawansowanych pojęć z obszarów<a href="https://pythonnumericalmethods.berkeley.edu/notebooks/chapter24.02-Discrete-Fourier-Transform.html" target="_blank" data-type="URL" data-id="https://pythonnumericalmethods.berkeley.edu/notebooks/chapter24.02-Discrete-Fourier-Transform.html" rel="noreferrer noopener"> matematyki, statystyki czy fizyki.</a></p>



<h2 class="wp-block-heading" id="Porównanie-czasu-wykonania-funkcji-w-NumPy-i-bez-użycia-tej-biblioteki">Porównanie czasu wykonania funkcji w NumPy i bez użycia tej biblioteki</h2>



<p>Zanim omówię korzyści i potencjalne trudności wynikające z wykorzystania NumPy w twoim projekcie, chciałem pokazać ci różnice w czasie wykonania funkcji napisanej w języku Python bez dodatkowych bibliotek i tej z użyciem biblioteki NumPy. Użyjemy do tego dwóch przykładów. Pierwszy mierzy czas potrzebny na sumowanie losowych elementów z listy, a drugi pokazuje czas obliczania iloczynu skalarnego dwóch wektorów. Zwróć uwagę na to, że czas wykonania może się różnić w zależności od zasobów maszyny, na której uruchamiasz kod.</p>



<h3 class="wp-block-heading">Przykład 1:</h3>



<p>Pierwsza funkcja korzysta z <strong>numpy.sum()</strong>, a druga sumuje elementy z użyciem pętli <strong>for</strong>.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""> import numpy as np
import time
# implementacja z użyciem NumPy
def numpy_sum(a):
return np.sum(a)
# implementacja bez dodatkowych bibliotek
def python_sum(a):
sum = 0
for i in a:
sum += i
return sum
# tworzenie listy z losowymi liczbami
a = np.random.randint(0, 100, 5000000)
# czas wykonania funkcji z NumPy
start_time = time.time()
numpy_sum(a)
print("Czas wykonania funkcji z NumPy: %.6f sekund" % (time.time() - start_time))
# czas wykonania funkcji bez dodatkowych bibliotek
start_time = time.time()
python_sum(a)
print("Czas wykonania funkcji bez NumPy: %.6f sekund" % (time.time() - start_time))</pre>


<div class="special-content-box style-1">
    <div class="box">
                <div class="content">
            <ul>
<li>Czas wykonania funkcji z NumPy: 0.001995 sekund</li>
<li>Czas wykonania funkcji bez NumPy: 0.242352 sekund</li>
</ul>
                    </div>
    </div>
</div>



<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">Przykład 2:</h3>



<p>Pierwsza funkcja korzysta z <strong>numpy.dot()</strong>, a druga korzysta z pętli <strong>for.</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import numpy as np
import time
# implementacja z użyciem NumPy
def numpy_dot(a, b):
return np.dot(a, b)
# implementacja bez dodatkowych bibliotek
def python_dot(a, b):
dot = 0
for i in range(len(a)):
dot += a[i] * b[i]
return dot
# tworzenie dwóch wektorów z losowymi liczbami
a = np.random.randint(0, 100, 700000)
b = np.random.randint(0, 100, 700000)
# czas wykonania funkcji z NumPy
start_time = time.time()
numpy_dot(a, b)
print("Czas wykonania funkcji z NumPy: %.6f sekund" % (time.time() - start_time))
# czas wykonania funkcji bez dodatkowych bibliotek
start_time = time.time()
python_dot(a, b)
print("Czas wykonania funkcji bez NumPy: %.6f sekund" % (time.time() - start_time))</pre>


<div class="special-content-box style-1">
    <div class="box">
                <div class="content">
            <ul>
<li>Czas wykonania funkcji z NumPy: 0.000000 sekund</li>
<li>Czas wykonania funkcji bez NumPy: 0.117685 sekund</li>
</ul>
                    </div>
    </div>
</div>



<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>



<p><strong>Jak można zauważyć, funkcja z wykorzystaniem NumPy jest wyraźnie szybsza od implementacji z użyciem pętli for.</strong></p>



<p>Biorąc pod uwagę, że zazwyczaj pracuje się na dużych zbiorach danych, ta różnica może być jeszcze większa.</p>



<p><strong>Przeczytaj również:</strong> <a href="https://nearshore-it.eu/pl/artykuly/wprowadzenie-do-swiata-azure-iot/" data-type="link" data-id="https://nearshore-it.eu/pl/artykuly/wprowadzenie-do-swiata-azure-iot/">Wprowadzenie do świata Azure IoT</a></p>



<h2 class="wp-block-heading">Zalety i wady korzystania z NumPy</h2>



<p>Wykorzystanie NumPy w projekcie wiąże się z wieloma korzyściami i ułatwieniami, poniżej zebrałem najważniejsze z nich.</p>



<h3 class="wp-block-heading">Zalety NumPy</h3>



<ul class="wp-block-list">
<li><strong>Szybkość </strong>– główną zaletą NumPy jest szybkość, ponieważ rozwiązania w tej bibliotece bazują na niskopoziomowym języku C. Obliczenia są zoptymalizowane i pozwalają na wykonywanie operacji w sposób wektorowy, co w znaczący sposób przekłada się na wzrost wydajności.</li>



<li><strong>Próg wejścia </strong>– NumPy ma niski próg wejścia dla osób, które na co dzień nie mają do czynienia z programowaniem. Umożliwia łatwe tworzenie lub modyfikację istniejących rozwiązań, które używane są w przetwarzaniu dużych zbiorów danych, w tym przypadku numerycznych.</li>



<li><strong>Zakres operacji </strong>– jak omówiono w przykładach, NumPy posiada szeroki zakres operacji numerycznych. Umożliwia wykonanie prostych działań arytmetyczno-logicznych, ale też zadań sortowania czy operacji statystycznych. Dodatkowo działa niezależnie od platformy czy systemu operacyjnego. Jeżeli możesz korzystać z Pythona, pewnie skorzystasz również z NumPy.</li>



<li><strong>Integracja z innymi bibliotekami</strong> – NumPy dobrze współpracuje z innymi bibliotekami, które używane są w analizie i pracy z dużymi zbiorami danych. Przykładem może być integracja z Pandas, Matplotlib lub SciPy.</li>
</ul>



<h3 class="wp-block-heading">Wady NumPy</h3>



<p>Należy też pamiętać o potencjalnych utrudnieniach, które mogą wynikać z używania biblioteki NumPy nie do końca zgodnie z jej przeznaczeniem.</p>



<ul class="wp-block-list">
<li><strong>Wykorzystanie pamięci </strong>– biblioteka ta wykorzystana w niewłaściwy sposób może używać sporo pamięci, a to z kolei – wpłynąć na wydajność w przetwarzaniu ogromnych zbiorów danych. Ważne jest właściwe zrozumienie składni i znajomość pojęć matematycznych, które stoją za funkcjami dostarczanymi przez bibliotekę.</li>



<li><strong>Ograniczone wykorzystanie </strong>– NumPy nie wspiera tablic o zmiennej długości, dlatego nie nadaje się do pracy na przykład z danymi tekstowymi. Istnieją inne biblioteki, które w tym przypadku poradzą sobie lepiej.</li>



<li><strong>Indeksowanie może być skomplikowane </strong>– to temat na odrębny artykuł, ale należy wspomnieć, że NumPy pozwala na zaawansowane indeksowanie tablic, które poprawia wydajność programu. Wymaga to jednak praktyki i bardzo dobrego zrozumienia zarówno samej biblioteki, jak i przetwarzanego zbioru danych.</li>
</ul>



<h2 class="wp-block-heading" id="Podsumowanie">Podsumowanie</h2>



<p>Mam nadzieję, że udało mi się przedstawić podstawowe zagadnienia związane z przetwarzaniem danych numerycznych za pomocą biblioteki NumPy i pokazać jej potencjalne możliwości. Implementacja w realnych projektach pozwoli w pełni pokazać jej potencjał i korzyści wynikające z użycia funkcji, których dostarcza. Szybkość, integracja z innymi bibliotekami i łatwość użycia zdecydowanie zachęcają do zapoznania się z jej możliwościami. Oczywiście, jak w każdym przypadku, sprawne korzystanie z tej biblioteki przychodzi z czasem, ale już od pierwszych godzin może przynieść zadowalające efekty.</p>



<h3 class="wp-block-heading" id="FAQ">FAQ  </h3>


<div id="rank-math-faq" class="rank-math-block">
<div class="rank-math-list ">
<div id="faq-question-1682422703483" class="rank-math-list-item">
<h3 class="rank-math-question "><strong>Jak zainstalować NumPy?</strong></h3>
<div class="rank-math-answer ">

<p>W celu instalacji biblioteki NumPy zachęcam do przejścia prostego tutoriala zawartego na stronie biblioteki: <a href="https://numpy.org/doc/stable/user/absolute_beginners.html" target="_blank" rel="noreferrer noopener">https://numpy.org/doc/stable/user/absolute_beginners.html </a>Jeżeli masz już zainstalowany Python, możesz skorzystać z <a href="https://pypi.org/project/numpy/" target="_blank" rel="noreferrer noopener">jednej z komend</a>:<br /><strong>pip install numpy</strong>, lub<strong> conda install numpy</strong>.</p>

</div>
</div>
</div>
</div>


<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
]]></content:encoded>
					
					<wfw:commentRss>https://nearshore-it.eu/pl/artykuly/numpy-wstep-do-biblioteki-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
