Funkcja transformacji danych

Ustalenie kolejności danych(Procedura rank)

Procedura rank oblicza kolejność elementów w kolumnie oraz tworzy tabelę wyjściową z wartościami kolejności zamiast elementów kolumny. Najmniejsza wartość z tabeli wejściowej posiada wartość kolejności 1 w tabeli wyjściowej, a kolejne wartości z tabeli wejściowej mają wartość uporządkowaną zwiększaną o 1. Równe sobie wartości posiadają takie same wartości uporządkowania. Każda konwersja wykonywana jest dla każdej kolumny oddzielnie.

Aby użyć komendy rank niezbędne jest zaimportowanie specialized.data z modułu biblioteki Gython.

Składnia:

            rank(alias.intable, alias.outtable, columns)
        

  • alias - alias wskazujący na bazę danych

  • intable - nazwa tabeli wejściowej

  • outtable - nazwa tabeli wyjściowej

  • columns - lista nazw kolumn, które mają zostać uporządkowane (jeżeli kolumny nie są wyszczególnione, wartości wszystkich kolumn będą uporządkowane)

Przykład 4.34. Rank procedure

table 'sport_cars':
    name        weight      speed    cost
    'skoda'      1200        260    10.000
    'renault'    1360        280    10.500 
    'opel'       900         240    8.200
    'VW'         1400        280    12.00
    'Fiat'       1450        260    7.800
    'Alfa Romeo' 1300        280    11.000

from specialized.data import rank
rank('sport_cars', 'sport_cars_rank')

tab = tableRead('sport_cars_rank')

for i in range(len(tab)):
    for j in range(len(tab[i])):
        print tab[i][j],
    print
    

Output:

name weight speed cost
skoda 2.0 2.5 3.0
renault 4.0 5.0 4.0
opel 1.0 1.0 2.0
VW 5.0 5.0 6.0
Fiat 6.0 2.5 1.0
Alfa Romeo 3.0 5.0 5.0
    

Ekspansja danych (procedura interpolate)

Procedura interpolate dokonuje interpolacji danych w kolumnach tabeli. Wynikiem jest nowa tabela. Tabela wyjściowa zawiera wartości niezależnych oraz zależnych zmiennych. Niezależna zmienna jest modyfikowana w sposób: zaczynając od najmniejszej wartości nowej obserwacji, dodawana jest wartość przyrostu równa parametrowi step. Odpowiednie zależne wartości są interpolowane w sześcienną krzywą składaną (wymaga granicy pochodnej o wartości równej 0). Aby poprawić czas wykonywania procedury zalecane jest zdefiniowanie kolumn z zmiennymi niezależnymi jako KLUCZ PODSTAWOWY.

Aby użyć komendy interpolate niezbędne jest zaimportowanie specialized.data z modułu biblioteki Gython.

Składnia:

            interpolate(alias.intable, alias.outtable, independent, step, dependents)
        
  • alias - alias wskazujący na bazę danych

  • intable - nazwa tabeli wejściowej

  • outtable - nazwa tabeli wyjściowej

  • independent - nazwa kolumny z zmiennymi niezależnymi

  • step - Krok przyrostu wartości modyfikującej zmienne niezależne w tabeli wyjściowej

  • dependents - lista nazw kolumn z zmiennymi zależnymi. Jeżeli nazwa kolumny zależnej jest nieokreślona, wyliczenie jest przeprowadzane dla wszystkich kolumn.

Przykład 4.35. Interpolate procedure:

table 'interpolate_in': 
    x y1 y2

    0 None None
    1 None None
    3 None 8
    4 5 6
    6 9 None

from specialized.data import interpolate
interpolate('interpolate_in', 'interpolate_out', 'x', 0.5)

tab = tableRead('interpolate_out')

for i in range(len(tab)):
    for j in range(len(tab[i])):
        print tab[i][j],
    print
    

Output:

x y1 y2
3.0 NULL 8.0
3.5 NULL 7.0
4.0 5.0 6.0
4.5 6.0 NULL
5.0 7.0 NULL
5.5 8.0 NULL
6.0 9.0 NULL
    

Próbkowanie danych (komenda sample )

Komenda sample tworzy tabelę z losowymi próbkami wartości z tabeli wejściowej. Tabela wyjściowa może zawierać wszystkie kolumny bądź tylko wybrane.

Składnia:

            sample(alias.intable, alias.outtable, outsize, columnNames, withReplacement=0|1, seed)
        

  • alias - alias wskazujący na bazę danych

  • intable - nazwa tabeli wejściowej

  • outtable - nazwa tabeli wyjściowej

  • outsize - liczba wierszy w tabeli wyjściowej do próbkowania (np. liczba generowanych wartości próbki)

  • columnNames - lista nazw kolumn do próbkowania (jeżeli kolumny są nie określone wtedy wszystkie kolumny będą próbkowane)

  • withReplacement - jeżeli 1 próbkowanie z podmianą. Domyślnie: 0

  • seed - za pomocą tego parametru można określić stałe ziarno generatora liczb losowych. Jeżeli ten parametr jest nieokreślony, domyślnie przyjmowana jest losowa liczba generatora.

Przykład 4.36. Sample procedure

table 'transactions':
    id      value       type 
    110     210      'outgoing'
    120     320      'outgoing'
    130     480      'incoming'
    140     338      'incoming'
    150     270      'outgoing'
    160     302      'incoming'
    170     None     'outgoing'
    180     420      'incoming'
    190     570      'incoming'
    200     380      'outgoing'
    210     90       'incoming'
    220     None     'incoming'
    230     800      'incoming'
    230     670      'outgoing'

sample('transactions', 'transactions_sample1', 5, withReplacement=1, seed=1234)
sample('transactions', 'transactions_sample2', 5, ['id', 'value'], seed=1234)


strFormat = "%-10s%-10s%-10s"
print "Table transactions_sample1"
print strFormat%("id","value","type")
trans None <- 'transactions_sample1':
    print $strFormat%(id,value,type)
    
strFormat = "%-10s%-10s"
print "\nTable transactions_sample2"
print strFormat%("id","value")
trans None <- 'transactions_sample2':
    print $strFormat%(id,value)
    

Output:

Table transactions_sample1
id        value     type      
150       270       outgoing  
110       210       outgoing  
210       90        incoming  
130       480       incoming  
230       800       incoming  

Table transactions_sample2
id        value     
150       270       
160       302       
170       None      
190       570       
230       800      
    

Dzielenie Tabel (Procedura tableSplit)

Komenda tableSplit dzieli tabelę w dowolną ilość tabel. Można dostarczyć ilość tabel określonych na liście reguł podziału lub dostarczyć tylko jedną tabelę z dodatkową kolumną GroupId. Kolumna GroupId zawiera identyfikatory grup, których wiersze są oznaczone.

Tabela wejściowa może być umiejscowiona w innej bazie danych niż tabele wyjściowe, ale niektóre bazy danych są niekompatybilne. Na przykład, tabela mySQL nie może być podzielona w tabelach MSSQL ponieważ MSSQL nie wspiera typu danych double. Co więcej, tabele wyjściowe mogą być umiejscowione w różnych bazach danych. Jeżeli chcesz użyć tej funkcjonalności, musisz określić alias dla każdej bazy danych, którą chcesz użyć.

Składnia:

			tableSplit(alias.inTable[, group = 0 | 1][, split = l][, seed = n][, output = l])
        

Znaczenie parametrów wyjaśnione jest poniżej:

  • alias - alias wskazujący na bazę danych

  • inTable - nazwa tabeli wejściowej

  • inTable – ustaw ten parametr na 1 jeżeli chcesz, jeśli chcesz stworzyć przy pomocy tableSplit tylko jedną tabelę z dodaną kolumną GroupId, która zawiera identyfikatory grup, do których zawiera bieżące wiersze. Domyślnie parametr ten jest ustawiony na 0, dlatego tableSplit daje wynik tak wielu tabel jak wiele użytych jest ról podziału.

  • split - określa rozmiar podziału. Na przykład split = [3,7] wygeneruje dwie tabele z 30% oraz 70% losowo wziętych wierszy z tabeli wejściowej. Możliwe jest określenie więcej niż dwa udziały podziału, np. split = [10, 20, 30, 10, 30] dostarczy 5 tabel z wierszami podzielonymi procentowo na 10%, 20%, 30%, 10% and 15 % z tabeli wejściowej.

  • seed - za pomocą tego parametru można określić stałe ziarno dla generatora liczb losowych. Jeżeli ten parametr nie jest określony, użyta zostanie domyślnie losowa liczba generatora.

  • output - użyj tego parametru do określenia konwencji nazewnictwa tabeli wyjściowych. Jeżeli parametr nie jest dostarczony, tableSplit uzyskane nazwy tabel wyjściowych są kombinacją nazwy tabeli wejściowej i liczby – np. jeżeli nazwa tabeli ma nazwę „TEST_data” i podzielisz ją na dwie tabele, nazwy wyjściowe będą "TEST_data_1", "TEST_data_2".

    Możliwe jest także określenie prefiksu nazwy tabeli wyjściowej – np. wyjście=”splits” wygeneruje "splits_1", "splits_2", "splits_3", itd.

    Możesz także dostarczyć określone nazwy wyjścia. W takim przypadku liczba dostarczonych nazw musi się zgadzać z liczbą reguł podziału, np. wyjście=["a", "b"], podział=[3, 4]

Przydział wierszy do grup/tabel jest wykonywane przez procedurę losową. Dla każdej tabeli występuje prawdopodobieństwo (określone przez listę reguł podziału), że bieżący wiersz będzie przypisany do tej konkretnej tabeli. Jeżeli próbujesz podzielić tabelę na dwie równe części split = [1,1]), liczba wierszy dla każdego z nich może być trochę różna niż dokładnie 50% w stosunku do wierszy tabeli wejściowej, ale suma liczby wierszy tabel wyjściowych będzie równa liczbie wierszy tabeli wejściowej.

Rozbieżność pomiędzy proporcją reguł podziału i aktualnej liczbie wierszy w tabelach wyjściowych zmniejsza się gdy ilość wierszy w tabeli wejściowej rośnie.

Przykład 4.37. Split table

table 'sport_cars':
    name        weight      speed    cost
    'skoda'      1200        260    10.000
    'renault'    1360        280    10.500 
    'opel'       900         240    8.200
    'VW'         1400        280    12.00
    'Fiat'       1450        260    7.800
    'Alfa Romeo' 1300        280    11.000

   # This yields two tables - "sport_cars_part_1" and "sport_cars_part_2"
tableSplit('sport_cars', split=[1, 2], seed=124, output=['sport_cars_part'])

print 'First part:'
trans None <- 'sport_cars_part_1':
    print name,weight,speed,cost

print 'Second part:'    
trans None <- 'sport_cars_part_2':
    print name,weight,speed,cost
    

Output:

First part:
opel 900 240 8.2
Second part:
skoda 1200 260 10.0
renault 1360 280 10.5
VW 1400 280 12.0
Fiat 1450 260 7.8
Alfa Romeo 1300 280 11.0
    

Tabele transponowanie (Procedura transpose)

Procedura transpose wykonuje transpozycji tabeli (kolumny są zamieniane z wierszami). W tabeli wyjściowej kolumna nazwana ‘name’ tworzona jest z wartościami, które w tej kolumnie są nazwami kolumn z tabeli wejściowej o nazwie ‘columnX’ (gdzie X jest numerem wiersza z tabeli wejściowej). Transpozycja powiedzie się tylko wtedy, gdy typ danych dla wszystkich kolumn tabeli wejściowej może być uogólniony do jednego typu danych.

Aby użyć komendy transpose niezbędne jest zaimportowanie specialized.data z modułu biblioteki Gython.

Składnia:

transpose(alias.intable, alias.outtable)
        
  • alias - alias wskazujący na bazę danych

  • intable - nazwa tabeli wejściowej

  • outtable - nazwa tabeli wyjściowej

Przykład 4.38. The transpose procedure

table 'matrix':
    a b c

    1 2 3
    4 5 6
    7 8 9
from specialized.data import  transpose
tableDelete('trans_matrix')
transpose('matrix', 'trans_matrix')

tab = tableRead('trans_matrix')
 
for i in range(len(tab)):
    for j in range(len(tab[i])):
        print tab[i][j],
    print 
    

Output:

name column1 column2 column3
a 1.0 4.0 7.0
b 2.0 5.0 8.0
c 3.0 6.0 9.0
    

Porównanie dwóch tabel (Procedura tablesCompare)

Komenda tablesCompare wyświetla podstawowe informacje o porównaniu dwóch tabel:

  • kolumny występujące tylko w pierwszej tabeli

  • kolumny występujące tylko w drugiej tabeli

  • kolumny, które posiadają różny typ danych

  • liczba wierszy z tą samą wartośćią klucza

  • liczba nadmiarowych wierszy w pierwszej tabeli

  • liczba nadmiarowych wierszy w drugiej tabeli

  • liczba wierszy z dopasowaniem kluczy i różnicą wartości w obu tabelach

Możliwe jest mapowanie nazw kolumn z jednej tabeli do innej nazwy kolumny w innej tabeli

Wiersze z wartościami kluczy NULL są pomijane.

Składnia:

			tablesCompare(alias.table1, key1, alias.table2, key2[, {var1: var2,...}][, silent= 0 | 1])
        
  • alias - alias wskazujący na bazę danych

  • table1, table2 - nazwy porównywanych tabel

  • key1, key2 - klucze, które mają byc użyte do porównania.

  • var1, var2 - odpowiadające sobie kolumny w tabeli (jeśli żadne kolumny nie zostaną tu wymienione, zakładane jest, że kolumny w obu tabelach muszą nazywać się tak samo)

  • silent - jeżeli 1 - wynik porównania nie jest wyświetlany w nowym oknie. Domyślnie: 0

Przykład 4.39. The tablesCompare procedure

table 'compare1':
    format c INTEGER, d INTEGER

    a b c d f

    1 1 None None 1
    2 2 None None 2
    3 3 None None 1
    4 4 None None 2
    6 6 None None 1
    7 7 None None 2
    8 8 None None 1

table 'compare2':
    format d VARCHAR(32), e INTEGER

    aa bb d e f

    4 4 None None 1
    5 5 None None 1
    6 5 None None 2
    7 5 None None 2
    8 8 None None 1

result = tablesCompare('compare1', 'f','compare2', 'f',silent=1)

print "Comparison - (tablesCompare('compare1', 'f','compare2', 'f')):"
print "Variable presented only in first table:", result.columnsInFirst
print "Variable presented only in second table:", result.columnsInSecond
print "Variables with different types:", result.columnsWithDifferentTypes
print "Matching rows:",result.matchingRows
print "Unmatched rows in the first table:", result.unmatchedRowsInFirst
print "Unmatched rows in the second table:", result.unmatchedRowsInSecond
print "Rows with different values:",result.rowsWithDifferentValues

result = tablesCompare('compare1', 'a','compare2', 'aa', {'b' : 'bb'},silent=1)

print "\nComparison - (tablesCompare('compare1', 'a','compare2', 'aa', {'b' : 'bb'})):"
print "Variable presented only in first table:", result.columnsInFirst
print "Variable presented only in second table:", result.columnsInSecond
print "Variables with different types:", result.columnsWithDifferentTypes
print "Matching rows:",result.matchingRows
print "Unmatched rows in the first table:", result.unmatchedRowsInFirst
print "Unmatched rows in the second table:", result.unmatchedRowsInSecond
print "Rows with different values:",result.rowsWithDifferentValues
    

Output:

Comparison - (tablesCompare('compare1', 'f','compare2', 'f')):
Variable presented only in first table: ['a', 'c', 'b']
Variable presented only in second table: ['bb', 'aa', 'e']
Variables with different types: ['d']
Matching rows: 5
Unmatched rows in the first table: 2
Unmatched rows in the second table: 0
Rows with different values: 0

Comparison - (tablesCompare('compare1', 'a','compare2', 'aa', {'b' : 'bb'})):
Variable presented only in first table: ['c']
Variable presented only in second table: ['e']
Variables with different types: ['d']
Matching rows: 4
Unmatched rows in the first table: 3
Unmatched rows in the second table: 1
Rows with different values: 3