zuma/lab/1b_Wczytywanie_i_prezentowanie_danych.ipynb
2022-03-12 10:10:59 +01:00

715 KiB
Raw Blame History

AITech — Uczenie maszynowe — laboratoria

1b. Wczytywanie i prezentowanie danych

Formaty CSV i TSV

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

Dane z Pandas DataFrame można przekonwertować na tablicę NumPy:

  • za pomocą właściwości values
  • za pomocą metody to_numpy() (od wersji Pandas 1.1.0)
print(data.to_numpy())  # Pandas w wersji >=1.1.0
# lub:
# print(data.values)  # dla starszych wersji biblioteki Pandas
[[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

# Trochę jupyterowej magii, żeby wykresy wyświetlały się bezpośrednio pod kodem, który go wywołuje
%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])  # opcjonalnie ustawiamy zakres osi wykresu

plt.show()  # pokaż wykres
# Wykres danych wczytanych z pliku

import matplotlib.pyplot as plt
import pandas as pd

# Wczytanie danych
data = pd.read_csv('data1.tsv', sep='\t')
data_array = data.to_numpy()

# Wybór kolumn do przedstawienia na wykresie
x = data_array[:, 0]
y = data_array[:, 5]

plt.plot(x, y, 'gx')  # "gx" - zielone (Green) krzyżyki (x)
plt.axis([0, 600000, 0, 100])  # opcjonalnie ustawiamy zakres 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_xlabel('x')  # opis osi x
ax.set_ylabel('y')  # opis osi y
ax.set_title('Wykres funkcji')  # tytuł wykresu

x = np.arange(0.0, 10.0, 0.01)  # x przebiega zakres od 0 do 10 co 0.01

# zdefiniowanie wartości y w zależności od x
y = np.sin(2*np.pi*x)
# spróbuj też inne funkcje:
# y = 2 * x**2 + 5 * x - 10
# y = np.sqrt(x)

ax.plot(x, y, color='blue', lw=2)  # "lw" oznacza grubość linii (Line Width)

plt.show()  # pokaż wykres

Style wykresów

# Umieszczanie kilku układów współrzędnych i kilku wykresów na jednym rysunku

import numpy as np
import matplotlib.pyplot as plt

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

# wygenerowanie danych
x = np.arange(0.0, 1.0, 0.025)
y1 = np.sin(2*np.pi*x) + 5.0
y2 = np.sin(2*np.pi*x) + 2.5
y3 = np.sin(2*np.pi*x)

# pierwszy wykres
ax1 = fig.add_subplot(3,1,1)
ax1.set_ylabel('y')
ax1.set_title('pierwszy wykres')

ax1.plot(x, y1, color='red', lw=2)  # pierwsza krzywa - czerwona
ax1.plot(x, y2, color='green', lw=2)  # druga krzywa - zielona
ax1.plot(x, y3, color='#002d69', lw=2)  # trzecia krzywa - kolor zdefiniowany szesnastkowo

# drugi wykres
ax2 = fig.add_subplot(3,1,2)
ax2.set_ylabel('y')
ax2.set_title('drugi wykres')

ax2.plot(x, y1, color='black', lw=2,linestyle="--")  # pierwsza krzywa - kreskowana
ax2.plot(x, y2, color='blue', lw=2,linestyle=":")  # druga krzywa - kropkowana
ax2.plot(x, y3, color='#ff0000', lw=2,linestyle="-.")  # trzecia krzywa - kropkowano-kreskowana

# trzeci wykres
ax3 = fig.add_subplot(3,1,3)
ax3.set_ylabel('y')
ax3.set_title('trzeci wykres')

ax3.plot(x, y1, color='brown', marker="x")  # pierwsza krzywa - krzyżyki
ax3.plot(x, y2, color='purple', marker="o")  # druga krzywa - kółka
ax3.plot(x, y3, color='orange', marker="^")  # trzecia krzywa - trójkąty

# 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='krzywa parametryczna')
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

# obliczenie wartości rzędnych
Z = np.sqrt(X**2 + Y**2) 
# Spróbuj też innych funkcji
# Z = np.sin(np.sqrt(X**2 + Y**2))  
# Z = np.cos(X + Y)  
# Z = X**2 * Y

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

Wizualizacja danych - biblioteka seaborn

Biblioteka seaborn (https://seaborn.pydata.org) to oparta o matplotlib biblioteka do wizualizacji danych.

Przykład 1

Wizualizacja zbioru danych _Iris poprzez rzutowanie go na różne osie:

import pandas as pd
import seaborn

data_iris = pd.read_csv('../wyk/iris.csv')

seaborn.pairplot(
    data_iris,
    vars=[c for c in data_iris.columns if c != 'Gatunek'], 
    hue='Gatunek', height=1.5, aspect=1.75)
<seaborn.axisgrid.PairGrid at 0x20279e6c0d0>

Przykład 2

Rozkład różnych typów zabudowy w zbiorze danych _Mieszkania4 pod względem roku budowy i powierzchni lokalu

import pandas as pd
import seaborn

data = pd.read_csv('../wyk/mieszkania4.tsv', sep='\t')

data = data[
    (data['Powierzchnia w m2'] < 10000)
    & (data['cena'] < 10000000)
    ]

seaborn.relplot(data=data, x='Rok budowy', y='Powierzchnia w m2', hue='Typ zabudowy')
<seaborn.axisgrid.FacetGrid at 0x202002cc580>