Big Data
Inżynieria przetwarzania dużych zbiorów danych

Uwagi ogólne

  1. Do wszystkich zadań przygotuję odpowiednie zbiory testowe, ale potrzebuję na to trochę czasu.
  2. Zbiory testowe będą "duże".
  3. Państwa zadnie polega na stworzeniu rozwiązania, które daje odpowiedź w sensownym czasie. W praktyce oznacza to zwykle kilka(naście) minut.
  4. Każde zadanie, jeśli nie podano inaczej, jest za 1 punkt.
  5. Aby otrzymać ocenę 3.0 należy zdobyć 1 punkt, ocenę 4.0 - 2 punkty i 3 punkty na ocenę 5.0.
  6. Pula zadań będzie zmienna.
  7. Przed przystąpieniem do rozwiązywania zadania należy upewnić się u mnie, że dane zadanie jest dostępne.
  8. Zarezerwowanie tematu następuje mailowo.
  9. W przypadku gdy liczba osób chcących rozwiązać dane zadanie osiągnie zbyt dużą wartość, zadanie zostanie wycofane z listy zadań dostępnych.
  10. Oczywiście osoby, które uzyskały zgodę na rozwiązywanie zadania, rozwiązują je nadal po wycofaniu zadania z listy zadań dostępnych.
  11. O każdej zmianie w puli zadań będę starał się Państwa informować, ale nie zaszkodzi zaglądać tutaj co jakiś czas.
  12. Każda osoba w danej chwili może mieć przypisane tylko jedno zadanie.
  13. Z przypisanego zadania można zrezygnować i wybrać inne.
  14. Przypisanie kolejnego zadania jest możliwe albo po rezygnacji z poprzednio przypisanego zadania, albo po zaliczeniu poprzednio przypisanego zadania.
  15. Czas mają Państwo do końca sesji, ale proszę nie czekać do ostatniego dnia bo jak będę miał uwagi do tekstu, to nie zdążą już Państwo poprawić. Dlatego umawiamy się, że czas na nadesłanie projektów z ćwiczeń i tekstu na zaliczenie wykładu upływa na tydzień przed zakończeniem sesji. Pozostałe kilka dni sesji rezerwuję sobie na sprawdzenie, dopytanie itd. W tym czasie nie przyjmuję już żadnych nowych odpowiedzi czy rozwiązań, co może oznaczać brak zaliczenia przedmiotu jeśli ktoś w podany czasie się "nie wyrobi".
  16. Rozwiązania mogą być stworzone w oparciu o dowolną technologię/język itd, chyba, że w treści zadania powiedziane jest inaczej. Na przykład "Zadanie na wykorzystanie bazy dokumentowej" musi wykorzystywać bazę dokumentową. Mają jednak Państwo dowolność w jej wyborze oraz dowolność w wyborze języków programowania i innych bibliotek/frameworków.

Zbiory danych

Numer zadaniaZbioryInformacje dodatkowe
1, 5
  1. images_0001.zip (450 MiB)
  2. images_0002.zip (9,6 MiB)
  3. images_0003.zip (356 MiB)
Zbiory przygotowano w oparciu o poniższe zbiory danych
  1. Flowers Recognition This dataset contains labeled 4242 images of flowers. The pictures are divided into five classes: chamomile, tulip, rose, sunflower, dandelion. For each class there are about 800 photos. Photos are not high resolution, about 320x240 pixels. Photos are not reduced to a single size, they have different proportions.
  2. Flower Color Images. Set for Classification The content is very simple: 210 images (128x128x3) with 10 species of flowering plants and the file with labels flower-labels.csv. Photo files are in the .png format and the labels are the integers.
    Label => Name: 0 => phlox; 1 => rose; 2 => calendula; 3 => iris; 4 => leucanthemum maximum; 5 => bellflower; 6 => viola; 7 => rudbeckia laciniata (Goldquelle); 8 => peony; 9 => aquilegia.
  3. Intel Image Classification Image Scene Classification of Multiclass. This Data contains around 25k images of size 150x150 distributed under 6 categories. {'buildings' -> 0, 'forest' -> 1, 'glacier' -> 2, 'mountain' -> 3, 'sea' -> 4, 'street' -> 5 }
  • 1: w oparciu o 1
  • 2: w oparciu o 2
  • 3: w oparciu o 3, użyto katalog seg_train + seg_test + seg_pred
2
3
  • NBP Web API -- API pozwalające na pobieranie ze strony NBP kursów walut oraz cen złota w formacie XML oraz JSON.
4
  • tiny.tgz - malutki zbiór: trzy obiekty, w pierwszym trzy pokoje, w drugim dwa a w trzecim jeden.
  • small.tgz - większy zbiór danych; nie za duży, ale ręcznie będzie już trudno sprawdzić.
  • big.tgz - duży zbiór, do przeprowadzenia końcowch testów.
6
  • tiny.tgz - malutki zbiór: jeden obiekt, jedna trasa (trasa narysowana).
  • small.tgz - większy zbiór danych: dwa obiekty, po dwie trasy każdy (trasy narysowane).
  • big.tgz - duży zbiór (plik o wielkości 160MiB, po rozpakowaniu ponad 700MiB): 100 obiektów, każdy po 100 tras o długości z przedziału [10, 1000] punktów.
Wszystkie trasy w obszarze 1000 x 1000, z limitem czasu 1000.

Zadanie 1: Zadanie na kombinowanie 1

  1. Dany jest zbiór plików PNG.
  2. Dla każdego pliku PNG można wyliczyć średnią składowych RGB.
  3. Napisać skrypt/program/aplikację webową, która po podaniu trzech wartości liczbowych R, G, B wyszuka N (wartość podawana przez użytkownika) obrazów o średnich wartościach RGB najbardziej zbliżonych do podanych trzech wartości R, G, B.

Zadanie 2: Zadanie na kombinowanie 2

Zadanie 3: Zadanie na wykorzystanie Django, tworzenie zapytań, posługiwanie się formatem XML oraz JSON

  1. Na stronie NBP Web API dostępne jest API pozwalające na pobieranie kursów walut oraz cen złota w formacie XML oraz JSON.
  2. Napisać stronę, która po podaniu zakresu dat oraz wybraniu rodzaju waluty wypisze najdłuższy przedział czasu (w ramach podanego zakresu) w którym wybrana waluta osiągała wartości niemalejące.
  3. Użycie Django nie jest wymagane -- można użyć innego frameworku (użycie frameworku jest wymagane).

Zadanie 4: Zadanie na wykorzystanie bazy dokumentowej

  1. W bazie przechowujemy informacje o bazie noclegowej.
  2. W bazie są dwa rodzaje dokumentów:
    • po jednym dokumencie opisującym każdy obiekt;
    • wiele dokumentów opisujących ofertę wybranego obiektu.
  3. Dokument opisujący obiekt jest następującej postaci
    {
    	"name": String, // np. "Rogate Ranczo"
    	"id": UUID, // np. 123e4567-e89b-12d3-a456-426614174000
    }
    
  4. Dokument opisujący ofertę jest następującej postaci
    {
    	"name": String, // np. "Apartament na poddaszu"
    	"id": UUID,
    	"idObject": UUID, // np. 123e4567-e89b-12d3-a456-426614174000
    	"readyFrom": Date,
    	"readyTo": Date,
    	"reservations": [{"from": Date, "to": Date},
    	                 {"from": Date, "to": Date},
    	                 {"from": Date, "to": Date},
    	                 {"from": Date, "to": Date}]
    }
    
    Pola readyFrom oraz readyTo oznaczają początek i koniec okresu w którym można dokonywać rezerwacji. Jeśli oba pola mają wartość null oznacza to, że oferta jest aktualna cały rok.
    Wartości String, UUID oraz Date oznaczają rodzaj danych a nie sposób ich kodowania; np. readyFrom może być zapisana jako napis a nie obiekt typu Data.
  5. Dane powinny być wczytywane z pliku XML, który będzie miał strukturę analogiczną do zaprezentowanych powyżej dokumentów: przykładowy plik z danymi obiektów, przykładowy plik z opisem oferty.
  6. Zadanie polega na napisaniu skryptu, który na podstawie trzech danych: daty od, daty do oraz ilości dni wypisze wszystkie oferty (wraz z informacją o obiekcie) w których jest możliwe zarezerwowanie noclegu na wskazaną ilość dni przy czym wszystkie te dni mieszczą się pomiędzy datą od a datą do (włącznie).
    Na przykład, jeśli jakaś oferta ma readyFrom="2020-06-01" oraz readyTo="2020-06-10", wówczas po podaniu informacji: dataOd="2020-06-03" dataDo="2020-06-09" iloscDni="5" zwrócona powinna zostać lista
    idObject id 2020-06-03 2020-06-07
    idObject id 2020-06-04 2020-06-08
    idObject id 2020-06-05 2020-06-09
    

Zadanie 5: Zadanie na kombinowanie 3

Zadanie podobne do zadania 1, ale raczej wymaga innego podejści. Sugerowane rozwiązanie oparte o wielowątkowość.
  1. Dany jest zbiór plików PNG.
  2. Użytkownik określa rozmiar kafelka (np. 32 x 64 pixele (wysokość x szerokość)).
  3. Wyszukujemy wszystkie pliki PNG, z których można takie kafelki wyciąć, np. z pliku o rozmiarze 33 x 66 możemy wyciąć 6 takich kafelków.
  4. Dla każdego kafelka można wyliczyć średnią składowych RGB.
  5. Napisać skrypt/program/aplikację webową, która po podaniu trzech wartości liczbowych R, G, B oraz rozmiaru kafelka wyszuka N (wartość podawana przez użytkownika) kafelków o średnich wartościach RGB najbardziej zbliżonych do podanych trzech wartości R, G, B.

Zadanie 6: Zadanie na kombinowanie 4

Opis danych:

  1. Dane przedstawiają zapis pewnych ścieżek.
  2. Ścieżka jest zbiorem punktów połączonych odcinkami.
  3. Kolejne punkty w zbiorze, to kolejne punkty ścieżki.
  4. Ścieżki zostały wygenerowane w pewnej przestrzeni dwuwymiarowej.
  5. Długość każdej ścieżki może być inna.
  6. Każda ścieżka przypisana jest do pewnego obiektu (tego, który ja wygenerował).
  7. Każda ścieżka należąca do danego obiektu ma unikalny numer (w ramach obiektu). Tak więc ten sam obiekt nie może mieć dwóch różnych ścieżek o takim samym numerze. Dwa różne obiekty mogą mieć ścieżki o takich samych numerach.
  8. Obiekt znajdował się w punktach tworzących ściezkę w ściśle określonym czasie. Pomiędzy punktami czas zmienia się liniowo.
  9. Czas podany jest jako liczba rzeczywista i jest mierzony od pewnej umownej chwili zerowej.
  10. Przykładowe dane (plik paths.json, rysunek trasy):
    [
        {
            "idObject": 1,
            "idPath": 1,
            "points": [
                {
                    "x": 982.6654464446095,
                    "y": 919.1330053187946,
                    "time": 245.99081171100303
                },
                {
                    "x": 980.9310550639002,
                    "y": 919.2577873177349,
                    "time": 246.2019260643421
                },
                {
                    "x": 975.3658920290333,
                    "y": 924.2911863917317,
                    "time": 246.59851737294557
                },
                
                ...
                
                {
                    "x": 970.4810972349895,
                    "y": 917.1482447048913,
                    "time": 252.42230628974303
                }
            ]
        }
    ]
    
    1. Identyfikator obiektu: 1.
    2. Indentyfikator ścieżki obiektu 1: 1.
    3. Pierwszy punkt ścieżki ma współrzędne (x=982.6654464446095, y=919.1330053187946) i obiekt znajdował się w tym punkcie w chwili 245.99081171100303.
    4. Drugi punkt ścieżki ma współrzędne (x=980.9310550639002, y=919.2577873177349) i obiekt znajdował się w tym punkcie w chwili 246.2019260643421.
    5. Przejście od punktu pierwszego do drugiego zajęło obiektowi 246.2019260643421 - 245.99081171100303 = 0,211114353 jednostek czasu. Zatem dokładnie po 0,105557177 jednostkach znajdował się w połowie drogi pomiędzy punktem pierwszym i drugim.

Opis zadania:

  1. Jako użytkownik, chcę mieć możliwość określenia obszaru i czasu (rozpoczęcie i zakończenie).
  2. Jako użytkownik, chcę otrzymać informację który obiekt, którą ścieżką, w którym momencie wszedł i wyszedł z określonego przeze mnie obszaru (oczywiście z uwzględnieniem ograniczenia czasowego określonego przez rozpoczęcie i zakończenie).
  3. Informacja powinna być w postaci:
    identyfikatorObiektu identyfikatorSciezki momentWejscia_1 momentWyjscia_1 [momentWejscia_N momentWyjścia_N]
    
  4. Ponieważ w określonym przedziale czasu obiekt mógł wielokrotnie wchodzic i wychodzić z zadanego obszaru, dlatego w danym wierszu może być wiele par postaci (momentWejscia, momentWyjscia).