umz21/lab/02_Wczytywanie_i_prezentowanie_danych.ipynb
2021-03-05 08:21:24 +01:00

538 KiB
Raw Blame History

Uczenie maszynowe 2019/2020 laboratoria

9/10 marca 2020

2. Wczytywanie i prezentowanie danych

Przechowywanie danych w plikach w formatach CSV i TSV

CSV (_Comma-Separated Values) i TSV (Tab-Separated Values) to proste formaty przechowywania danych tabelarycznych w postaci tekstowej.

Każdy rekord zapisywany jest w osobnym wierszu, a poszczególne pola oddzielone są przecinkami (CSV) lub znakami tabulacji (TSV).

Przykład

Następujące dane tabelaryczne:

imię nazwisko rok ur. adres
Jan Nowak 1999 Poznańska 3, Warszawa
Anna Kowalska 2001 Warszawska 9, Poznań
Ewa Kaczmarek 1990 Wrocławska 123, Gdańsk

możemy zapisać w formacie CSV jako:

imię,nazwisko,rok ur.,adres
Jan,Nowak,1999,"Poznańska 3, Warszawa"
Anna,Kowalska,2001,"Warszawska 9, Poznań"
Ewa,Kaczmarek,1990,"Wrocławska 123, Gdańsk"

lub w formacie TSV jako:

imię    nazwisko    rok ur. adres
Jan     Nowak       1999    Poznańska 3, Warszawa
Anna    Kowalska    2001    Warszawska 9, Poznań
Ewa     Kaczmarek   1990    Wrocławska 123, Gdańsk

W formacie TSV poszczególne pola oddzielone są znakami tabulacji, a nie spacjami.

Znak tabulacji to ten biały (tj. niedrukowalny) znak, który pojawia się po naciśnięciu klawisza Tab na klawiaturze.

Formaty CSV i TSV mają tę zaletę, że są proste, łatwe do przetorzenia przez komputer oraz czytelne dla człowieka.

Wczytywanie danych z plików CSV i TSV

Biblioteka csv

import csv

with open('data1.csv') as data_file:
    reader = csv.reader(data_file)
    for row in reader:
        print(row)
['price', 'isNew', 'rooms', 'floor', 'location', 'sqrMetres']
['476118.0', 'False', '3', '1', 'Centrum', '78']
['459531.0', 'False', '3', '2', 'Sołacz', '62']
['411557.0', 'False', '3', '0', 'Sołacz', '15']
['496416.0', 'False', '4', '0', 'Sołacz', '14']
['406032.0', 'False', '3', '0', 'Sołacz', '15']
['450026.0', 'False', '3', '1', 'Naramowice', '80']
['571229.15', 'False', '2', '4', 'Wilda', '39']
['325000.0', 'False', '3', '1', 'Grunwald', '54']
['268229.0', 'False', '2', '1', 'Grunwald', '90']
import csv

with open('data1.csv') as data_file:
    reader = csv.DictReader(data_file)
    for row in reader:
        print(dict(row))
{'price': '476118.0', 'isNew': 'False', 'rooms': '3', 'floor': '1', 'location': 'Centrum', 'sqrMetres': '78'}
{'price': '459531.0', 'isNew': 'False', 'rooms': '3', 'floor': '2', 'location': 'Sołacz', 'sqrMetres': '62'}
{'price': '411557.0', 'isNew': 'False', 'rooms': '3', 'floor': '0', 'location': 'Sołacz', 'sqrMetres': '15'}
{'price': '496416.0', 'isNew': 'False', 'rooms': '4', 'floor': '0', 'location': 'Sołacz', 'sqrMetres': '14'}
{'price': '406032.0', 'isNew': 'False', 'rooms': '3', 'floor': '0', 'location': 'Sołacz', 'sqrMetres': '15'}
{'price': '450026.0', 'isNew': 'False', 'rooms': '3', 'floor': '1', 'location': 'Naramowice', 'sqrMetres': '80'}
{'price': '571229.15', 'isNew': 'False', 'rooms': '2', 'floor': '4', 'location': 'Wilda', 'sqrMetres': '39'}
{'price': '325000.0', 'isNew': 'False', 'rooms': '3', 'floor': '1', 'location': 'Grunwald', 'sqrMetres': '54'}
{'price': '268229.0', 'isNew': 'False', 'rooms': '2', 'floor': '1', 'location': 'Grunwald', 'sqrMetres': '90'}
import csv

with open('data1.tsv') as data_file:
    reader = csv.reader(data_file, delimiter='\t')
    for row in reader:
        print(row)
['price', 'isNew', 'rooms', 'floor', 'location', 'sqrMetres']
['476118.0', 'False', '3', '1', 'Centrum', '78']
['459531.0', 'False', '3', '2', 'Sołacz', '62']
['411557.0', 'False', '3', '0', 'Sołacz', '15']
['496416.0', 'False', '4', '0', 'Sołacz', '14']
['406032.0', 'False', '3', '0', 'Sołacz', '15']
['450026.0', 'False', '3', '1', 'Naramowice', '80']
['571229.15', 'False', '2', '4', 'Wilda', '39']
['325000.0', 'False', '3', '1', 'Grunwald', '54']
['268229.0', 'False', '2', '1', 'Grunwald', '90']
import csv

with open('data1.tsv') as data_file:
    reader = csv.DictReader(data_file, delimiter='\t')
    for row in reader:
        print(dict(row))
{'price': '476118.0', 'isNew': 'False', 'rooms': '3', 'floor': '1', 'location': 'Centrum', 'sqrMetres': '78'}
{'price': '459531.0', 'isNew': 'False', 'rooms': '3', 'floor': '2', 'location': 'Sołacz', 'sqrMetres': '62'}
{'price': '411557.0', 'isNew': 'False', 'rooms': '3', 'floor': '0', 'location': 'Sołacz', 'sqrMetres': '15'}
{'price': '496416.0', 'isNew': 'False', 'rooms': '4', 'floor': '0', 'location': 'Sołacz', 'sqrMetres': '14'}
{'price': '406032.0', 'isNew': 'False', 'rooms': '3', 'floor': '0', 'location': 'Sołacz', 'sqrMetres': '15'}
{'price': '450026.0', 'isNew': 'False', 'rooms': '3', 'floor': '1', 'location': 'Naramowice', 'sqrMetres': '80'}
{'price': '571229.15', 'isNew': 'False', 'rooms': '2', 'floor': '4', 'location': 'Wilda', 'sqrMetres': '39'}
{'price': '325000.0', 'isNew': 'False', 'rooms': '3', 'floor': '1', 'location': 'Grunwald', 'sqrMetres': '54'}
{'price': '268229.0', 'isNew': 'False', 'rooms': '2', 'floor': '1', 'location': 'Grunwald', 'sqrMetres': '90'}

Biblioteka pandas

import pandas as pd

data = pd.read_csv('data1.csv')
print(data)
       price  isNew  rooms  floor    location  sqrMetres
0  476118.00  False      3      1     Centrum         78
1  459531.00  False      3      2      Sołacz         62
2  411557.00  False      3      0      Sołacz         15
3  496416.00  False      4      0      Sołacz         14
4  406032.00  False      3      0      Sołacz         15
5  450026.00  False      3      1  Naramowice         80
6  571229.15  False      2      4       Wilda         39
7  325000.00  False      3      1    Grunwald         54
8  268229.00  False      2      1    Grunwald         90
import pandas as pd

data = pd.read_csv('data1.tsv', sep='\t')
print(data)
       price  isNew  rooms  floor    location  sqrMetres
0  476118.00  False      3      1     Centrum         78
1  459531.00  False      3      2      Sołacz         62
2  411557.00  False      3      0      Sołacz         15
3  496416.00  False      4      0      Sołacz         14
4  406032.00  False      3      0      Sołacz         15
5  450026.00  False      3      1  Naramowice         80
6  571229.15  False      2      4       Wilda         39
7  325000.00  False      3      1    Grunwald         54
8  268229.00  False      2      1    Grunwald         90
print(data.to_numpy())  # dane z Pandas DataFrame można przekonwertować na tablicę NumPy
[[476118.0 False 3 1 'Centrum' 78]
 [459531.0 False 3 2 'Sołacz' 62]
 [411557.0 False 3 0 'Sołacz' 15]
 [496416.0 False 4 0 'Sołacz' 14]
 [406032.0 False 3 0 'Sołacz' 15]
 [450026.0 False 3 1 'Naramowice' 80]
 [571229.15 False 2 4 'Wilda' 39]
 [325000.0 False 3 1 'Grunwald' 54]
 [268229.0 False 2 1 'Grunwald' 90]]

Wykresy biblioteka matplotlib

Dokumentacja modułu pyplot biblioteki matplotlib: https://matplotlib.org/api/pyplot_api.html

%matplotlib inline
import matplotlib.pyplot as plt

# Prosty wykres punktowy
# Litery 'ro' oznaczają, że dane zostaną przedstawione za pomocą czerwonych kółek:
#    'r' ('red')  czerwone
#    'o'  kółko
# Zobacz też: https://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.plot

plt.plot([1,2,3,4], [1,4,9,16], 'ro')
plt.axis([0, 5, 0, 20])  # opis osi wykresu

plt.show()  # pokaż wykres
import numpy as np
import matplotlib.pyplot as plt

# inicjalizacja
fig = plt.figure()
# dodanie "podwykresu" (zobacz: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.subplot )
ax = fig.add_subplot(111)

ax.set_ylabel('volts')  # opis osi y
ax.set_title('a sine wave')  # tytuł wykresu

t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2*np.pi*t)
line = ax.plot(t, s, color='red', lw=2)

plt.show()  # pokaż wykres

Style wykresów

import numpy as np
import matplotlib.pyplot as plt

# inicjalizacja zestawu wykresów
fig = plt.figure(figsize=(10,8))

# wygenerowanie danych
t = np.arange(0.0, 1.0, 0.01)
s = np.sin(2*np.pi*t)

# pierwszy wykres
ax1 = fig.add_subplot(3,1,1)
ax1.set_ylabel('volts')
ax1.set_title('a sine wave')

line1 = ax1.plot(t, s+5.0, color='blue', lw=2)
line2 = ax1.plot(t, s+2.5, color='red', lw=2)
line3 = ax1.plot(t, s, color='orange', lw=2)

# drugi wykres
ax2 = fig.add_subplot(3,1,2)
ax2.set_ylabel('volts')
ax2.set_title('a sine wave')

line1 = ax2.plot(t, s+5.0, color='black', lw=2,linestyle="--")
line2 = ax2.plot(t, s+2.5, color='black', lw=2,linestyle="-.")
line3 = ax2.plot(t, s, color='#000000', lw=2,linestyle=":")

# trzeci wykres
ax3 = fig.add_subplot(3,1,3)
ax3.set_ylabel('volts')
ax3.set_title('a sine wave')

line1 = ax3.plot(t,s+5.0, color='blue', marker="+")
line2 = ax3.plot(t,s+2.5, color='red', marker="o")
line3 = ax3.plot(t,s, color='orange', marker="^")

# dostosowanie odstępów pomiędzy wykresami
plt.subplots_adjust(wspace=0.2,hspace=.4)

plt.show()  # pokaż wykres

Wykresy trójwymiarowe  linie

import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')

theta = np.linspace(-4 * np.pi, 4 * np.pi, 50)
z = np.linspace(-2, 2, 50)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)

ax.plot(x, y, z, label='parametric curve')
ax.legend()  # pokaż legendę wykresu

plt.show()  # pokaż wykres

Wykresy trójwymiarowe powierzchnie

from mpl_toolkits.mplot3d import Axes3D  # niezbędne do rysowania powierzchni w 3 wymiarach
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111, projection='3d')

X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)  # wygenerowanie tablicy danych wejściowych dla wykresu trójwymiarowego
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)  # obliczenie wartości rzędnych

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,
        linewidth=0, antialiased=True)

plt.show()

Wykresy kolumnowe

import numpy as np
import matplotlib.pyplot as plt

# data: scores in five groups for men and women
N = 5
menMeans   = [18, 35, 30, 35, 27]
menStd     = [2, 3, 4, 1, 2]
womenMeans = [25, 32, 34, 20, 25]
womenStd   = [3, 5, 2, 3, 3]

# start creating figure
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111)

# necessary variables
LOCATIONS = np.arange(N)  # the x locations for the groups
WIDTH = 0.35              # the width of the bars

# the bars
rects_m = ax.bar(LOCATIONS, menMeans, WIDTH,
                color='blue',
                yerr=menStd,
                error_kw=dict(elinewidth=2,ecolor='red'))

rects_f = ax.bar(LOCATIONS+WIDTH, womenMeans, WIDTH,
                 color='red',
                 yerr=womenStd,
                 error_kw=dict(elinewidth=2,ecolor='blue'))

# axes and labels
ax.set_xlim(-WIDTH, len(LOCATIONS))
ax.set_ylabel("Scores")
ax.set_title("Scores by group and gender")
xTickMarks = ["Group {}".format(i) for i in range(1,6)]
ax.set_xticks(LOCATIONS + WIDTH)
xtickNames = ax.set_xticklabels(xTickMarks)
plt.setp(xtickNames, rotation=45, fontsize=10)

# add a legend
ax.legend( (rects_m[0], rects_f[0]), ('Men', 'Women') )

plt.show()

Wykresy punktowe

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(15,7))

# left panel
N = 1000
ax1 = fig.add_subplot(121)

x = np.random.randn(N)
y = np.random.randn(N)
ax1.scatter(x, y, color='blue', s=10, edgecolor='none')
# make axes square
ax1.set_aspect(1. / ax1.get_data_ratio()) 

# right panel
ax2 = fig.add_subplot(122)
props = dict(alpha=0.5, edgecolors='none')

M = 200
colors = ['blue', 'green', 'magenta', 'cyan']
handles = []

for color in colors:
    x = np.random.randn(M)
    y = np.random.randn(M)
    size = np.random.randint(25,200)
    handles.append(ax2.scatter(x, y, c=color, s=size, **props))

#ax2.set_ylim([-5,10])
#ax2.set_xlim([-5,10])

ax2.legend(handles, colors)
ax2.grid(True)
ax2.set_aspect(1./ax2.get_data_ratio())

plt.show()

Histogramy

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111)

x = np.random.normal(0, 1, 1000)
num_bins = 50
ax.hist(x, num_bins, color='green', alpha=0.8)
plt.show()

Zadania

Zadania podstawowe

Zadanie 2.1 (2 punkty)

Wybierz dwie dowolne kolumny (z wyjątkiem pierwszej) z pliku _data2.csv. Przedstaw zależność między tymi danymi na wykresie punktowym (wartości z jednej kolumny powinny znaleźć się na jednej osi, a wartości z drugiej kolumny na drugiej osi).

Zadanie 2.2 (2 punkty)

Wygeneruj wykres funkcji $y = f(x) = (a - 4) , x^2 + (b - 5) , x + (c - 6)$, gdzie $a, b, c$ to trzy ostatnie cyfry Twojego numeru indeksu. Pamiętaj o opisaniu osi wykresu ($x$ oraz $y$).

Zadania zaawansowane

Zadanie 2.2a (1 punkt)

Na wykresie z zadania 2.2 przedstaw dodatkowo wykres funkcji $y = g(x) = \frac{e^x}{e^x + 1}$. Linie przestawiające funkcje $y = f(x)$ i $y = g(x)$ powinny znaleźć się na tym samym wykresie, ale powinny różnić się kolorami.

Zadanie 2.3 (1 punkt)

Stwórz trójwymiarowy (pownierzchniowy) wykres funkcji $f(x,y) = -(x^2 + y^3)$.

Wykres powinien przedstawiać powierzchnię $z = -(x^2 + y^3)$.