Import danych z wielu plików
W zasadzie tutorial został zakończony. Celem dotychczasowych wpisów serii było zaznajomienie użytkownika ze środowiskiem MATLAB na tyle, by mógł on usiąść przed komputerem i zacząć z programem w miarę wygodnie pracować. Oczywiście w praktyce, gdy przychodzi zmierzyć się z rzeczywistym problemem, dość szybko okazuje się, że czegoś ważnego w tutorialu nie było… No i jest to jak najbardziej zrozumiała sytuacja. Wszystkiego zamknąć w krótkim samouczku nie sposób, można jednak poruszyć kilka dość często pojawiających się problemów. A jeden z najczęściej pojawiających się, to problem sprawnego odczytu danych z wielu plików.
Dla przykładu weźmy dane dotyczące średnich kursów wymiany walut, które od dekad zbiera Narodowy Bank Polski. Dane są udostępniane na stronie internetowej w formie plików .xls. Dla uproszczenia przyjmijmy, że wszystkie pliki zostały zebrane w jednym katalogu, naszym katalogu roboczym.
W MATLABie możemy korzystać z poleceń dir
oraz ls
, które odpowiedzialne są za wyświetlenie informacji o plikach znajdujących się we wskazanym katalogu.
pliki = dir
Jeśli interesujących nas plików z danymi jest więcej niż jeden, to mają one zazwyczaj podobną nazwę lub przynajmniej rozszerzenie. Możemy to podczas uruchamiania funkcji dir
wykorzystać.
pliki = dir('archiwum*.xls'); % uwzględnone zostaną pliki rozpoczynające się od archiwum i z zakończeniem .xls
Po wykonaniu polecenia w workspace zostanie utworzona macierz struktur pliki z informacją na temat każdego ze znalezionych plików (nazwa, ścieżka dostępu, rozmiar...). W pierwszej chwili może się to wydawać zagmatwane, trzeba to sobie powoli rozłożyć na czynniki pierwsze. Nowa zmienna w workspace, pliki to wektor. Każdy element tego wektora to struktura zawierająca szereg pól. Jeśli chcemy dowiedzieć się jak nazywa się trzeci znaleziony w katalogu plik, konstruujemy następujące polecenie:
pliki(3).name
ans =
'archiwum_tab_a_1986.xls'
Struktura danych
Przed podjęciem dalszych kroków należy się dobrze zastanowić nad kwestią tego, w jakiej strukturze będziemy chcieli umieścić dane. Niestety zwykła macierz nie zawsze jest opcją, która wchodzi w grę. Załóżmy, że interesuje nas wyłącznie kurs wymiany dolara amerykańskiego. Dane w plikach w różnych latach mogą wyglądać kompletnie odmiennie i nie chodzi tu bynajmniej o to, że zmieniają się same kursy wymiany. Zmienić się może położenie kolumny w pliku ale również, co może być najbardziej kłopotliwe, zmienić się może długość kolumny danych. Odpowiednie ułożenie danych może być więc nie lada wyzwaniem. W takim wypadku warto rozważyć wykorzystanie macierzy typu cell
, która została stworzona do przechowywania w niej danych różnego typu i o różnych, nieprzystających rozmiarach. Wymiary samej macierzy muszą zostać jednak określone.
dolary = cell(size(pliki));
Kolejny krok to stworzenie pętli, w której oprócz odczytu danych z plików przeprowadzone jest poszukiwanie pożądanej kolumny. Samo poszukiwanie dolarowej kolumny nie jest w tym momencie istotne. Ważny jest sposób zapisu kolumny do macierzy dolary. Przy zapisie do macierzy typu cell posługujemy się nawiasami klamrowymi!
for i = 1:length(pliki) [data,txt] = xlsread(pliki(i).name); % odczyt danych z i-tego pliku usa = strcmpi(txt, 'USA'); usd = strcmpi(txt, 'USD'); usd1 = strcmpi(txt, '1 USD'); US = usa | usd | usd1; % poszukiwanie identyfikatora wskazującego na dolarową kolumnę [w, k] = find(US); dolary{i} = data(:, k(1)); % zapis kolumny do macierzy dolary end
Wynikowy wektor dolary składa się z ponad 30 elementów, a każdy z tych elementów to wektor numeryczny. Ponieważ każdy z wektorów ma inną długość, nie ma możliwości by wszystkie te wartości połączyć w "normalnej" macierzy. No chyba, że chcemy utworzyć jeden wektor.
D = cell2mat(dolary(1:10)) plot(D); grid; xticklabels('');
Kolejny przydatny tutorial dzięki.
Dziękuje za post. Bardzo pomocny 🙂