Samouczek dotyczący DSPL

DSPL to skrót od Dataset Publishing Language, Zbiory danych opisane w DSPL można importować do narzędzia Google Public Data Explorer, które umożliwia szczegółową eksplorację wizualną danych.

Uwaga: aby przesyłać dane do Google Public Data za pomocą narzędzia do przesyłania danych publicznych, musisz mieć konto Google.

W tym samouczku znajdziesz szczegółowy przykład przygotowywania podstawowego zbioru danych DSPL.

Zbiór danych DSPL to pakiet zawierający plik XML i zestaw plików CSV. Pliki CSV to proste tabele zawierające dane zbioru danych. Plik XML opisuje metadane zbioru danych, w tym metadane informacyjne (np. opisy wskaźników), a także metadane strukturalne, takie jak odwołania między tabelami. Metadane umożliwiają użytkownikom niezaawansowanym użytkownikom przeglądanie i wizualizację danych.

Jedynym wymaganiem, które trzeba spełnić, aby zrozumieć ten samouczek, jest dobra znajomość języka XML. Pewna znajomość prostych pojęć związanych z bazami danych (np. (tabele, klucze podstawowe) może pomóc, ale nie jest to wymagane. W celach informacyjnych możesz też zapoznać się z pełnym plikiem XML i pełnym pakietem zbiorów danych, które są powiązane z tym samouczkiem.

Przegląd

Zanim zaczniesz tworzyć zbiór danych, zapoznaj się z ogólnym omówieniem tego, co zawiera zbiór danych DSPL:

  • Informacje ogólne: informacje o zbiorze danych.
  • Pojęcia: definicje „rzeczy”, które występują w zbiorze danych (np. kraje, stopa bezrobocia, płeć itp.)
  • Wycinki: kombinacje pojęć, dla których istnieją dane
  • Tabele: dane dla pojęć i wycinków. Tabele pojęć zawierają wyliczenia, a tabele wycinków zawierają dane statystyczne
  • Tematy: służą do porządkowania koncepcji zbioru danych w sensowną hierarchii za pomocą etykiet.

Aby zilustrować te dość abstrakcyjne pojęcia, zobacz zbiór danych (z fikcyjnymi danymi) używany w tym samouczku: statystyczne ciągi czasowe dotyczące populacji i bezrobocia zebrane według różnych kombinacji kraju, stanu USA i płci.

Ten przykładowy zbiór danych definiuje te koncepcje:

  • country
  • płeć
  • populacja
  • state
  • stopa bezrobocia
  • rok

Pojęcia kategorialne, np. stan, są powiązane z pojęciami tabel, które wyliczają wszystkie ich możliwe wartości (Kalifornia, Arizona itp.). Pojęcia mogą mieć dodatkowe kolumny właściwości, takich jak nazwa lub kraj województwa.

Wycinki określają każdą kombinację pojęć, dla których w zbiorze danych znajdują się dane statystyczne. Wycinek zawiera wymiary i dane. Na powyższej ilustracji wymiary są niebieskie, a dane pomarańczowe. W tym przykładzie wycinek gender_country_slice zawiera dane population oraz wymiary country, year i gender. Inny wycinek o nazwie country_slice podaje łączne roczne liczby ludności (dane) dla krajów.

Oprócz wymiarów i danych wycinki odwołują się też do tabel, które zawierają rzeczywiste dane.

Przeprowadzimy Cię teraz krok po kroku przez proces tworzenia takiego zbioru danych w DSPL.

Informacje o zbiorze danych

Najpierw musimy utworzyć plik XML dla naszego zbioru danych. Oto początek opisu DSPL dla naszego przykładowego zbioru danych:

<?xml version="1.0" encoding="UTF-8"?>
<dspl targetNamespace="http://www.stats-bureau.com/mystats"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://schemas.google.com/dspl/2010"
   xmlns:time="http://www.google.com/publicdata/dataset/google/time"
   xmlns:geo="http://www.google.com/publicdata/dataset/google/geo"
   xmlns:entity="http://www.google.com/publicdata/dataset/google/entity"
   xmlns:quantity="http://www.google.com/publicdata/dataset/google/quantity">

  <import namespace="http://www.google.com/publicdata/dataset/google/time"/>
  <import namespace="http://www.google.com/publicdata/dataset/google/entity"/>
  <import namespace="http://www.google.com/publicdata/dataset/google/geo"/>
  <import namespace="http://www.google.com/publicdata/dataset/google/quantity"/>

  <info>
    <name>
      <value>My statistics</value>
    </name>
    <description>
      <value>Some very interesting statistics about countries</value>
    </description>
    <url>
      <value>http://www.stats-bureau.com/mystats/info.html</value>
    </url>
    </info>

  <provider>
    <name>
      <value>Bureau of Statistics</value>
    </name>
    <url>
      <value>http://www.stats-bureau.com</value>
    </url>
  </provider>
 ...
</dspl>

Opis zbioru danych zaczyna się od elementu <dspl> najwyższego poziomu. Atrybut targetNamespace zawiera identyfikator URI, który jednoznacznie identyfikuje ten zbiór danych. Przestrzeń nazw zbioru danych jest szczególnie ważna podczas publikowania zbioru danych, ponieważ jest to globalny identyfikator zbioru danych i sposób, w jaki inni mogą się do niego odwoływać.

Pamiętaj, że atrybut targetNamespace może zostać pominięty. W takim przypadku po zaimportowaniu zbioru danych automatycznie generowana jest unikalna przestrzeń nazw.

Korzystanie z informacji z innych zbiorów danych

Zbiory danych zaimportują je, aby ponownie używać definicji i danych z innych zbiorów danych. Każdy element <import> określa przestrzeń nazw innego zbioru danych, do którego będzie się odwoływać ten zbiór danych.

W naszym przykładowym zbiorze danych potrzebujemy definicji ze zbiorów danych http://www.google.com/publicdata/dataset/google/quantity (utworzonego przez Google zbioru danych, który zawiera koncepcje przydatne do definiowania wielkości liczbowych), oraz ze zbiorów danych czas, jednostka i geo, które zawierają definicje czasu, jednostek i danych geograficznych.

Górny element <dspl> zawiera deklarację prefiksu przestrzeni nazw (np. xmlns:time="http://...") dla każdego zaimportowanego zbioru danych. Deklaracje prefiksów są potrzebne, aby odwoływać się do elementów z innych zbiorów danych w zwięzły sposób. Na przykład time:year odwołuje się do definicji tabeli year w zaimportowanym zbiorze danych, którego przestrzeń nazw jest powiązana z prefiksem time.

Informacje o zbiorze danych i dostawcy

Element <info> zawiera ogólne informacje o zbiorze danych: nazwę, opis i adres URL, pod którym można znaleźć więcej informacji.

Element <provider> zawiera informacje o dostawcy zbioru danych: jego nazwę i adres URL, pod którym można znaleźć więcej informacji (zwykle jest to strona główna dostawcy danych).

Definiowanie pojęć

Mamy już ogólne informacje o zbiorze danych, więc możemy zacząć definiować jego zawartość. Naszym następnym celem jest dodanie statystyk dotyczących populacji krajów z ostatnich 50 lat.

Najpierw musimy podać definicje pojęć dotyczących populacji, kraju i roku. W DSPL definicje te są nazywane pojęciami.

Pojęcie to definicja typu danych pojawiających się w zbiorze danych. Wartości danych odpowiadające zagadnieniu są nazywane jego wystąpieniami.

Populacja

Zacznijmy od zdefiniowania koncepcji populacji. W dokumencie DSPL pojęcia są zdefiniowane w elemencie <concepts>, który znajduje się zaraz za informacjami o zbiorze danych i dostawcy.

Oto pojęcie populacji z minimalną ilością informacji wymaganych w przypadku każdego rodzaju: id (unikalny identyfikator), name i type.

<dspl ...>
  ...
  <concepts>
    <concept id="population">
      <info>
        <name>
          <value>Population</value>
        </name>
      </info>
      <type ref="integer"/>
    </concept>
  ...
  </concepts>

Oto jak działa ten przykładowy kod:

  • Każdy pomysł musi zawierać atrybut id, który jednoznacznie identyfikuje daną koncepcję w zbiorze danych. Oznacza to, że żadne 2 pojęcia zdefiniowane w tym samym zbiorze danych nie mogą mieć tego samego identyfikatora.
  • Tak jak w przypadku zbioru danych i jego dostawcy, elementy <info> zawierają informacje tekstowe o zawartości, takie jak nazwa i opis.
  • Element <type> określa typ danych dla wystąpień elementu (czyli jego „wartości”). W tym przykładzie typ population to integer. DSPL obsługuje te typy danych:
    • string
    • integer
    • float
    • boolean
    • date

Kraj

Wpiszmy teraz definicję pojęcia kraju:

<concept id="country">
  <info>
    <name><value>Country</value></name>
    <description>
      <value>My list of countries.</value>
    </description>
  </info>
  <type ref="string"/>
  <property id="name">
    <info>
      <name><value>Name</value></name>
      <description>
        <value>The official name of the country</value>
      </description>
    </info>
    <type ref="string" />
  </property>
  <table ref="countries_table" />
</concept>

Definicja koncepcji kraju zaczyna się tak jak poprzednia i zawiera atrybuty id, info i type.

Wartości koncepcyjne

Pojęcia kategorialne, takie jak kraje, zawierają wyliczoną wszystkie możliwe wystąpienia. Krótko mówiąc, możesz wymienić wszystkie możliwe kraje, w których można się odwoływać. Aby było to możliwe, każdy kraj musi mieć unikalny identyfikator. W tym przykładzie do identyfikacji krajów wykorzystano kody ISO krajów; są to kody typu string.

W tym przykładzie nie musisz używać kodu ISO – równie dobrze możesz użyć nazwy kraju. Nazwy różnią się w zależności od języka i mogą zmieniać się z czasem oraz nie zawsze są używane spójnie w różnych zbiorach danych. W przypadku krajów lub ogólnie pojęć kategorialnych dobrze jest wybierać krótkie, stabilne, powszechnie używane i niezależne od języka identyfikatory (o ile występują).

Właściwości koncepcji

Oprócz właściwości id właściwość country zawiera element <property>, który określa nazwę kraju. Inaczej mówiąc, nazwa kraju („Irlandia”) oznacza własność kraju powiązanego z id IE. Właściwości określają, w jaki sposób DSPL udostępnia dodatkowe uporządkowane informacje o instancjach koncepcji.

Tak jak sama koncepcja, właściwości mają id, info i type.

Dane koncepcji

Pojęcie „country” również zawiera element <table>. Ten element odwołuje się do tabeli, która zawiera listę wszystkich krajów.

Korzystanie z tabel ma sens w przypadku niektórych pojęć, ale nie w przypadku innych. Na przykład nie ma sensu wyliczanie wszystkich możliwych wartości dla populacji koncepcji. Jeśli jednak odwołujesz się do tabeli związanej z koncepcją, musi ona zawierać wszystkie jej wystąpienia – na przykład musi zawierać wszystkie kraje, a nie tylko kilka przykładów.

Zbiór danych definiuje tabelę countries_table w ten sposób:

...
<tables>
  <table id="countries_table">
    <column id="country" type="string"/>
    <column id="name" type="string"/>
    <data>
      <file format="csv" encoding="utf-8">countries.csv</file>
    </data>
  </table>
  ...
</tables>

Tabela krajów określa kolumny tabeli i ich typy oraz odwołuje się do pliku CSV zawierającego dane. Ten plik CSV można połączyć w pakiet i przesłać razem ze zbiorem danych w formacie XML albo uzyskać do niego dostęp zdalny przez HTTP, HTTPS lub FTP. W tych ostatnich przypadkach zastąp countries.csv adresem URL, na przykład http://www.myserver.com/mydata/countries.csv.

Bez względu na to, gdzie jest przechowywany, plik CSV wygląda tak:

country, name
AD,      Andorra
AF,      Afghanistan
AI,      Anguilla
AL,      Albania
US,      United States

Pierwszy wiersz tabeli zawiera identyfikatory kolumn zgodnie z definicją w definicji DSPL table. Każdy z poniższych wierszy odpowiada 1 wystąpieniu koncepcji kraju. Jeśli pojęcie ma tabelę, musi ona zawierać wszystkie wystąpienia danego elementu – w tym przypadku musi zawierać listę wszystkich krajów.

Kolumny są zmapowane do pojęcia kraju i jego właściwości na podstawie identyfikatora. Identyfikator pierwszej kolumny, country, odpowiada identyfikatorowi elementu. Oznacza to, że ta kolumna zawiera unikalny identyfikator kraju zdefiniowany w koncepcji kraju. Kolejna kolumna odpowiada właściwości name odpowiadającej koncepcji kraju. Wartości w tej kolumnie odpowiadają wartościom właściwości name.

Jest kilka wymagań dotyczących danych CSV związanych z tabelą pojęć:

  • Nagłówki kolumn w pierwszym wierszu pliku danych muszą dokładnie odpowiadać elementowi id i właściwości id elementu, z którym powiązane są dane (chociaż ich kolejność może być różna).
  • Każdy wiersz musi zawierać dokładnie taką samą liczbę elementów co liczba właściwości w koncepcji (nawet jeśli wartość jest pusta).
  • Każda wartość w polu id pojęcia (w tym przypadku kodu kraju) musi być niepowtarzalna i niepusta (puste pole to jedno z pustym polem, w którym znajduje się tylko 0 znaków lub tylko odstępy).
  • Wartości właściwości, które odwołują się do innych koncepcji, muszą być puste lub być prawidłową wartością wskazanej koncepcji.
  • Wartości zawierające przecinki, podwójne cudzysłowy lub znaki nowego wiersza muszą być całkowicie ujęte w cudzysłów podwójny.
  • Każdy znak cudzysłowu w cudzysłowie prostym w wartości musi być bezpośrednio poprzedzony innym cudzysłowem podwójnym.

Rok

Ostatnią koncepcją, jakiej potrzebujemy w przypadku danych o populacji kraju, jest reprezentacja lat. Zamiast definiować nową koncepcję użyjemy koncepcji roku z jednego z zaimportowanych przez nas zbiorów danych: „http://www.google.com/publicdata/dataset/google/time”. W tym celu musisz użyć odwołania do tego zbioru danych jako time:year, gdzie time oznacza zbiór danych, do którego się odwołuje, a year określa koncepcję.

Pojęcia kanoniczne

time:year to część małego zestawu koncepcji kanonicznych zdefiniowanych przez Google. Pojęcia kanoniczne zawierają podstawowe definicje czasu, geografii, wielkości liczbowych, jednostek itp.

W rzeczywistości zdefiniowana powyżej koncepcja kraju istnieje jako koncepcja kanoniczna. Stworzyliśmy je wyłącznie w celach ilustracyjnych. W miarę możliwości używaj w zbiorach danych koncepcji kanonicznych – bezpośrednio lub przez rozszerzenie (więcej o rozszerzeniach dowiesz się poniżej). Koncepcje kanoniczne pozwalają na porównywalność danych z innymi zbiorami danych i pozwalają korzystać z funkcji zbiorów danych w Eksploratorze danych publicznych. Na przykład do animowania danych w czasie lub wyświetlania danych geograficznych na mapie używane są odpowiednio koncepcje kanoniczne time i geo.

Pierwszy wycinek

Skoro mamy już pomysły na dane o populacji, kraju i roku, pora je zebrać.

W tym celu musimy utworzyć wycinek, który będzie je łączyć. W DSPL wycinek to połączenie koncepcji, dla których istnieją dane.

Dlaczego nie wystarczy utworzyć tabeli z odpowiednimi kolumnami? Ponieważ wycinki rejestrują informacje o zbiorze danych w kontekście jego koncepcji. Stanie się to w miarę tworzenia kolejnych fragmentów naszego zbioru danych.

Wycinki pojawiają się w pliku DSPL w elemencie <slices>, który musi pojawić się tuż za sekcją concepts.

<slices>
  <slice id="countries_slice">
    <dimension concept="country"/>
    <dimension concept="time:year"/>
    <metric concept="population"/>
    <table ref="countries_slice_table"/>
  </slice>
</slices>

Podobnie jak w przypadku koncepcji, każdy wycinek ma identyfikator id (countries_slice), który jednoznacznie identyfikuje wycinek w zbiorze danych.

Wycinek zawiera 2 rodzaje odwołań do pojęć: Wymiary i dane. Wartości danych różnią się w zależności od wartości wymiarów. W tym przypadku wartość population (dane) różni się w zależności od wymiarów country i year.

Tak jak w przypadku koncepcji, wycinki zawierają odwołanie do tabeli zawierającej dane wycinka. Przywołana tabela musi mieć po 1 kolumnie na każdy wymiar i dane wycinka. Podobnie jak w przypadku koncepcji, wymiary i dane wycinka są mapowane na kolumny tabeli o tych samych identyfikatorach.

Tabela wycinków

Tabela dla naszego wycinka populacji pojawi się w sekcji tables pliku DSPL:

<tables>
  ...
  <table id="countries_slice_table">
    <column id="country" type="string"/>
    <column id="year" type="date" format="yyyy"/>
    <column id="population" type="integer"/>
    <data>
      <file format="csv" encoding="utf-8">country_slice.csv</file>
    </data>
  </table>
  ...
</tables>

Pamiętaj, że kolumna year zawiera atrybut format, który określa format lat. Obsługiwane formaty daty to formaty zdefiniowane w formacie Joda DateTime.

Tabela countries_slice określa kolumny tabeli i ich typy oraz wskazuje plik CSV zawierający dane. Plik CSV wygląda tak:

country, year,  population
AF,      1960,  9616353
AF,      1961,  9799379
AF,      1962,  9989846
AF,      1963,  10188299
...

Każdy wiersz tabeli danych zawiera unikalną kombinację wymiarów country i year wraz z odpowiadającą im wartością danych population (np. wymiary dotyczące populacji Afganistanu w latach 1960 i dane).

Pamiętaj, że wartości w kolumnie country pasują do wartości/identyfikatora elementu country, który jest dwuliterowym kodem kraju zgodnym z normą ISO 3166.

Dane CSV dotyczące wycinka muszą spełniać te ograniczenia:

  • Żadna wartość w polu wymiaru (np. country i year) nie może być pusta. Wartości pól wskaźników (np. population) mogą być puste. Pusta wartość jest reprezentowana przez brak znaków.
  • Każda wartość pola wymiaru, która odwołuje się do określonej pojęcia, musi znajdować się w jego danych. Na przykład wartość AF musi występować w tabeli danych o pojęciach country.
  • Każda unikalna kombinacja wartości wymiaru, np. AF, 2000, może wystąpić tylko raz.
  • Dane należy posortować według kolumn wymiarów innych niż czasowe (w dowolnej kolejności), a potem, opcjonalnie, według dowolnej z innych kolumn. Na przykład w tabeli z kolumnami [date, dimension1, dimension2, metric1, metric2] możesz sortować według dimension1, potem dimension2 i date, ale nie według wymiaru date i wymiarów.

Podsumowanie

Na tę chwilę mamy wystarczającą ilość danych w DSPL, aby opisać dane o populacji kraju. Podsumowując, musieliśmy:

  • Utwórz nagłówek DSPL oraz opis zbioru danych i jego dostawcy
  • Utwórz jedną koncepcję dotyczącą populacji, a drugą dla kraju, zawierającą plik CSV z wyszczególnieniem wszystkich krajów i ich nazwami.
  • Utwórz wycinek z liczbami populacji krajów w danym okresie odwołującym się do zdefiniowanej już koncepcji roku w zaimportowanym zbiorze danych czasowych od Google.

W dalszej części tego samouczka powiększymy nasz zbiór danych, dodając więcej wymiarów w większej liczbie wycinków, a także więcej wskaźników pogrupowanych według tematu.

Dodawanie wymiaru: Stany Zjednoczone

Wzbogacimy teraz nasz zbiór danych, dodając dane o populacji stanów w USA. Najpierw musimy zdefiniować pojęcie dla stanów. Wygląda to bardzo podobnie do naszej koncepcji kraju, którą zdefiniowaliśmy wcześniej.

<concept id="state" extends="geo:location">
  <info>
    <name>
      <value>state</value>
    </name>
    <description>
      <value>US states, identified by their two-letter code.</value>
    </description>
  </info>
  <property concept="country" isParent="true" />
  <table ref="states_table"/>
</concept>

Rozszerzenia pojęć i odwołania do właściwości

Koncepcja stanu wprowadza kilka nowych funkcji DSPL.

Po pierwsze stan extends kolejną koncepcję, geo:location (zdefiniowaną w zewnętrznym zbiorze danych geograficznych, który zaimportowaliśmy na początku tego zbioru). Z semantycznego punktu widzenia oznacza to, że state jest rodzajem geo:location. W rezultacie dziedziczy wszystkie atrybuty i właściwości elementu geo:location. W szczególności określamy właściwości tych elementów: latitude i longitude. Rozszerzając poprzednią koncepcję, te właściwości odnoszą się również do stanu. Poza tym lokalizacja dziedziczy z obiektu entity:entity, więc stan otrzymuje też wszystkie właściwości tej drugiej, w tym name, description i info_url.

Uwaga: zdefiniowana wcześniej pojęcie kraju powinno być również rozszerzone od geo:location. Wcześniej dla uproszczenia pominęliśmy ten punkt. Jednak w końcowym pliku XML podaliśmy lokalizację do dziedziczenia w kraju.

Uwaga: we własnych zbiorach danych możesz używać konstrukcji extends, aby ponownie wykorzystywać informacje zdefiniowane przez inne zbiory. Użycie właściwości extends wymaga, aby wszystkie instancje koncepcji były prawidłowymi instancjami rozszerzanego koncepcji. Rozszerzenia umożliwiają dodawanie dodatkowych właściwości i atrybutów oraz ograniczenie zbioru instancji do podzbioru instancji rozszerzonej koncepcji.

Oprócz dziedziczenia właściwość stan wprowadza także koncepcję references. W szczególności pojęcie stanu ma właściwość o nazwie country, która odwołuje się do opracowanej przez nas powyżej koncepcji kraju. Służy do tego atrybut concept. Pamiętaj, że ta właściwość nie zawiera identyfikatora, a jedynie odwołanie do pojęcia. Jest to odpowiednik utworzenia identyfikatora z tą samą wartością co identyfikator wskazanego pojęcia (np. country). Relacja hierarchiczna między stanem a hrabstwem jest rejestrowana przez atrybut isParent="true" w pliku referencyjnym. Ogólnie wymiary powiązane hierarchicznie, np. obszary geograficzne, powinny być przedstawiane w ten sposób, przy czym pojęcie podrzędne ma właściwość, która odwołuje się do koncepcji nadrzędnej za pomocą atrybutu isParent.

Definicja tabeli dla stanów wygląda tak:

<tables>
  ...
  <table id="states_table">
    <column id="state" type="string"/>
    <column id="name" type="string"/>
    <column id="country" type="string">
      <value>US</value>
    </column>
    <column id="latitude" type="float"/>
    <column id="longitude" type="float"/>
    <data>
      <file format="csv" encoding="utf-8">states.csv</file>
    </data>
  </table>
  ...
</tables>

Kolumna „Kraj” zawiera stałą wartość dla wszystkich województw. Określenie jej w DSPL pozwala uniknąć powtarzania tej wartości w przypadku każdego stanu w danych. Pamiętaj też, że uwzględniliśmy kolumny name, latitude i longitude, ponieważ stan odziedziczył te właściwości z: geo:location. Z drugiej strony niektóre dziedziczone właściwości (np. description) nie ma kolumn. Jest to dozwolone – jeśli właściwość zostanie pominięta w tabeli definicji pojęć, przyjmuje się, że jej wartość jest niezdefiniowana dla każdego wystąpienia koncepcji.

Plik CSV wygląda tak:

state, name,        latitude,  longitude
AL,    Alabama,     32.318231, -86.902298
AK,    Alaska,      63.588753, -154.493062
AR,    Arkansas,    35.20105,  -91.831833
AZ,    Arizona,     34.048928, -111.093731
CA,    California,  36.778261, -119.417932
CO,    Colorado,    39.550051, -105.782067
CT,    Connecticut, 41.603221, -73.087749
...

Mamy już koncepcje dotyczące populacji i roku, więc możemy je wykorzystać do utworzenia nowego wycinka populacji stanów.

<slices>
  <slice id="states_slice">
    <dimension concept="state"/>
    <dimension concept="time:year"/>
    <metric concept="population"/>
    <table ref="states_slice_table"/>
  </slice>
</slices>

Definicja tabeli danych wygląda tak:

<tables>
  ...
  <table id="states_slice_table">
    <column id="state" type="string"/>
    <column id="year" type="date" format="yyyy"/>
    <column id="population" type="integer"/>
    <file format="csv" encoding="utf-8">state_slice.csv</file>
  </table>
  ...
</tables>

A plik CSV wygląda tak:

state, year, population
AL,    1960, 9616353
AL,    1961, 9799379
AL,    1962, 9989846
AL,    1963, 10188299

Dlaczego utworzyliśmy nowy wycinek zamiast dodawać kolejny wymiar do poprzedniego?

Wycinek z wymiarami zarówno dla stanu, jak i kraju byłby nieprawidłowy, ponieważ niektóre wiersze zawierałyby dane kraju, a inne dane stanu. W tabeli pojawią się „dziury” w przypadku niektórych wymiarów, co jest niedozwolone (pamiętaj, że brakujące wartości są dozwolone tylko w przypadku danych, a nie wymiarów).

Wymiary pełnią funkcję „klucza podstawowego” dla wycinka. Oznacza to, że każdy wiersz danych musi zawierać wartości dla wszystkich wymiarów, a dwa wiersze danych nie mogą mieć dokładnie takich samych wartości dla wszystkich wymiarów.

Dodawanie wskaźnika: stopa bezrobocia

Dodajmy teraz kolejne dane do naszego zbioru danych:

<concept id="unemployment_rate" extends="quantity:rate">
  <info>
    <name>
      <value>Unemployment rate</value>
    </name>
    <description>
      <value>The percent of the labor force that is unemployed.</value>
    </description>
    <url>
      <value>http://www.bls.gov/cps/cps_htgm.htm</value>
    </url>
  </info>
  <type ref="float/>
  <attribute id="is_percentage">
    <type ref="boolean"/>
    <value>true</value>
  </attribute>
</concept>

Sekcja info tego wskaźnika zawiera nazwę, opis i adres URL (prowadzący do amerykańskiego biura statystyk pracy).

Ta koncepcja rozszerza także koncepcję kanoniczną quantity:rate. Zbiór danych ilości definiuje podstawowe pojęcia związane z przedstawianiem wielkości liczbowych. W zbiorze danych utwórz pojęcia liczbowe, rozszerzając odpowiednie pojęcie ilości. Z tego względu zdefiniowana powyżej koncepcja population powinna być przedłużona z quantity:amount.

Atrybuty koncepcji

Ta koncepcja zawiera też wprowadzenie do konstrukcji atrybutu. W tym przykładzie atrybut wskazuje, że unemployment_rate jest wartością procentową. Atrybut is_percentage jest dziedziczony z koncepcji quantity:rate, do której należy ta koncepcja. Te informacje są używane przez Public Data Explorer do pokazywania znaków procentu podczas wizualizacji danych.

Atrybuty zapewniają ogólny mechanizm dołączania par klucz-wartość do koncepcji (w przeciwieństwie do właściwości, które wiążą dodatkowe wartości z instancjami koncepcji). Tak jak koncepcje i właściwości, atrybuty mają atrybuty id, info i type. Podobnie jak właściwości, mogą się odwoływać do innych koncepcji.

Atrybuty nie służą tylko do zdefiniowanych ogólnych rzeczy, takich jak właściwości numeryczne. Możesz definiować własne atrybuty koncepcji.

Dodawanie danych o stopie bezrobocia w USA

Jesteśmy teraz gotowi dodać dane o stopie bezrobocia w stanach USA. Stopa bezrobocia to wartość, która ma już dane o populacji stanów dla poszczególnych stanów, więc możemy je po prostu dodać do wycinka, który już utworzyliśmy dla wymiarów stanu i roku:

<slices>
  ...
  <slice id="states_slice">
    <dimension concept="state"/>
    <dimension concept="time:year"/>
    <metric concept="population"/>
    <metric concept="unemployment_rate"/>
    <table ref="states_slice_table"/>
  </slice>
  ...
</slices>

... i dodasz kolejną kolumnę do definicji tabeli:

<tables>
  ...
  <table id="states_slice_table">
    <column id="state" type="string"/>
    <column id="year" type="date" format="yyyy"/>
    <column id="population" type="integer"/>
    <column id="unemployment_rate" type="float"/>
    <data>
      <file format="csv" encoding="utf-8">state_slice.csv</file>
    </data>
  </table>
  ...
</tables>

... i do pliku CSV:

state, year, population, unemployment_rate
AL,    1960, 9616353,    5.1
AL,    1961, 9799379,    5.2
AL,    1962, 9989846,    4.8
AL,    1963, 10188299,   6.9

Mówiliśmy wcześniej, że dla każdego wycinka wymiary tworzą klucz podstawowy dla tego wycinka. Dodatkowo każdy zbiór danych może zawierać tylko 1 wycinek dla danej kombinacji wymiarów. Wszystkie dane dostępne dla tych wymiarów muszą należeć do tego samego wycinka.

Więcej wymiarów: podział populacji według płci

Uzupełnijmy nasz zbiór danych o populację populacji według płci w poszczególnych krajach. Wiesz już, co i jak... Najpierw musimy dodać pojęcie płci:

<concept id="gender" extends="entity:entity">
  <info>
    <name>
      <value>Gender</value>
    </name>
    <description>
      <value>Gender, Male or Female</value>
    </description>
    <pluralName>
      <value>Genders</value>
    </pluralName>
    <totalName>
      <value>Both genders</value>
    </totalName>
  </info>
  <type ref="string"/>
  <table ref="genders_table"/>
</concept>

Sekcja Pojęcie płci info zawiera element pluralName, który zawiera tekst używany w odniesieniu do wielu wystąpień tego pojęcia. Sekcja info zawiera również element totalName, który zawiera tekst używany w odniesieniu do wszystkich wystąpień pojęcia „płeć” w całości. Oba te atrybuty są używane przez Public Data Explorer do wyświetlania informacji związanych z zagadnieniem płci. Ogólnie rzecz biorąc, należy je podawać w przypadku koncepcji, których można użyć jako wymiarów.

Pamiętaj, że pojęcie „płeć” obejmuje również entity:entity. Jest to dobre rozwiązanie w przypadku pojęć używanych jako wymiary, ponieważ pozwala dodawać niestandardowe nazwy, adresy URL i kolory dla różnych instancji koncepcyjnych.

Termin „płeć” odnosi się do tabeli genders_table, która zawiera możliwe wartości atrybutu płeć i ich wyświetlane nazwy (pominięte tutaj).

Aby dodać do zbioru danych populację według płci, musimy utworzyć nowy wycinek (pamiętaj: każda dostępna kombinacja wymiarów odpowiada wycinkowi w zbiorze danych).

<slice id="countries_gender_slice">
  <dimension concept="country"/>
  <dimension concept="gender"/>
  <dimension concept="time:year"/>
  <metric concept="population"/>
  <table ref="countries_gender_slice_table"/>
</slice>

Definicja tabeli wycinka wygląda tak:

<table id="countries_gender_slice_table">
  <column id="country" type="string"/>
  <column id="gender" type="string"/>
  <column id="year" type="date" format="yyyy"/>
  <column id="population" type="integer"/>
  <data>
    <file format="csv" encoding="utf-8">gender_country_slice.csv</file>
  </data>
</table>

Plik CSV tabeli wygląda tak:

country, gender, year, population
AF,      M,      1960, 4808176
AF,      F,      1960, 4808177
AF,      M,      1961, 4899689
AF,      F,      1961, 4899690...

W porównaniu z poprzednimi krajami, populacją i wydziałem bezrobocia ten wymiar ma dodatkowy wymiar, a każda wartość danych dotyczących populacji odpowiada nie tylko danemu krajowi i rokowi, ale też konkretnej płci.

Utworzyliśmy „rozproszony” zbiór danych. Nie wszystkie dane są dostępne w przypadku wszystkich wymiarów: populacja jest dostępna dla krajów i stanów USA co rok, natomiast stopa bezrobocia jest dostępna tylko w przypadku krajów. Podział według płci jest dostępny tylko w przypadku populacji według kraju. Nie jest dostępny dla danych o stopie bezrobocia ani dla wymiaru Stan. Rozbieżności mogą też występować na poziomie danych, co oznacza, że pewne dane nie mają wartości dla pewnych wartości wymiarów, ale nie jest to odzwierciedlone w DSPL.

Tematy

Ostatnią funkcją DSPL, której użyjemy w naszym zbiorze danych, będą tematy. Tematy służą do hierarchicznej klasyfikowania koncepcji, a aplikacje korzystają z nich, aby ułatwiać użytkownikom poruszanie się po danych.

W pliku DSPL tematy pojawiają się tuż przed pojęciami. Oto przykładowa hierarchia tematów:

<dspl ... >
  ...
  <topics>
    <topic id="geography">
      <info>
        <name>
          <value>Geography</value>
        </name>
      </info>
    </topic>
    <topic id="social_indicators">
      <info>
        <name>
          <value>Social indicators</value>
        </name>
      </info>
    </topic>
    <topic id="population_indicators">
      <info>
        <name>
          <value>Population indicators</value>
        </name>
      </info>
    </topic>
    <topic id="poverty_and_income">
      <info>
        <name>
          <value>Poverty & income</value>
        </name>
      </info>
    </topic>
    <topic id="health">
      <info>
        <name>
          <value>Health</value>
        </name>
      </info>
    </topic>
  </topics>

Tematy możesz zagnieżdżać odpowiednio do potrzeb.

Aby używać tematów, musisz odwoływać się do nich z definicji pojęcia w ten sposób:

<concept id="population">
  <info>
    <name>
      <value>Population</value>
    </name>
    <description>
      <value>Size of the resident population.</value>
    </description>
  </info>
  <topic ref="population_indicators"/>
  <type ref="integer"/>
</concept>

Jedna koncepcja może odnosić się do więcej niż jednego tematu.

Przesyłanie zbioru danych

Kolejnym krokiem po utworzeniu zbioru danych jest jego spakowanie i przesłanie pliku ZIP do narzędzia Google Public Data Explorer. Jeśli napotkasz jakieś problemy, przeczytaj odpowiedzi na najczęstsze pytania, które zawierają omówienie najczęstszych problemów z przesyłaniem.

Do celów informacyjnych możesz też pobrać kompletny plik XML i pełny pakiet zbiorów danych powiązane z tym samouczkiem.

Co dalej

Gratulujemy utworzenia pierwszego zbioru danych DSPL. Skoro znasz już podstawy, zalecamy przeczytanie przewodnika dla programistów, w którym znajdziesz między innymi informacje o zaawansowanych funkcjach DSPL, takich jak obsługa wielu języków i koncepcje możliwe do mapowania.

Możesz także zapoznać się z innymi przykładowymi zbiorami danych.