ArcGIS Pro v licenci Advanced obsahuje v toolboxu pro správu dat funkci Pivot, kterou je možné použít ke změně struktury tabulky v geodatabázi. Tato funkce redukuje redundantní záznamy na úkor rozšíření o nové sloupce (názorně viz obrázek).
I když nemáme k dispozici licenci Advanced, je možné experimentovat s obdobou této funkce v python knihovně pandas: pandas.DataFrame.pivot_table. Jen pro převod tabulky do pandas.DataFrame (tabulky v pandas) potřebujeme provést konverzi tabulky přes numpy array, tedy:
Tabulka v geodatabázi--(arcpy.da.TableToNumPyArray)-->numpy array --> pandas.DataFrame
a následně po provedení funkce pivot_table je potřeba konverzi provést zase obráceně přes numpy.array do tabulky v geodatabázi pomocí arcpy.da.NumPyArrayToTable. Jen je ještě potřeba definovat novou strukturu sloupců ve vstupním numpyarray.
Například pro výše uvedenou ukázku na obrázku je možné dosáhnout obdobného výsledku následujícím způsobem:
import arcpy
import numpy as np
import pandas as pd
#vstupni parametry
input="F:\\UKOLY\\F2\\PYTHON\\DATA.gdb\\LONG"
output="F:\\UKOLY\\F2\\PYTHON\\DATA.gdb\\SHORT"
inputCol=['EntID', 'LinkType']
pivotCol=['TableID']
valueCol=['LinkValue']
#prevod vstupni tabulky do numpy array
numpyarray = arcpy.da.TableToNumPyArray(input, tuple(inputCol+pivotCol+valueCol))
#prevod z numpy do pandas dataframe
df=pd.DataFrame(numpyarray)
#obdoba funkce pivot v knihovne pandas
pivoted = pd.pivot_table(df, values=valueCol[0], index=inputCol, columns=pivotCol, aggfunc='first')
#pridani sloupcu indexu z pivot funkce do tabulky
pivoted=pivoted.reset_index()
#z pandy do numpy
numpyarray_pivoted=pivoted.to_numpy()
#mapovani typu sloupcu z nove tabulky do numpyarray
numpyarraydtype=numpyarray.dtype
dtypelist=[]
for column in pivoted.columns:
if (column in numpyarraydtype.names):
dtypelist.append((column , numpyarraydtype[numpyarraydtype.names.index(column)]))
else:
dtypelist.append((column , numpyarraydtype[valueCol[0]]))
#prevod z listu na tuple s novou definici sloupcu
numpyarray_pivot_tuples=np.empty((numpyarray_pivoted.shape[0],), dtype=np.dtype(dtypelist))
numpyarray_pivot_tuples[:]=[tuple(i) for i in numpyarray_pivoted]
#ulozeni vysledne tabulky do geodatabaze
arcpy.da.NumPyArrayToTable(numpyarray_pivot_tuples, output)
Funkce pivot_table v pandas agreguje hodnoty ze sloupce values podle sloupců index a pivot, a tedy případné duplicity přes skupinu těchto (zde 3) sloupců pro pivoting vyloučí. (Uloží buď výsledek zadané agregační funkce, nebo v našem případě první nalezenou hodnotu z agregované skupiny.) Pokud bychom chtěli uživatele na tyto duplicity spíše upozornit, než je vyloučit, je možné použít funkci pandas.DataFrame.pivot, která výsledky neagreguje, ale u případné duplicity vrátí chybu: Index contains duplicate entries, cannot reshape.
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.