Octave w obliczeniach: ramki danych

Szanowni Państwo
Ramkę danych (dataframe) można wyobrazić sobie jako tabelę ze zmiennymi w kolumnach. Ramka danych może przechowywać w poszczególnych kolumnach zmienne liczbowe i tekstowe jednocześnie. Kolumny posiadają nazwy i można się do nich odwoływać zarówno poprzez indeks (jak w tablicach), jak i poprzez nazwę. Wiersze ramki danych tworzą rekordy danych (każdy wiersz to oddzielny, kompletny zestaw danych). Tak w przypadku ramek danych, jak i w przypadku innych, zaawansowanych typów danych w aplikacji Octave obowiązuje ta sama zasada: do wykonywania obliczeń najlepiej nadają się tablice (macierze, wektory – cokolwiek chcecie); ramki danych najlepiej sprawdzają się podczas prezentacji danych oraz importu danych zewnętrznych, np. z plików tekstowych (chociaż tu ustępują pierwszeństwa komórkom – ale o komórkach opowiemy sobie innym razem).
Ramki danych pozwolą nam przećwiczyć pracę z pakietami Octave’a – nie ma ich bowiem w samym pakiecie. Wymagają załadowania do pamięci pakietu o nazwie dataframe. Ale to przećwiczymy już za chwilę w praktyce.

Jako pierwsze – załadowanie do pamięci Octave’a pakietu dataframe – jak pamiętamy z poprzedniego wpisu, jest on niezbędny do pracy z ramkami danych

>> pkg load dataframe
>> 

Octave jest bardzo umiarkowany w pochwałach, ale nie szczędzi informacji o kłopotach. Skoro nic nie mówi – udało się. Pakiet dataframe został załadowany do pamięci.

Wyświetlenie zawartości pliku z danymi

>> type plikLista.txt

Jan Kowalski,A,1,100
Anna Japok,B,3,85
Janusz Nowak,C,4,60
Iwona Stobrawa,A,5,100

Naszą ramkę danych zbudujemy z danych przechowywanych w pliku o nazwie plikLista.txt. Przed rozpoczęciem odczytu danych z pliku tekstowego warto obejrzeć zawartość pliku w dowolnym programie. Pozwala to na rozpoznanie elementów struktury pliku: nagłówka (bądź jego braku), separatora (czyli znaku oddzielającego poszczególne kolumny w pliku, separatora dziesiętnego i innych podobnych elementów, których prawidłowe ustawienie podczas odczytu danych z pliku może zadecydować o sukcesie lub niepowodzeniu całej operacji. W przypadku pakietów Matlab / Octave można wyświetlić zawartość badanego pliku w oknie edytora lub, jak w naszym przypadku, użyć polecenia type plikLista.txt, co pozwoli na wyświetlenie zawartości pliku w oknie poleceń. Zauważmy, że dane w pliku nie mają nagłówka, poszczególne pola danych (cztery w każdym wierszu) oddzielone są od siebie przecinkami, dane tekstowe nie są też w żaden szczególny sposób wyodrębnione – nie są zamknięte w cudzysłowy ani w apostrofy.

Tworzenie ramki danych z pliku *.csv (*.txt)

>> df = dataframe('plikLista.txt')

 df = dataframe with 4 rows and 4 columns
   Src: plikLista.txt                      
   _1             X1   X2     X3     X4    
   Nr           char char double double    
   1   Jan Kowalski    A      1    100    
   2     Anna Japok    B      3     85    
   3   Janusz Nowak    C      4     60    
   4 Iwona Stobrawa    A      5    100    

Zawartość pliku tekstowego została zaimportowana do zmiennej df, która jest ramką danych zawierającą 4 wiersze i 4 kolumny. Podczas importu zostały im nadane automatycznie nazwy X1, X2, X3 i X4 (w pliku źródłowym nie było nagłówka danych, który mógłby dostarczyć nazw tworzonym kolumnom). Jak łatwo zauważyć, zawartość pliku tekstowego została prawidłowo zaimportowana do zmiennej Octave’a. Zauważyć też można, że z lewej strony zawartości zmiennej df pojawiła się kolumna oznaczona jako _1 i typu Nr. Octave „nie zauważył” jej, zliczając kolumny ramki danych. Ta kolumna zawiera indeksy – numery wierszy ramki danych.

Oglądanie danych ramki df

>> df(1,1)
ans = dataframe with 1 rows and 1 columns
Src: plik_1.csv
_1           X1
Nr         char
 1 Jan Kowalski

>> df(1,:)
ans = dataframe with 1 rows and 4 columns
Src: plik_1.csv
_1           X1   X2     X3     X4
Nr         char char double double
 1 Jan Kowalski    A      1    100


>> df(1:3,:)
ans = dataframe with 3 rows and 4 columns
Src: plik_1.csv
_1           X1   X2     X3     X4
Nr         char char double double
 1 Jan Kowalski    A      1    100
 2   Anna Japok    B      3     85
 3 Janusz Nowak    C      4     60


>> df([1 1 1 3],:)
ans = dataframe with 4 rows and 4 columns
Src: plik_1.csv
_1           X1   X2     X3     X4
Nr         char char double double
 1 Jan Kowalski    A      1    100
 1 Jan Kowalski    A      1    100
 1 Jan Kowalski    A      1    100
 3 Janusz Nowak    C      4     60


>> df(:,end)
ans = dataframe with 4 rows and 1 columns
Src: plik_1.csv
_1     X4
Nr double
 1    100
 2     85
 3     60
 4    100    

Zobaczyliśmy różne fragmenty ramki df. W celu wyselekcjonowania odpowiedniego zakresu danych ze zmiennej df używaliśmy składni typowej dla tablic Octave’a. Zwróćmy uwagę, że wyświetlone tą metodą fragmenty ramki df były również ramkami danych.
Teraz wypróbujmy innego sposobu dostępu do danych przechowywanych w ramce danych df.

>> df.X1            % Ten sposób dostępu do danych zwraca dane w postaci tablic liczbowych lub tekstowych
                    % czyli podstawowych, wbudowanych typów danych Octave'a
ans =

Jan Kowalski
Anna Japok
Janusz Nowak
Iwona Stobrawa

>> class(df.X1)    % Jak widać polecenie df.X1 wyprodukuje zmienną tekstową, a nie zmienną typu dataframe
ans = char
>> df.X1

>> size(df.X1)     % rozmiar zwracanych danych: cztery wiersze, każdy po czternaście znaków
ans =

    4   14    

   

Edycja nazw kolumn ramki danych

>> df.colnames

ans =

X1
X2  
X3 
X4   

>> df.colnames = {'NABYWCA';'KLASA';'LICZBA';'CENA'}

df = dataframe with 4 rows and 4 columns
Src: plikLista.txt                      
_1        NABYWCA KLASA LICZBA   CENA   
Nr           char  char double double   
 1   Jan Kowalski     A      1    100   
 2     Anna Japok     B      3     85   
 3   Janusz Nowak     C      4     60   
 4 Iwona Stobrawa     A      5    100  

Ramka danych ma kilka skojarzonych ze sobą kolekcji, do których odwołujemy się przy pomocy składni zaprezentowanej powyżej: zmienna.kolekcja. Kolekcja colnames przechowuje nazwy wszystkich kolumn ramki danych. Zatem polecenie df.colnames wyświetliło nazwy kolumn ramki danych df. Możemy również przypisywać własną zawartość tej kolekcji, czyli zmieniać nazwy kolumn. Przykład takiej operacji został zaprezentowany powyżej. Należy pamiętać, że nowa zawartość musi być podana jako komórka – musi być ujęta w nawiasy klamrowe '{ }’.
O komórkach i strukturach opowiemy sobie w jednym z kolejnych wpisów.

Dodawanie kolumny do ramki danych

>> df.WARTOSC = df.LICZBA.*df.CENA


  df = dataframe with 4 rows and 5 columns

  _1        NABYWCA KLASA LICZBA   CENA WARTOSC

  Nr           char  char double double  double

  1   Jan Kowalski     A      1    100     100

  2     Anna Japok     B      3     85     255

  3   Janusz Nowak     C      4     60     240

  4 Iwona Stobrawa     A      5    100     500     

Należy zwrócić uwagę na łatwość dodawania nowych kolumn do ramki danych. Powyższy przykład pokazuje utworzenie nowej kolumny o nazwie WARTOSC, której poszczególne elementy stanowią iloczyn odpowiednich wartości kolumn LICZBA i CENA. Proszę zwrócić uwagę na zastosowanie operatora mnożenia tablicowego ( .* )

Podobne wpisy