Python for Data Analysis

Python for Data Analysis – Data Wrangling with pandas, NumPy, and Jupyter, Third Edition by Wes McKinney

Open access online version: https://wesmckinney.com/book/

Data files and materials: https://github.com/wesm/pydata-book

Chapter 1

Essential libraries/tools:

  • NumPy
  • pandas
  • matplotlib
  • IPython
  • Jupyter Notebook
  • SciPy
  • scikit-learn
  • statsmodels
  • Anaconda/Miniconda

? – object introspection

def add_numbers(a, b):
    """
    Add two numbers together
    Returns
    -------
    the_sum : type of arguments
    """
    return a + b

add_numbers?

output:
Signature: add_numbers(a, b)
Docstring:
Add two numbers together
Returns
-------
the_sum : type of arguments
File:      <path>
Type:      function

Data analysis – notes

Jupyter Notebook

There are two modes:

  • command mode (press Esc to activate)
  • edit mode (press Enter to activate)

H in command mode to show all shortcuts

source: https://towardsdatascience.com/jypyter-notebook-shortcuts-bf0101a98330

Źródła danych

Instytut Meteorologii i Gospodarki Wodnej

API wystawiające dane godzinowe z kilkudziesięciu stacji pogodowych:
https://danepubliczne.imgw.pl/api/data/synop
dane (JSON): data i godzina pomiaru, temperatura, prędkość wiatru, kierunek wiatru, wilgotność względna, suma opadu, ciśnienie

NASA POWER

API wystawiające dane meteorologiczne oraz dane na temat nasłonecznienia:
https://power.larc.nasa.gov/docs/tutorials/service-data-request/api/

Typowy rok meteorologiczny

https://www.klimatolodzy.pl/index.php/pl/baza-wiedzy/klimat-w-miescie/typowy-rok-meteorologiczny

Stationary Time Series

Python. Instrukcje dla programisty.

Python. Instrukcje dla Programisty. Wydanie II. Autor: Eric Matthes

Rozdział 1

zasoby:https://ehmatthes.github.io/pcc_2e/regular_index/
edytor tekstu:https://www.sublimetext.com/

sprawdzenie wersji Pythona:
Startcmdpython
(Ctr+Z lub exit() i Enter żeby zakończyć)

Rozdział 2

nazwy zmiennych:

  • mogą zawierać litery, cyfry, podkreślenia
  • nie mogą zaczynać się od cyfry
Ciąg tekstowy (string)
name = "jAn kOwAlSkI"
print(name.title())

output:
Jan Kowalski

title(), upper(), lower() – zmiana wielkości liter
rstrip(), lstrip(), strip() – usuwanie białych znaków

Ciąg tekstowy f (f-string)
name = "jan"
surname = "kowalski"

full_name = f"imię: {name} \nnazwisko: {surname}"
print(full_name.upper())

output:
IMIĘ: JAN 
NAZWISKO: KOWALSKI
Liczby
val1 = 0.1
val2 = 0.2
print(val1+val2)
print(val1*val2)

output:
0.30000000000000004
0.020000000000000004
val = 1_000_000
print(val)

output:
1000000
x,y,z = 1,2,3
print(x,y,z)

output:
1 2 3

Zen Pythona: import this

Rozdział 3

Listy
bicycles = ['górski', 'szosowy', 'turystyczny']

print(bicycles[0].title())
print(bicycles[1].title())
print(bicycles[2].title())
print(bicycles[-1].upper())

output:
Górski
Szosowy
Turystyczny
TURYSTYCZNY
names = []
names.append('Kamil')
names.append('Krzysiek')
names.append('Karol')
print(names)

output:
['Kamil', 'Krzysiek', 'Karol']

names.insert(1, 'Agata')
names.insert(-2, 'Stefania')
print(names)

output:
['Kamil', 'Agata', 'Stefania', 'Krzysiek', 'Karol']

del names[-1]
print(names)

output:
['Kamil', 'Agata', 'Stefania', 'Krzysiek']

removed = names.pop(0)
print(names)
print(removed)

output:
['Agata', 'Stefania', 'Krzysiek']
Kamil

names.remove('Krzysiek')
print(names)

output:
['Agata', 'Stefania']
cars = ['bmw', 'audi', 'toyota', 'fiat']
print(sorted(cars))

output:
['audi', 'bmw', 'fiat', 'toyota']

print(cars)

output:
['bmw', 'audi', 'toyota', 'fiat']

cars.sort(reverse=True)
print(cars)

output:
['toyota', 'fiat', 'bmw', 'audi']

cars.reverse()
print(cars)

output:
['audi', 'bmw', 'fiat', 'toyota']

print(len(cars))

output:
4

Rozdział 4

for value in range (1,5):
	print(value)

output:
1
2
3
4

numbers = list(range(1,6))
print (numbers)

output:
[1, 2, 3, 4, 5]

#dane statystyczne
digits = list(range(1,10))
print(min(digits))
print(max(digits))
print(sum(digits))

output:
1
9
45

#lista składana (list comprehension)
squares = [value**2 for value in range(1,11)]
print(squares)

output:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

#wycinek z listy (list slicing)
imiona = ['karol','andrzej','katarzyna','michał','adrian','łukasz']
print(imiona[0:3])
print(imiona[:3])
print(imiona[3:])
print(imiona[-4:-2])
print(imiona[-1:])
print(imiona[-1])

output:
['karol', 'andrzej', 'katarzyna']
['karol', 'andrzej', 'katarzyna']
['michał', 'adrian', 'łukasz']
['katarzyna', 'michał']
['łukasz']
łukasz

print(sorted(imiona)[0:3])

output:
['adrian', 'andrzej', 'karol']

#kopiowanie listy
dania1 = ['pizza','pierogi','schabowe','sałatka']
dania2 = dania1
dania3 = dania1[:]
print(dania1)
print(dania2)

del dania1[0]
print(dania1)
print(dania2)
print(dania3)

output:
['pizza', 'pierogi', 'schabowe', 'sałatka']
['pizza', 'pierogi', 'schabowe', 'sałatka']
['pierogi', 'schabowe', 'sałatka']
['pierogi', 'schabowe', 'sałatka']
['pizza', 'pierogi', 'schabowe', 'sałatka']

#krotka (tuple)
krot = (100,50,200)
print(krot[0])
krot[0] = 10
100
TypeError: 'tuple' object does not support item assignment

PEP 8 — Style Guide for Python Code: https://www.python.org/dev/peps/pep-0008/

Rozdział 5

pizza = ['pieczarki', 'ser', 'salami', 'sos pomidorowy', 'peperoni']

if 'pieczarki' in pizza:
	print('pizza z pieczarkami!')
if 'ananas' not in pizza:
	print('pizza bez ananasa!')

output:
pizza z pieczarkami!
pizza bez ananasa!

wiek = 20

if wiek >= 18 and wiek <= 90:
	print('jesteś w odpowiednim wieku, żeby pić alkohol!')
elif wiek >90:
	print('jesteś za stary za alkohol')
else:
	print('jesteś za młody na alkohol')

output:
jesteś w odpowiednim wieku, żeby pić alkohol!

current_users = ['tadeusz', 'krzysiek', 'kamil', 'marysia','stefan', 'barbara']
new_users = ['dominika','ewa','tomasz','kamil']

for new_user in new_users:
	if new_user in current_users:
		print('Użytkownik ',new_user,' jest zajęty, wybierz innego!')

output:
Użytkownik  kamil  jest zajęty, wybierz innego!

Rozdział 6

#słowniki (dictionary)
alien_0 = {'kolor': 'zielony', 'punkty': 5}
print(alien_0)
print(alien_0['punkty'])

alien_0['position_x'] = 10
alien_0['position_y'] = 50

alien_0['kolor'] = 'czerwony'
del alien_0['punkty']

print(alien_0)

output:
{'kolor': 'zielony', 'punkty': 5}
5
{'kolor': 'czerwony', 'position_x': 10, 'position_y': 50}

#brak wpisu w słowniku
slow = {
	'adam': 'python',
	'ewa': 'java',
	'krzysiek': 'c++'
}

print(slow['karolina'])

output:
KeyError: 'karolina'

tmp = slow.get('karolina', 'Brak wpisu')
print(tmp)

output:
Brak wpisu

#6.9 zagnieżdżony słownik
adam = {
	'wiek': 30,
	'adres': 'długa 5',
	'waga': 100,
}

ewa = {
	'wiek': 20,
	'adres': 'krótka 5',
	'waga': 50,
}

osoby = {}
osoby['adam'] = adam
osoby['ewa'] = ewa

print(osoby)

output:
{'adam': {'wiek': 30, 'adres': 'długa 5', 'waga': 100}, 'ewa': {'wiek': 20, 'adres': 'krótka 5', 'waga': 50}}


Rozdział 7

sublime text doesn’t take input:

Tools -> Install Package Control (if not present)

#wprowadzanie danych z konsoli
wzrost = input('Podaj swój wzrost (w cm): ')
wzrost = int(wzrost)
if wzrost >= 180:
	print('jesteś wysoki!')
else: 
	print('jesteś niski!')

#pętla while
nr = 1
while nr <= 5:
	print(nr)
	nr += 1
output:
1
2
3
4
5

#pętla while
print("Napisz coś, jak chcesz skończyć napisz 'koniec'")

text = ''
while text != 'koniec':
	text = input('wprowadź text: ')
	print('wpisałeś: ',text)

#modyfikacja listy w pętli while (dobra praktyka)
niezweryfikowani = ['krzysiek', 'alicja', 'stefania']
zweryfikowani = []

while niezweryfikowani:
	uzytkownik = niezweryfikowani.pop()
	print('weryfikujemy Pana/Panią: ',uzytkownik.title())
	zweryfikowani.append(uzytkownik)

print('\nzweryfikowanie użytkownicy:')
for uzytkownik in zweryfikowani:
	print(uzytkownik.title())

output:
weryfikujemy Pana/Panią:  Stefania
weryfikujemy Pana/Panią:  Alicja
weryfikujemy Pana/Panią:  Krzysiek

zweryfikowanie użytkownicy:
Stefania
Alicja

#usuwanie powtarzających się elementów listy
zwierzeta = ['pies', 'kot', 'zaba', 'pies', 'kon', 'pies']
print(zwierzeta)

while 'pies' in zwierzeta:
	zwierzeta.remove('pies')
print(zwierzeta)

output:
['pies', 'kot', 'zaba', 'pies', 'kon', 'pies']
['kot', 'zaba', 'kon']


Rozdział 8

#definiowanie funkcji
def powitanie(imie, nazwisko, adres=''):  #parametry funkcji
	print('\nwitaj towarzyszu!')
	print('Imię:     ',imie)
	print('Nazwisko: ',nazwisko)
	if adres:
		print('Adres:    ',adres)

powitanie('Jan','Kowalski') #argumenty funkcji
powitanie(nazwisko='Kowalski',imie='Jan', adres='ul. Długa 8')

output:

witaj towarzyszu!
Imię:      Jan
Nazwisko:  Kowalski

witaj towarzyszu!
Imię:      Jan
Nazwisko:  Kowalski
Adres:     ul. Długa 8

#przekazywanie kopii listy do funkcji
def usun_pierwszy(lista):
	del lista[0]

lista = ['żaba', 'kangur', 'małpa','słoń']
print(lista)

usun_pierwszy(lista[:]) #przekazujemy kopię listy
print(lista)

usun_pierwszy(lista)
print(lista)

output:
['żaba', 'kangur', 'małpa', 'słoń']
['żaba', 'kangur', 'małpa', 'słoń']
['kangur', 'małpa', 'słoń']

#przekazywanie dowolnej liczby argumentów
def pizza(rozmiar, *dodatki):
	print('zamówiłeś pizzę o rozmiarze: ',rozmiar)
	print('dodatki: ', end=' ')	
	for dodatek in dodatki:
		print(dodatek, end=' ')

pizza(12, 'salami', 'pieczarki', 'ser')

output:
zamówiłeś pizzę o rozmiarze:  12
dodatki:  salami pieczarki ser

#przekazywanie dowolnej liczby argumentów w postaci par klucz-wartość
def pizza(rozmiar, **dodatki):
	'''Takes size of pizza and toppings and prints them''' 
	print('zamówiłeś pizzę o rozmiarze: ',rozmiar)
	print('dodatki: ', end=' ')	
	for key,value in dodatki.items():
		print('Klucz: ',key,' Wartość: ',value)

pizza(12, ciasto='grube',ser='mozarella', sos='czosnkowy')

output:
dodatki:  Klucz:  ciasto  Wartość:  grube
Klucz:  ser  Wartość:  mozarella
Klucz:  sos  Wartość:  czosnkowy

#import całego modułu
import pizza

pizza.make_pizza(30, 'pepperoni')

#import określonych funkcji
from pizza import make_pizza1, make_pizza2

make_pizza1(30, 'pepperoni')
make_pizza1(40, 'margherita')

#użycie aliasu dla zaimportowanej funkcji
from pizza import make_pizza as mp

mp(30, 'pepperoni')

#import całego modułu
from pizza import *

make_pizza(30, 'pepperoni')



Rozdział 9

#wprowadzenie do klas
class Dog():
	"""prosty model psa"""

	def __init__(self, name, age):		#definicja konstruktora klasy, każda metoda klasy musi mieć parametr self
		"""Inicjalizacja atrybutów name i age."""
		self.name = name
		self.age = age

	def sit(self): 						#definicja metody klasy
		"""Symulacja, że pies siada po otrzymaniu polecenia."""
		print(self.name.title(),' teraz siedzi.')

	def roll_over(self):
		"""Symulacja, że pies kładzie się na plecy po otrzymaniu polecenia"""
		print(f"{self.name.title()} teraz położył się na plecy!")


my_dog = Dog('Bongo', '7 miesięcy')
print('Mój pies ma na imię: ',my_dog.name.title())
print('Wiek mojego psa: ',my_dog.age)
my_dog.sit()
my_dog.roll_over()

output:
Mój pies ma na imię:  Bongo
Wiek mojego psa:  7 miesięcy
Bongo  teraz siedzi.
Bongo teraz położył się na plecy!

class Car():
	
	def __init__(self, make, model, year):
		"""Inicjalizacja atrybutów opisujących samochód."""
		self.make = make
		self.model = model
		self.year = year
		self.odometer = 0 				 #wartość domyślna argumentu
	def drive(self):
		"""Rozpoczęcie jazdy"""
		print('Jedziemy samochodem!')

	def update_odometer(self, odometer):
		self.odometer += odometer

	def get_details(self):
		print('Producent:',self.make,'Model:',self.model,'Rocznik:',self.year)

car1 = Car('yes', 'Octavia', 1999)
car1.drive()
print('Przebieg przed aktualizacją:', car1.odometer)
car1.update_odometer(20)
print('Przebieg po aktualizacji:', car1.odometer)
car1.update_odometer(20)
print('Przebieg po aktualizacji:', car1.odometer)

output:
Jedziemy samochodem!
Przebieg przed aktualizacją: 0
Przebieg po aktualizacji: 20
Przebieg po aktualizacji: 40

#dziedziczenie
class ElectricCar(Car):
	"""Dziedziczymy po klasie Car"""

	def __init__(self, make, model, year):
		"""Inicjalizacja atrybutów klasy nadrzędnej"""
		super().__init__(make, model, year)		#przez super odwołujemy się do klasy nadrzędnej

my_tesla = ElectricCar('Tesla', 'model s', 2019)
my_tesla.get_details()

output:
Producent: Tesla Model: model s Rocznik: 2019

Rozdział 10

zawartość pliku pi_digits.txt:
3.1415926535
  8979323846
  2643383279

#wyświetlenie treści pliku
with open('pi_digits.txt') as file_object:
	contents = file_object.read()
print(contents)

output:
3.1415926535
  8979323846
  2643383279

#odczyt pliku linia po lini
with open('pi_digits.txt') as file_object:
	for line in file_object:
		print(line.rstrip())

output:
3.1415926535
  8979323846
  2643383279

#odczyt pliku do listy
with open('pi_digits.txt') as file_object:
	lines = file_object.readlines()
	pi_string = ''
	for line in lines:
		pi_string += line.strip()	
	print(pi_string)

pi = float(pi_string)
print(pi)

output:
3.141592653589793238462643383279
3.141592653589793

#zapisywanie danych do pliku
filename = 'programming.txt'

with open(filename, 'w') as file_object:	#tryby: w - write, r - read, a - append, r+ - read/write 
	file_object.write('Uwielbiam programować.\n')
	file_object.write('Uwielbiam tworzyć gry.\n')

with open(filename, 'a') as file_object:
	file_object.write('Uwielbiam analizować dane.')

#obsługa wyjątku  ZeroDivisionError
try:
	print(5/0)
except ZeroDivisionError:
	print("Nie można dzielić prze zero!")


while True:
	nb1 = input('Podaj liczbę numer 1 (q to quit)')
	if nb1 == 'q':
		break

	nb2 = input('Podaj liczbę numer 2 (q to quit)')
	if nb2 == 'q':
		break

	try:
		wynik = int(nb1) / int(nb2)

	except ZeroDivisionError:
		print("Nie można dzielić prze zero!")
	else:
		print('Wynik to: ',wynik)

#obsługa wyjątku FileNotFoundError
filename = "alicja.txt"

try:
	with open(filename, encoding = 'utf-8') as f:
		contents = f.read()
except FileNotFoundError: 
	print('nie ma takiego pliku')    #można dać pass

output:
nie ma takiego pliku

#zliczenia słów
filename = "alice in wonderland.txt"

try:
	with open(filename, encoding = 'utf-8') as f:
		contents = f.read()
except FileNotFoundError:
	print('nie ma takiego pliku')

words = contents.split()
print('Ilość słów w:',len(words))

#zapisywanie danych w formacie json
import json

numbers = [2 ,3 ,5 ,7 ,11]

filename = 'numbers.json'
with open(filename, 'w') as f:
	json.dump(numbers, f)

with open(filename) as f:
	json_text = json.load(f)

print('odczytany text: ',json_text)

output:
odczytany text:  [2, 3, 5, 7, 11]

Rozdział 11 – Testowanie kodu

zawartość pliku name_function.py:
def get_formatted_name(first, last):
	"""Generuje elegancko sformatowane pełne imię i nazwisko."""
	full_name = f"{first} {last}"
	return full_name.title()

zawartość pliku test_name_function.py:
import unittest 
from name_function import get_formatted_name

class NamesTestCase(unittest.TestCase):
	"""Testy dla programu 'name_function.py'."""
	
	def test_first_last_name(self):
		"""Czy dane w postaci 'Janis Joplin' są obsługiwane prawidłowo?"""
		formatted_name = get_formatted_name('janis', 'joplin')
		self.assertEqual(formatted_name, 'Janis Joplin')

if __name__ == '__main__':
	unittest.main()

output:
OK

Projekt 2. Wizualizacja danych

biblioteka matplotlib: przykłady