Vysvetlenie priradenia zobrazenia údajov vo vizuáloch služby Power BI

Tento článok popisuje mapovanie zobrazenia údajov a popisuje, ako sa roly údajov používajú na vytvorenie rôznych typov vizuálov. Vysvetľuje, ako určiť podmienené požiadavky pre roly údajov, ako aj rôzne dataMappings typy.

Každé platné mapovanie vyprodukuje zobrazenie údajov. Za určitých podmienok môžete poskytnúť viacero priradení údajov. Podporované možnosti mapovania sú:

"dataViewMappings": [
    {
        "conditions": [ ... ],
        "categorical": { ... },
        "single": { ... },
        "table": { ... },
        "matrix": { ... }
    }
]

Power BI vytvorí priradenie zobrazovaní údajov, ak a len ak je platné priradenie definované aj v dataViewMappings .

Inými slovami, priradenie categorical (kategorické) môže byť definované v priradeniach dataViewMappings (priradeniach zobrazenia údajov), ale iné priradenia, ako napríklad table (tabuľka) alebo single (jednotlivé), nemusia byť. V takom prípade Power BI vytvorí zobrazenie údajov s jedným priradení, zatiaľ čo categorical iné table priradenia zostanú nedefinované. Príklad:

"dataViewMappings": [
    {
    "categorical": {
        "categories": [ ... ],
        "values": [ ... ]
    },
    "metadata": { ... }
    }
]

Podmienky

Sekcia conditions vytvára pravidlá pre konkrétne priradenie údajov. Ak sa údaje zhodujú s niektorou z popísaných množín podmienok, vizuál akceptuje údaje ako platné.

V súčasnosti je pre každé pole možné zadať minimálnu a maximálnu hodnotu. Predstavuje počet polí, ktoré môžu byť naviazané na danú rolu údajov.

Poznámka

Ak je rola údajov v podmienke vynechaná, môže mať ľubovoľný počet polí.

V nasledujúcom príklade obmedzujete obmedzenie category na jedno údajové pole a measure na dve údajové polia.

"conditions": [
    { "category": { "max": 1 }, "measure": { "max": 2 } },
]

Môžete tiež nastaviť viacero podmienok pre rolu údajov. V takom prípade sú údaje platné, ak je splnená niektorá z podmienok.

"conditions": [
    { "category": { "min": 1, "max": 1 }, "measure": { "min": 2, "max": 2 } },
    { "category": { "min": 2, "max": 2 }, "measure": { "min": 1, "max": 1 } }
]

V príklade uvedenom vyššie sa vyžaduje jedna z nasledujúcich dvoch podmienok:

  • Presne jedno pole kategórie a presne dve opatrenia
  • Presne dve kategórie a presne jedna mierka.

Priradenie jednotlivých údajov

Priradenie jednotlivých údajov je najjednoduchším spôsobom priradenia údajov. Akceptuje jedno pole miery a vráti súčet. Ak je pole numerické, vráti sa súčet. V opačnom prípade vráti počet jedinečných hodnôt.

Ak chcete použiť priradenie jednotlivých údajov, definujte názov roly údajov, ktorú chcete priradiť. Toto priradenie bude fungovať len s jedným poľom mierky. Ak je druhé pole priradené, negeneruje sa žiadne zobrazenie údajov, takže je vhodné zahrnúť podmienku obmedzujúnú údaje na jedno pole.

Poznámka

Toto priradenie údajov sa nedá použiť v spojení so žiadnym iným priradením údajov. Je určené na zmenšenie údajov na jednu číselnú hodnotu.

Príklad:

{
    "dataRoles": [
        {
            "displayName": "Y",
            "name": "Y",
            "kind": "Measure"
        }
    ],
    "dataViewMappings": [
        {
            "conditions": [
                {
                    "Y": {
                        "max": 1
                    }
                }
            ],
            "single": {
                "role": "Y"
            }
        }
    ]
}

Výsledné zobrazenie údajov môže stále obsahovať iné typy (tabuľka, kategorické atď.), ale každé priradenie bude obsahovať iba jednu hodnotu. Odporúča sa preto mať prístup k hodnote iba jednotlivo.

{
    "dataView": [
        {
            "metadata": null,
            "categorical": null,
            "matrix": null,
            "table": null,
            "tree": null,
            "single": {
                "value": 94163140.3560001
            }
        }
    ]
}

Ukážka kódu na spracovanie priradenia zobrazení jednoduchých údajov

"use strict";
import powerbi from "powerbi-visuals-api";
import DataView = powerbi.DataView;
import DataViewSingle = powerbi.DataViewSingle;
// standard imports
// ...

export class Visual implements IVisual {
    private target: HTMLElement;
    private host: IVisualHost;
    private valueText: HTMLParagraphElement;

    constructor(options: VisualConstructorOptions) {
        // constructor body
        this.target = options.element;
        this.host = options.host;
        this.valueText = document.createElement("p");
        this.target.appendChild(this.valueText);
        // ...
    }

    public update(options: VisualUpdateOptions) {
        const dataView: DataView = options.dataViews[0];
        const singleDataView: DataViewSingle = dataView.single;

        if (!singleDataView ||
            !singleDataView.value ) {
            return
        }

        this.valueText.innerText = singleDataView.value.toString();
    }
}

Výsledkom vyššie uvedeného kódu je zobrazenie jednej hodnoty zo služby Power BI:

Príklad vizuálu priradenia zobrazenia jednotlivých údajov

Priradenie kategorických údajov

Priradenie kategorických údajov sa používa na získanie nezávislých zoskupovaní alebo kategórií údajov. Kategórie môžu byť tiež ďalej zoskupené pomocou zoskupenia v priradení údajov.

Základné priradenie kategorických údajov

Zvážte nasledujúce roly údajov a priradenia:

"dataRoles":[
    {
        "displayName": "Category",
        "name": "category",
        "kind": "Grouping"
    },
    {
        "displayName": "Y Axis",
        "name": "measure",
        "kind": "Measure"
    }
],
"dataViewMappings": {
    "categorical": {
        "categories": {
            "for": { "in": "category" }
        },
        "values": {
            "select": [
                { "bind": { "to": "measure" } }
            ]
        }
    }
}

Vo vyššie uvedenom príklade sa prečíta "Primapovať rolu údajov tak, aby sa pre každé pole, ktoré presuniem do category category priradenia , primapoval jeho údaje do uvedeného poľa categorical.categories . Okrem toho map moju measure rolu údajov na categorical.values ."

  • for... v: zahriete všetky položky v tejto role údajov do dotazu na údaje.
  • bind... na: Dáva rovnaký výsledok ako v pre... v, ale očakáva, že rola údajov bude mať podmienku obmedzujúnú na jedno pole.

Zoskupenie kategorických údajov

Nasledujúci príklad používa rovnaké dve roly údajov ako predchádzajúci príklad a pridá do ďalších rolí údajov s názvom grouping a measure2 .

"dataRole":[
    {
        "displayName": "Category",
        "name": "category",
        "kind": "Grouping"
    },
    {
        "displayName": "Y Axis",
        "name": "measure",
        "kind": "Measure"
    },
    {
        "displayName": "Grouping with",
        "name": "grouping",
        "kind": "Grouping"
    },
    {
        "displayName": "X Axis",
        "name": "measure2",
        "kind": "Grouping"
    }
],
"dataViewMappings":{
    "categorical": {
        "categories": {
            "for": { "in": "category" }
        },
        "values": {
            "group": {
                "by": "grouping",
                "select":[
                    { "bind": { "to": "measure" } },
                    { "bind": { "to": "measure2" } }
                ]
            }
        }
    }
}

Rozdiel medzi týmto priradením a základným mapovaním je v spôsobe mapovania categorical.values . Priradení measure measure2 rolí údajov a k role údajov grouping môžeme vhodne škálovať os x a os y.

Zoskupenie hierarchických údajov

V nasledujúcom príklade použijeme kategorické údaje na vytvorenie hierarchie, ktorá sa dá použiť na podporu akcií prechod na detaily.

Tu sú roly a priradenia údajov:

"dataRoles": [
    {
        "displayName": "Categories",
        "name": "category",
        "kind": "Grouping"
    },
    {
        "displayName": "Measures",
        "name": "measure",
        "kind": "Measure"
    },
    {
        "displayName": "Series",
        "name": "series",
        "kind": "Measure"
    }
],
"dataViewMappings": [
    {
        "categorical": {
            "categories": {
                "for": {
                    "in": "category"
                }
            },
            "values": {
                "group": {
                    "by": "series",
                    "select": [{
                            "for": {
                                "in": "measure"
                            }
                        }
                    ]
                }
            }
        }
    }
]

Zvážte nasledujúce kategorické údaje:

Krajina 2013 2014 2015 2016
USA x x 650 350
Kanada x 630 490 x
Mexiko 645 x x x
SPOJENÉ KRÁĽOVSTVO x x 831 x

Power BI vytvorí zobrazenie kategorických údajov s nasledujúcou množinou kategórií.

{
    "categorical": {
        "categories": [
            {
                "source": {...},
                "values": [
                    "Canada",
                    "USA",
                    "UK",
                    "Mexico"
                ],
                "identity": [...],
                "identityFields": [...],
            }
        ]
    }
}

Každá category mapa sa tiež mapuje na values množinu. Každý z nich values je zoskupený podľa series , čo vyjadruje roky.

Každé pole napríklad values predstavuje jeden rok. Každé pole má values tiež štyri hodnoty: Kanada, USA, Spojené kráľovstvo a Mexiko:

{
    "values": [
        // Values for year 2013
        {
            "source": {...},
            "values": [
                null, // Value for `Canada` category
                null, // Value for `USA` category
                null, // Value for `UK` category
                645 // Value for `Mexico` category
            ],
            "identity": [...],
        },
        // Values for year 2014
        {
            "source": {...},
            "values": [
                630, // Value for `Canada` category
                null, // Value for `USA` category
                null, // Value for `UK` category
                null // Value for `Mexico` category
            ],
            "identity": [...],
        },
        // Values for year 2015
        {
            "source": {...},
            "values": [
                490, // Value for `Canada` category
                650, // Value for `USA` category
                831, // Value for `UK` category
                null // Value for `Mexico` category
            ],
            "identity": [...],
        },
        // Values for year 2016
        {
            "source": {...},
            "values": [
                null, // Value for `Canada` category
                350, // Value for `USA` category
                null, // Value for `UK` category
                null // Value for `Mexico` category
            ],
            "identity": [...],
        }
    ]
}

Nižšie je ukážka kódu na spracovanie priradenia zobrazení kategorických údajov. Táto ukážka vytvorí hierarchickú štruktúru Country => Year => Value

"use strict";
import powerbi from "powerbi-visuals-api";
import DataView = powerbi.DataView;
import DataViewCategorical = powerbi.DataViewCategorical;
import DataViewValueColumnGroup = powerbi.DataViewValueColumnGroup;
import PrimitiveValue = powerbi.PrimitiveValue;
// standart imports
// ...

export class Visual implements IVisual {
    private target: HTMLElement;
    private host: IVisualHost;
    private categories: HTMLElement;

    constructor(options: VisualConstructorOptions) {
        // constructor body
        this.target = options.element;
        this.host = options.host;
        this.categories = document.createElement("pre");
        this.target.appendChild(this.categories);
        // ...
    }

    public update(options: VisualUpdateOptions) {
        const dataView: DataView = options.dataViews[0];
        const categoricalDataView: DataViewCategorical = dataView.categorical;

        if (!categoricalDataView ||
            !categoricalDataView.categories ||
            !categoricalDataView.categories[0] ||
            !categoricalDataView.values) {
            return;
        }

        // Categories have only one column in data buckets
        // To support several columns of categories data bucket, iterate categoricalDataView.categories array.
        const categoryFieldIndex = 0;
        // Measure has only one column in data buckets.
        // To support several columns on data bucket, iterate years.values array in map function
        const measureFieldIndex = 0;
        let categories: PrimitiveValue[] = categoricalDataView.categories[categoryFieldIndex].values;
        let values: DataViewValueColumnGroup[] = categoricalDataView.values.grouped();

        let data = {};
        // iterate categories/countries
        categories.map((category: PrimitiveValue, categoryIndex: number) => {
            data[category.toString()] = {};
            // iterate series/years
            values.map((years: DataViewValueColumnGroup) => {
                if (!data[category.toString()][years.name] && years.values[measureFieldIndex].values[categoryIndex]) {
                    data[category.toString()][years.name] = []
                }
                if (years.values[0].values[categoryIndex]) {
                    data[category.toString()][years.name].push(years.values[measureFieldIndex].values[categoryIndex]);
                }
            });
        });

        this.categories.innerText = JSON.stringify(data, null, 6);
        console.log(data);
    }
}

Výsledný vizuál je tu:

Vizuál s priradením zobrazenia kategorických údajov

Mapovanie tabuliek

Zobrazenie tabuľkových údajov je v podstate zoznam údajových bodov, kde sa číselné údajové body môžu agregovať.

Napríklad použitie rovnakých údajov ako v predchádzajúcej časti, ale s nasledujúcimi funkciami:

"dataRoles": [
    {
        "displayName": "Column",
        "name": "column",
        "kind": "Grouping"
    },
    {
        "displayName": "Value",
        "name": "value",
        "kind": "Measure"
    }
],
"dataViewMappings": [
    {
        "table": {
            "rows": {
                "select": [
                    {
                        "for": {
                            "in": "column"
                        }
                    },
                    {
                        "for": {
                            "in": "value"
                        }
                    }
                ]
            }
        }
    }
]

Tabuľkové zobrazenie údajov môžete vizualizovať takto:

Príklad údajov:

Krajina Rok Sales
USA 2016 100
USA 2015 50
Kanada 2015 200
Kanada 2015 50
Mexiko 2013 300
SPOJENÉ KRÁĽOVSTVO 2014 150
USA 2015 75

Údajová väzba:

Údajové väzby priradenia zobrazenia tabuľkových údajov

Power BI zobrazí vaše údaje ako zobrazenie tabuľkových údajov. Nepredpokladajte, že údaje sú objednané.

{
    "table" : {
        "columns": [...],
        "rows": [
            [
                "Canada",
                2014,
                630
            ],
            [
                "Canada",
                2015,
                490
            ],
            [
                "Mexico",
                2013,
                645
            ],
            [
                "UK",
                2014,
                831
            ],
            [
                "USA",
                2015,
                650
            ],
            [
                "USA",
                2016,
                350
            ]
        ]
    }
}

Ak chcete agregovať údaje, vyberte požadované pole a potom vyberte položku Súčet.

Agregácia údajov.

Ukážka kódu na spracovanie priradenia zobrazenia tabuľkových údajov.

"use strict";
import "./../style/visual.less";
import powerbi from "powerbi-visuals-api";
// ...
import DataViewMetadataColumn = powerbi.DataViewMetadataColumn;
import DataViewTable = powerbi.DataViewTable;
import DataViewTableRow = powerbi.DataViewTableRow;
import PrimitiveValue = powerbi.PrimitiveValue;
// other imports
// ...

export class Visual implements IVisual {
    private target: HTMLElement;
    private host: IVisualHost;
    private table: HTMLParagraphElement;

    constructor(options: VisualConstructorOptions) {
        // constructor body
        this.target = options.element;
        this.host = options.host;
        this.table = document.createElement("table");
        this.target.appendChild(this.table);
        // ...
    }

    public update(options: VisualUpdateOptions) {
        const dataView: DataView = options.dataViews[0];
        const tableDataView: DataViewTable = dataView.table;

        if (!tableDataView) {
            return
        }
        while(this.table.firstChild) {
            this.table.removeChild(this.table.firstChild);
        }

        //draw header
        const tableHeader = document.createElement("th");
        tableDataView.columns.forEach((column: DataViewMetadataColumn) => {
            const tableHeaderColumn = document.createElement("td");
            tableHeaderColumn.innerText = column.displayName
            tableHeader.appendChild(tableHeaderColumn);
        });
        this.table.appendChild(tableHeader);

        //draw rows
        tableDataView.rows.forEach((row: DataViewTableRow) => {
            const tableRow = document.createElement("tr");
            row.forEach((columnValue: PrimitiveValue) => {
                const cell = document.createElement("td");
                cell.innerText = columnValue.toString();
                tableRow.appendChild(cell);
            })
            this.table.appendChild(tableRow);
        });
    }
}

Súbor štýlov vizuálu style/visual.less obsahuje rozloženie pre tabuľku:

table {
    display: flex;
    flex-direction: column;
}

tr, th {
    display: flex;
    flex: 1;
}

td {
    flex: 1;
    border: 1px solid black;
}

Výsledný vizuál vyzerá takto:

Vizuál s mapovaním údajov tabuľky.

Priradenie maticových údajov

Priradenie údajov matice je podobné mapovanie údajov tabuľky, ale riadky sú prezentované hierarchicky. Akákoľvek z hodnôt rolí údajov sa dá použiť ako hodnota hlavičky stĺpca.

{
    "dataRoles": [
        {
            "name": "Category",
            "displayName": "Category",
            "displayNameKey": "Visual_Category",
            "kind": "Grouping"
        },
        {
            "name": "Column",
            "displayName": "Column",
            "displayNameKey": "Visual_Column",
            "kind": "Grouping"
        },
        {
            "name": "Measure",
            "displayName": "Measure",
            "displayNameKey": "Visual_Values",
            "kind": "Measure"
        }
    ],
    "dataViewMappings": [
        {
            "matrix": {
                "rows": {
                    "for": {
                        "in": "Category"
                    }
                },
                "columns": {
                    "for": {
                        "in": "Column"
                    }
                },
                "values": {
                    "select": [
                        {
                            "for": {
                                "in": "Measure"
                            }
                        }
                    ]
                }
            }
        }
    ]
}

Power BI vytvorí hierarchickú štruktúru údajov. Koreň stromovej hierarchie zahŕňa údaje zo stĺpca Rodičia roly údajov Category s deťmi zo stĺpca Deti tabuľky roly údajov.

Množina údajov:

Rodičia Deti Vnúčatá Stĺpce Hodnoty
Rodič 1 Dieťa 1 Vnúča 1 Stĺpec 1 5
Rodič 1 Dieťa 1 Vnúča 1 Stĺpec 2 6
Rodič 1 Dieťa 1 Vnúča 2 Stĺpec 1 7
Rodič 1 Dieťa 1 Vnúča 2 Stĺpec 2 8
Rodič 1 Dieťa 2 Vnúča 3 Stĺpec 1 5
Rodič 1 Dieťa 2 Vnúča 3 Stĺpec 2 3
Rodič 1 Dieťa 2 Vnúča 4 Stĺpec 1 4
Rodič 1 Dieťa 2 Vnúča 4 Stĺpec 2 9
Rodič 1 Dieťa 2 Vnúča 5 Stĺpec 1 3
Rodič 1 Dieťa 2 Vnúča 5 Stĺpec 2 5
Rodič 2 Dieťa 3 Vnúča 6 Stĺpec 1 1
Rodič 2 Dieťa 3 Vnúča 6 Stĺpec 2 2
Rodič 2 Dieťa 3 Vnúča 7 Stĺpec 1 7
Rodič 2 Dieťa 3 Vnúča 7 Stĺpec 2 1
Rodič 2 Dieťa 3 Vnúča 8 Stĺpec 1 10
Rodič 2 Dieťa 3 Vnúča 8 Stĺpec 2 13

Vizuál základnej matice služby Power BI vykreslí údaje ako tabuľku.

Maticové vizuály.

Vizuál získa svoju štruktúru údajov tak, ako je popísané v nasledujúcom kóde (sú tu zobrazené len prvé dva riadky tabuľky):

{
    "metadata": {...},
    "matrix": {
        "rows": {
            "levels": [...],
            "root": {
                "childIdentityFields": [...],
                "children": [
                    {
                        "level": 0,
                        "levelValues": [...],
                        "value": "Parent1",
                        "identity": {...},
                        "childIdentityFields": [...],
                        "children": [
                            {
                                "level": 1,
                                "levelValues": [...],
                                "value": "Child1",
                                "identity": {...},
                                "childIdentityFields": [...],
                                "children": [
                                    {
                                        "level": 2,
                                        "levelValues": [...],
                                        "value": "Grand child1",
                                        "identity": {...},
                                        "values": {
                                            "0": {
                                                "value": 5 // value for Col1
                                            },
                                            "1": {
                                                "value": 6 // value for Col2
                                            }
                                        }
                                    },
                                    ...
                                ]
                            },
                            ...
                        ]
                    },
                    ...
                ]
            }
        },
        "columns": {
            "levels": [...],
            "root": {
                "childIdentityFields": [...],
                "children": [
                    {
                        "level": 0,
                        "levelValues": [...],
                        "value": "Col1",
                        "identity": {...}
                    },
                    {
                        "level": 0,
                        "levelValues": [...],
                        "value": "Col2",
                        "identity": {...}
                    },
                    ...
                ]
            }
        },
        "valueSources": [...]
    }
}

Algoritmus znižovania údajov

Algoritmus redukcie údajov určuje, ktoré údaje a koľko údajov sa prijíma v zobrazení údajov.

Počet je nastavený na maximálny počet hodnôt, ktoré môže zobrazenie údajov akceptovať. Ak existuje viac ako počet hodnôt, algoritmus redukcie údajov určuje, ktoré hodnoty sa majú prijať.

Typy algoritmov znižovania údajov

Existujú štyri typy nastavení algoritmu znižovania údajov:

  • top: Prvé hodnoty počtu sa prebrajú z množiny údajov.
  • bottom: Posledné hodnoty počtu sa prebrajú z množiny údajov.
  • sample: Zahrnie sa prvá a posledná položka a spočíta sa počet položiek s rovnakými intervalmi. Napríklad, ak máte množinu údajov [0, 1, 2, ... 100] a počet 9, dostanete hodnoty [0, 10, 20 ... 100].
  • window: Načíta naraz jedno okno údajových bodov obsahujúce počet prvkov „count“ . Nastavenia topwindow sú v súčasnosti rovnocenné. Pracujeme na tom, aby sme docielili úplnú podporu nastavení pomocou okien.

V predvolenom nastavení majú všetky vizuály služby Power BI najvyšší algoritmus znižovania údajov s hodnotou „count“ nastavenou na 1 000 údajových bodov. Toto je ekvivalentné nastaveniu nasledujúcich vlastností v capabilities.jsv súbore:

"dataReductionAlgorithm": {
    "top": {
        "count": 1000
    }
}

Hodnotu „count“ môžete upraviť na ľubovoľnú celočíselnú hodnotu až do 30 000. Vizuály služby Power BI založené na R môžu podporovať až 150 000 riadkov.

Použitie algoritmov znižovania údajov

Algoritmus znižovania údajov sa dá použiť v kategorickom, tabuľkovom či maticovom priradení zobrazenia údajov.

Pri kategorickom mapovaní údajov môžete pridať algoritmus do sekcie "kategórie" alebo "skupina" values pre kategorické mapovanie údajov.

"dataViewMappings": {
    "categorical": {
        "categories": {
            "for": { "in": "category" },
            "dataReductionAlgorithm": {
                "window": {
                    "count": 300
                }
            }  
        },
        "values": {
            "group": {
                "by": "series",
                "select": [{
                        "for": {
                            "in": "measure"
                        }
                    }
                ],
                "dataReductionAlgorithm": {
                    "top": {
                        "count": 100
                    }
                }  
            }
        }
    }
}

V mapovaní zobrazenia údajov tabuľky použite algoritmus redukcie údajov rows v časti tabuľky Mapovanie zobrazenia údajov.

"dataViewMappings": [
    {
        "table": {
            "rows": {
                "for": {
                    "in": "values"
                },
                "dataReductionAlgorithm": {
                    "top": {
                        "count": 2000
                    }
                }
            }
        }
    }
]

Algoritmus znižovania údajov sa dá použiť v sekciách riadky (rows) a stĺpce (columns) matice priradenia zobrazenia údajov.

Ďalšie kroky