import numpy as np
import pandas as pd

# Ramka danych utw. ze słownika
a = pd.DataFrame({"A":np.round(np.random.uniform(0,1,5),2),\
"B":np.random.choice(["a","b",None],5),\
"C":np.random.choice([True,False],5,True,[0.4,0.6])})
Out[]:
    ...:       A     B      C
    ...: 0  0.04  None  False
    ...: 1  0.15  None  False
    ...: 2  0.61     a   True
    ...: 3  0.88     b   True
    ...: 4  0.39     b  False

pd.DataFrame(macierz)
pd.DataFrame(macierz,columns = ["a","b"])   # i dodane wlasne nazwy kolumn
df["a"]                    # dane z ramki df z kolumny o nazwie a
df.a                       # dane z ramki df z kolumny o nazwie a
df.a.values                # wartosci ramki df z kolumnyt o nazwie a
df.index                   # etykiety wierszy
df.columns                 # etykiety kolumn

df.columns = ["A","B","C","D"]      # zmiana etykiet kolumn
z = df.set_index(np.arange(1,6,1))  # zmiana etykiet wierszy
df.index.name = "Wiersze"           # dodanie nazwy wierszy
df.columns.name = "Kolumny"         # dodanie nazwy kolumn

s[0:1]                              # pierwszy wiersz
s[0:4]                              # cztery poczatkowe wiersze
s[s.values > 0.5]                   # indeksowanie za pomoca wektora logicznego
s.iloc[1]                           # wybiera elementy na podstawie kolejnosci ich wystepowania
s.loc[1]                            # wybiera elementy na podstawie ich etykiet


# Ciąg momentów czasowych
pd.Series(pd.date_range("2019-05-20",periods=5)) 
pd.Series(pd.date_range("2019-05-20 00:00:00",periods=10,freq="1H"))  

c = pd.DataFrame(np.round(np.linspace(0,10,20),2).reshape(5,4), columns = ["a","b","c","d"])
Out[]: 
      a     b     c      d
0  0.00  0.53  1.05   1.58
1  2.11  2.63  3.16   3.68
2  4.21  4.74  5.26   5.79
3  6.32  6.84  7.37   7.89
4  8.42  8.95  9.47  10.00

pd.cut(c.a,np.r_[2,4,6,8])          # podzial zbioru na klasy
Out[]: 
0           NaN
1    (2.0, 4.0]
2    (4.0, 6.0]
3    (6.0, 8.0]
4           NaN
Name: a, dtype: category
Categories (3, interval[int64]): [(2, 4] < (4, 6] < (6, 8]]

pd.cut(c.a,4)                       # podzial na 5 klas
Out[]: 
0    (-0.00842, 2.105]
1        (2.105, 4.21]
2        (2.105, 4.21]
3        (6.315, 8.42]
4        (6.315, 8.42]
Name: a, dtype: category
Categories (4, interval[float64]): [(-0.00842, 2.105] < (2.105, 4.21] < (4.21, 6.315] < (6.315, 8.42]]

# Etykiety hierarchiczne
w = pd.DataFrame({"A":np.random.beta(1,2,10)})
w.index = pd.MultiIndex(levels = [["a","b","c"],[1,2,3,4,5]],\
codes = [[0,0,0,0,0,1,1,2,1,2],\
[0,0,0,1,2,2,2,3,3,4]], names = ["lev1","lev2"])
Out[]: 
                  A
lev1 lev2          
a    1     0.120039
     1     0.344846
     1     0.279192
     2     0.446553
     3     0.078031
b    3     0.211921
     3     0.024213
c    4     0.536304
b    4     0.313813
c    5     0.068300

s = pd.Series(np.round(np.random.uniform(0,1,10),2))
i = np.r_[0:10]
np.random.shuffle(i)    # wymieszaj
s.index = i

g = s.copy()
g.index = ["a","b","c","d","e","f","g","h","i","j"]

s.sample(3,random_state =123)            # wybieranie losowe
z.insert(2,"Trzecia",(3,4))              # dodanie kolumny
n = z.drop("Druga",axis = 1)             # usuniecie kolumny , dla axis = 0 wiersza
z.loc[2]=[3,4,4]                         # dodanie wiersza

z.describe()                             # podstawowe parametry statystyczne

p1 = p.dropna()                          # usuwanie brakow
p2 = p.fillna(value = 10)                # przypisanie innej wartosci
p3 = p.fillna(method = "ffill")           # zastapienie brakow poprzednia wartoscia