Cosè il sé in Python: esempi del mondo reale
Cos'è il sé in Python: esempi del mondo reale
In questo tutorial, daremo un'occhiata a un pezzo di codice DAX. Potresti aver già usato qualcosa di simile. In alternativa, potresti trovarlo e rimanere confuso sul funzionamento di questo codice e sul modo in cui il contesto di riga e il contesto di filtro sembrano interagire tra loro in un solo codice DAX. Ad ogni modo, questo tutorial esaminerà in dettaglio tutto quanto sopra. Puoi guardare il video completo di questo tutorial in fondo a questo blog.
Innanzitutto, esamineremo il codice stesso. Poi andremo oltre la parte teorica per capirla meglio. Infine, esamineremo tutto dietro le quinte utilizzando DAX Studio .
Il modello di dati che utilizzeremo è fondamentalmente un semplice modello di dati di vendita che contiene date, vendite e la tabella prodotti. La tabella Sales contiene le transazioni per ogni dato giorno. La tabella Prodotti contiene informazioni sulle informazioni di vendita relative ai prodotti in un determinato giorno. La tabella Date contiene solo poche colonne ai fini di questo tutorial.
Siamo interessati solo alla tabella Date, ma utilizzeremo la tabella Sales e la tabella Products per spiegare come si propagano il contesto del filtro e il contesto della riga con l'aiuto delle relazioni.
Sommario
Contesto di riga e contesto di filtro in una misura totale parziale
Creiamo ora una misura del totale parziale perché contiene contesti sia di riga che di filtro. Questa è una misura totale parziale di base, in cui utilizzo COUNTROWS su FILTER e la funzione ALL per restituire tutti gli anni che ho all'interno della tabella Date. Quando porto quella misura all'interno della tabella sottostante, puoi vedere che otteniamo il risultato che ci aspettiamo.
Ora proviamo ad analizzare come funziona quel codice DAX.
Nella misura, puoi vedere che prima abbiamo COUNTROWS, ma non è la prima funzione che viene valutata o eseguita. Quindi, abbiamo la funzione FILTRO e quindi TUTTI. La prima cosa nell'ordine di valutazione è di TUTTI. ALL restituisce tutti i valori univoci di Date Calendar Year Number ignorando qualsiasi contesto di filtro esistente al di fuori della funzione ALL.
Quindi, nelle metriche, abbiamo la colonna Numero dell'anno di calendario e sta attivamente filtrando quella colonna. Ma poiché ALL ignorerà il contesto del filtro esistente, otterremo tutti i valori univoci di quella colonna.
Nel secondo argomento, nel contesto della riga, abbiamo scritto che Dates Calendar Year Number deve essere minore di MAX Dates Calendar Year Number. Ora, se sei un principiante e stai ancora cercando di capire e imparare DAX, potresti pensare che entrambi i riferimenti sul lato sinistro e all'interno della funzione MAX appartengano alla stessa colonna e siano la stessa tabella che abbiamo all'interno della TUTTA la funzione.
Ma non è vero. L'unica parte del contesto di riga che appartiene alla funzione ALL è quella che abbiamo sul lato sinistro. Quello che abbiamo sul MAX viene valutato all'interno di un contesto di filtro e non nel contesto di riga.
Quindi, FILTER tenta di creare un contesto di riga sulla tabella fornita nel primo argomento e questa parte del codice viene effettivamente recuperata da quel particolare contesto di riga. Quindi ogni riga, FILTER itera quella tabella che abbiamo all'interno di ALL, e quindi siamo in grado di accedere a tutti i valori che stiamo attualmente iterando.
Quindi, nella prima iterazione, abbiamo un solo valore. Nella seconda iterazione, abbiamo il secondo valore. Ma quando scriviamo MAX, è indipendente dal contesto di riga che stiamo creando usando la funzione FILTER. Quindi MAX viene valutato nel contesto del filtro che viene creato dal numero dell'anno corrente che abbiamo utilizzato in quella matrice.
Quando siamo a 2006, MAX restituirà 2006 mentre la riga corrente può essere 2006, 2007 o 2008. FILTER restituirà la tabella che soddisfa i criteri che stiamo specificando nel secondo argomento. Quando passiamo al 2007, MAX restituirà 2007. Nel 2008, restituirà 2008. E a seconda di tutti i valori che sono inferiori al valore che viene restituito dalla funzione MAX, FILTER restituirà un tavolo.
Per dimostrare che MAX non dipende dal contesto della riga, possiamo segregare questo pezzo di codice DAX in diverse variabili. E poi, potremo capire che il riferimento della colonna sul lato sinistro e sul lato destro non è lo stesso.
Quindi, creiamo una variabile.
Come puoi vedere nella misura qui sotto, ho creato tre variabili ( ). Ho quindi aggiunto il codice FILTER infine con una variabile Result che utilizza COUNTROWS . Quando utilizzo questa misura nella tabella sottostante, vedrai che non cambia nulla. I risultati sono sempre gli stessi. Otteniamo ancora lo stesso totale parziale che stavamo ottenendo prima.
Se torniamo al codice e proviamo a recuperare il valore della prima variabile e lo confermiamo, puoi vedere che per ogni riga otteniamo lo stesso anno.
Quindi, si spera, sono stato in grado di spiegarti che la funzione MAX, in questo particolare codice, in realtà non dipende dal contesto reale per i suoi valori. E se vuoi semplificare la tua comprensione del contesto di valutazione, puoi sempre suddividere il codice in diverse variabili in modo da poter capire l'ordine di valutazione e come viene eseguito il codice.
Ora, voglio mostrarti uno scenario in cui la funzione MAX dipenderà dal contesto di riga creato dalla funzione FILTER.
Quindi, torniamo a quella misura. Duplichiamolo e, invece di Last Visible Year, avrò MAX Dates Calendar Year Number. Quando lo inserisco nella matrice, puoi vedere che otteniamo uno spazio vuoto.
Perché?
Il fatto è che stiamo iterando tutti gli anni e ciò che fa CALCULATE è che converte la riga attualmente iterata in un contesto di filtro equivalente.
Se scrivo un segno di uguale qui, puoi vedere che otteniamo sette, sette e sette.
Perché?
Lascia che crei una nuova tabella calcolata in modo che tu possa facilmente capire cosa sta succedendo.
Vado a creare una nuova tabella. Successivamente, scriverò sopra il numero dell'anno di calendario di TUTTE le date. Quindi, scriverò Max Year, e poi userò CALCULATE sopra il MAX del numero Date Calendar Year. E ora puoi vedere che per ogni riga ripetiamo lo stesso valore.
Poiché questi numeri non sono strettamente inferiori a se stessi, otteniamo uno spazio vuoto. Ma quando usiamo uguale a (=), stiamo dicendo che tutti i valori che sono inferiori a 2011 ottengono un sette.
Inoltre, anche se si utilizza un riferimento di misura come Max Year, questo codice non funzionerà.
Se faccio clic su conferma, puoi vedere che non otteniamo ancora nulla. Questo perché quando scriviamo Max Year, stiamo semplicemente scrivendo CALCULATE MAX Dates Calendar Year Number.
Un riferimento di misura ha sempre un CALCULATE al di fuori di esso. Pertanto, questa misura avvia una transizione di contesto che converte la riga attualmente iterata in un contesto di filtro.
Ma se sei vincolato e devi usare un riferimento di misura, quello che puoi fare è memorizzare quella misura in una variabile. E come forse saprai, le variabili sono costanti e non possono creare una transizione di contesto. Quindi non può convertire il contesto di riga in un contesto di filtro.
Si tratta quindi di una rapida dimostrazione di come un contesto di riga e un contesto di filtro interagiscono tra loro in un codice DAX.
Ora andiamo a DAX Studio per capire cosa sta succedendo dietro le quinte.
Uso di DAX Studio per comprendere il contesto della riga e il contesto del filtro
Andiamo agli strumenti esterni e lanciamo DAX Studio. Dobbiamo connetterci al file LuckyTemplates con l'aiuto di Query Plan e Server Timings .
Quindi, creerò una misura di query. Scriverò DEFINE MEASURE nella tabella Dates, Dates Running Total. E poi, userò il codice originale che avevamo.
Poiché dobbiamo restituire una tabella, possiamo scrivere EVALUATE. Infine, creeremo la tabella utilizzando SUMMARIZECOLUMNS. Quindi, scriveremo il numero dell'anno del calendario delle date e la colonna virtuale, che sarà il totale parziale. E poi, posso scrivere qualcosa come DT come parola chiave DAX Studio.
Se eseguo questo codice, puoi vedere che il codice è completo e otteniamo comunque lo stesso risultato che abbiamo visto all'interno di LuckyTemplates.
Passiamo ora al piano delle query per capire cosa sta succedendo dietro le quinte. Vediamo se la funzione MAX dipende effettivamente dal contesto della riga o meno. Andiamo al Query Plan logico perché il Query Plan fisico è generalmente più complesso ed è un po' difficile da leggere.
Puoi vedere che il primo operatore sulla prima riga è GroupSemiJoin e che viene utilizzato da SUMMARIZECOLUMNS per creare un giunto interno tra due colonne.
Quindi, per unire queste colonne, c'è Scan_Vertipaq , che è il motore di archiviazione che abbiamo all'interno dei servizi di analisi. Possiamo vedere che dice che abbiamo bisogno di una colonna, che è Date Calendar Year Number. In LuckyTemplates, puoi vedere che nella matrice abbiamo questa colonna Numero anno di calendario, che funge da accesso al nostro report.
Successivamente, abbiamo la funzione COUNTROWS nella nostra misura come operatore di primo livello, quindi COUNTROWS chiama la funzione FILTER per il filtro. C'è di nuovo un Scan_Vertipaq , che dice che RequiredCols è Dates Calendar Year Number.
Le righe 2 e 5 sono uguali, ma il primo Scan_Vertipaq è contrassegnato con zero mentre il secondo è con uno. Ciò significa che la colonna a cui stiamo accedendo, con l'aiuto della funzione ALL, viene estratta separatamente dalla colonna che abbiamo all'interno della funzione SUMMARIZECOLUMNS.
Quindi, c'è un operatore LessThan . Nella riga successiva, possiamo vedere che c'è un confronto tra il contesto di riga e la funzione MAX .
Questo è seguito da Max_Vertipaq . Quindi, stiamo effettivamente estraendo il valore Max dal motore di archiviazione. Verso destra, puoi vedere che dice DependOnCols Date Calendar Year Number. Questa è la cosa più importante che dobbiamo ricordare. In precedenza, ho detto che non esiste alcuna dipendenza della funzione MAX dal contesto della riga, e questo è ciò che effettivamente lo dimostra.
E così, qui dice zero.
Dove abbiamo trovato zero?
In alto (la seconda riga), che viene estratta per SUMMARIZECOLUMNS. Ciò significa che la funzione MAX non dipende dal contesto della riga, ma in realtà dipende dalla colonna (Calendar Year Number) che abbiamo all'interno di quella tabella. Quindi quella tabella sta effettivamente creando il contesto del filtro.
In breve, la funzione MAX dipende dal contesto del filtro e non dal contesto della riga.
Successivamente, puoi vedere che per calcolare Max_Vertipaq, abbiamo uno Scan_Vertipaq , che dice che DependOnCols zero (0) Date Calendar Year Number. E poi, ci sono molte altre colonne che richiedono colonne.
Ora diamo un'occhiata alla versione variabile del codice. Invece di restituire LastVisibleYear, restituirò la versione COUNTROWS o la variabile Result e puoi vedere che otteniamo ancora lo stesso risultato.
Se osserviamo il piano delle query, puoi vedere che è un po' più lungo, ma è molto più facile da leggere.
Infine, ecco anche la versione calcolata del codice
E questo è l'aspetto del suo Logical Query Plan.
DAX LuckyTemplates: cos'è il contesto di riga
Introduzione al contesto di filtro in LuckyTemplates
Cos'è la transizione del contesto e perché è importante?
Conclusione
In questo tutorial, ho spiegato come una data funzione può interagire e non può interagire con il contesto della riga. Ti ho anche mostrato come il MAX, in questo caso, è stato valutato nel contesto del filtro e non nel contesto della riga.
È importante ricordare sempre che il contesto del filtro filtra l'intero modello e il contesto della riga itera solo la tabella data e non filtra mai il modello. Il contesto del filtro non itera una tabella.
Spero che tu abbia trovato utile questo tutorial. Resta sintonizzato per il nostro codice DAX Studio che rilasceremo molto presto. Andremo molto più a fondo in scenari simili. Ti insegneremo anche come ottimizzare il tuo codice DAX.
Cos'è il sé in Python: esempi del mondo reale
Imparerai come salvare e caricare oggetti da un file .rds in R. Questo blog tratterà anche come importare oggetti da R a LuckyTemplates.
In questa esercitazione sul linguaggio di codifica DAX, scopri come usare la funzione GENERATE e come modificare dinamicamente il titolo di una misura.
Questo tutorial illustrerà come utilizzare la tecnica di visualizzazione dinamica multi-thread per creare approfondimenti dalle visualizzazioni di dati dinamici nei report.
In questo articolo, esaminerò il contesto del filtro. Il contesto del filtro è uno degli argomenti principali che qualsiasi utente di LuckyTemplates dovrebbe inizialmente conoscere.
Voglio mostrare come il servizio online di LuckyTemplates Apps può aiutare nella gestione di diversi report e approfondimenti generati da varie fonti.
Scopri come elaborare le modifiche al margine di profitto utilizzando tecniche come la ramificazione delle misure e la combinazione di formule DAX in LuckyTemplates.
Questo tutorial discuterà delle idee di materializzazione delle cache di dati e di come influiscono sulle prestazioni dei DAX nel fornire risultati.
Se finora utilizzi ancora Excel, questo è il momento migliore per iniziare a utilizzare LuckyTemplates per le tue esigenze di reportistica aziendale.
Che cos'è il gateway LuckyTemplates? Tutto quello che devi sapere