Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Find everything you need to get certified on Fabric—skills challenges, live sessions, exam prep, role guidance, and more. Get started

Reply
FabioBeka
Frequent Visitor

¿Cómo puedo hacer referencia a una salida de consulta (estocástica) solo sin volver a ejecutar la consulta original?

Tengo un gran problema y no puedo encontrar una solución.

Estoy implementando algunos algoritmos de aprendizaje automático a través de una secuencia de comandos de Python dentro de una consulta de PowerQuery para analizar un csv de datos.

Necesito encadenar la salida (solo) de esta consulta (consulta original) a otra consulta (consulta derivada) para un análisis posterior, y necesito tener las consultas originales y derivadas como tablas en un informe.

El problema es que, el script de la consulta original, utiliza algunas funciones estocásticas ( muestreo aleatorio y modelos de ML estocásticos) por lo que los resultados de la consulta cambian en cada ejecución y nunca son los mismos.

Cuando intento hacer referencia a otra consulta sobre el resultado del script, las dos consultas no tienen los mismos resultados, probablemente porque la consulta derivada, no simplemente copia los valores de la consulta original, sino que vuelve a ejecutar la consulta original también, y esto no me permite usarlas dentro de un informe, ya que están presentando 2 conjuntos diferentes de resultados.

¿Hay alguna manera de hacer referencia solo a la salida de una consulta, o de tratar una consulta como una vista o una tabla estática, y evitar volver a ejecutar todo el conjunto de instrumentos y scripts dentro de la consulta original?

Un ejemplo fácil que cualquiera puede replicar, aquí geneo una trama de datos aleatoria con este código python;

importar numpy como np
importar pandas como pd

X-pd. DataFrame(por ejemplo, random.randint(0,10,(3,3)))

Como puede ver, si hago referencia a la consulta con script, la tabla derivada es diferente porque vuelve a ejecutar el script y no simplemente copia los valores.

FabioBeka_0-1608298169812.png

FabioBeka_1-1608298262147.png

10 REPLIES 10
AlB
Super User
Super User

@PhilipTreacy @FabioBeka

Ayer vi que si usamos @PhilipTreacysolución con el argumento [dataset .... ] en Python.Execute, entonces deja de funcionar y los números generados son nuevos en cada paso dentro de la misma consulta . Obviamente no necesitamos ese argumento aquí, pero me sorprendió bastante el gran cambio. ¿Alguna idea?

let
    Initial = #table({"Col1"},{{1}}),
    Source = Python.Execute("import numpy as np#(lf)import pandas as pd#(lf)#(lf)X=pd.DataFrame(np.random.randint(0,10,(3,3)))", [dataset=#"Initial"]),
    X1 = Source{[Name="X"]}[Value],
    #"Changed Type" = Table.TransformColumnTypes(X1,{{"0", Int64.Type}, {"1", Int64.Type}, {"2", Int64.Type}}),
    Py = Table.FromColumns(Table.ToColumns(#"Changed Type"))
in
    Py

Por favor, marque la pregunta resuelta cuando haya terminado y considere dar un pulgar hacia arriba si las publicaciones son útiles.

Póngase en contacto conmigo de forma privada para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.

Salud

SU18_powerbi_badge

FabioBeka
Frequent Visitor

He estado usando PowerBI por sólo 3 semanas, estoy lejos de ser un experto, pero mi suposición es, cuando cargamos datos de powerquery probablemente tiene algún sistema incorporado que actualiza la fuente, mientras que cuando lo hacemos desde Python se sale de su alcance.

Porque en este punto la única razón por la que puedo ver de por qué vuelve a ejecutar la consulta es que es para volver a cargar el origen de datos, en Python tal vez hemos omitido eso.

PhilipTreacy
Super User
Super User

No @FabioBeka

Entonces, ¿leer el csv con Python y luego usar este problema?

Py = Table.FromColumns(Table.ToColumns(#"Changed Type"))

saludos

Phil



Did I answer your question? Then please mark my post as the solution.
If I helped you, click on the Thumbs Up to give Kudos.


Blog :: YouTube Channel :: Connect on Linkedin


Proud to be a Super User!


Si leo el csv dentro de la secuencia de comandos python, en realidad funciona incluso sin el

    Py = Table.FromColumns(Table.ToColumns(#"Changed Type"))

Sin embargo, su ejemplo me hizo pensar que el problema estaba probablemente en el argumento del conjunto de datos del script:

let
    Source = "",
    #"Run Python script" = Python.Execute("# 'dataset' holds the input data for this script#(lf)import numpy as np#(lf)import pandas as pd#(lf)#(lf)df=pd.read_csv(r""C:\...\file.csv"",sep=';')#(lf)X=df.sample(n=100)"),
    X = #"Run Python script"{[Name="X"]}[Value],
    #"Changed Type" = Table.TransformColumnTypes(X,{{"CustomerID", type text}, {"Assignments", Int64.Type}, {"Recency", Int64.Type}, {"Frequency", Int64.Type}, {"Monetary", Int64.Type}})
in
    #"Changed Type"

PhilipTreacy
Super User
Super User

No @AlB

¿No estás seguro, tal vez para hacer con la evaluación perezosa? Después de crear la copia de la tabla de salida de Python y, a continuación, se usa como resultado de la consulta, PBI/PQ se calcula que no necesita hacer referencia a los pasos anteriores para proporcionar esos datos, por lo que el código python no se vuelve a ejecutar.

Salud

Phil



Did I answer your question? Then please mark my post as the solution.
If I helped you, click on the Thumbs Up to give Kudos.


Blog :: YouTube Channel :: Connect on Linkedin


Proud to be a Super User!


AlB
Super User
Super User

@PhilipTreacy

Eso es interesante. ¿Alguna idea de por qué funciona haciéndolo así?

Por favor, marque la pregunta resuelta cuando haya terminado y considere dar un pulgar hacia arriba si las publicaciones son útiles.

Póngase en contacto conmigo de forma privada para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.

Salud

SU18_powerbi_badge

PhilipTreacy
Super User
Super User

No @FabioBeka

Esto funcionó para mí. Cree una copia de la tabla de resultados de Python y utilela como resultado de la consulta.

let
    Source = Python.Execute("import numpy as np#(lf)import pandas as pd#(lf)#(lf)X=pd.DataFrame(np.random.randint(0,10,(3,3)))"),
    X1 = Source{[Name="X"]}[Value],
    #"Changed Type" = Table.TransformColumnTypes(X1,{{"0", Int64.Type}, {"1", Int64.Type}, {"2", Int64.Type}}),
    Py = Table.FromColumns(Table.ToColumns(#"Changed Type"))
in
    Py

A continuación, puede hacer referencia a la salida de esta consulta sin volver a ejecutar la secuencia de comandos de Python.

saludos

Phil


Si respondí a su pregunta por favor marque mi post como la solución.
Si mi respuesta ayudó a resolver su problema, déle un kudos haciendo clic en Thumbs Up.



Did I answer your question? Then please mark my post as the solution.
If I helped you, click on the Thumbs Up to give Kudos.


Blog :: YouTube Channel :: Connect on Linkedin


Proud to be a Super User!


Muchas gracias, esto resolvió parcialmente el problema, de hecho funciona en este caso de ejemplo.

Pero luego traté de aplicarlo al caso real, en el que cargo un csv de datos a través de PowerQuery, y por lo tanto el paso De origen lee un csv y en el paso de la secuencia de comandos de Python hay un argumento "[dataset-Source]", en este caso el problema persiste incluso si desmaro la opción "Habilitar carga", vuelve a ejecutar la consulta original y todas las funciones estocásticas dan resultados diferentes.


Origen: Csv.Document(File.Contents("C:....-file.csv"), [Delimitador",", Columnas,9, Codificación,1252, QuoteStyle,QuoteStyle.None]),

...

"Ejecutar secuencia de comandos de Python" ? Python.Execute("' 'dataset' contiene los datos de entrada para este script (lf) s(lf)importar pandas como pd -(lf)importar numpy como np -(lf)-(lf)DF-dataset.sample(n-100)",[dataset-"Changed Type"]),

Pero también noté que puedo omitir esto leyendo el csv directamente dentro de la secuencia de comandos de Python (pd.read_csv()) en lugar de establecerlo como el origen a través de PowerQuery, dejando el origen en blanco, (Source'') y sin ningún argumento [dataset-Source] en la secuencia de comandos de Python.

Fuente "",
"Ejecutar secuencia de comandos de Python" - Python.Execute ("' 'dataset' contiene los datos de entrada para este script (lf)import numpy como np -(lf)import pandas como pd-(lf)-(lf)-(lf)df-pd.read_csv(r""C:-...-archivo.csv"",sep-';') •(lf)X-df.sample(n-100)"),

mahoneypat
Employee
Employee

No he probado esta sugerencia, pero aquí hay otra configuración para explorar. Puede generar ambas tablas dentro de la misma consulta (es decir, como dos variables independientes, en el último paso tenerlas en forma de tabla en columnas o filas independientes). Deshabilite la carga en esa tabla, pero luego haga referencia a ella dos nuevas consultas donde puede expandir cada tabla por separado. Si desmarca la carga paralela y actualiza todo, puede obtener el resultado deseado.

saludos

palmadita





Did I answer your question? Mark my post as a solution! Kudos are also appreciated!

To learn more about Power BI, follow me on Twitter or subscribe on YouTube.


@mahoneypa HoosierBI on YouTube


AlB
Super User
Super User

No @FabioBeka

Interesante. Me temo que no funcionará con la referencia a la consulta original. La secuencia de comandos de Python se ejecutará de nuevo. Mira esto: https://social.technet.microsoft.com/Forums/en-US/8d5ee632-fdff-4ba2-b150-bb3591f955fb/queries-evalu...

Podrías:

1. Ejecute la secuencia de comandos de Python fuera de PQ, en lugar de tener PQ invocarla directamente y simplemente lea los valores estáticos en PQ o

2. Trabaje con ambas tablas (y realice todo el procesamiento) en la misma consulta. Algo así como:

let
    Source = "",
    #"Run Python script" = Python.Execute("import numpy as np#(lf)import pandas as pd#(lf)#(lf)X=pd.DataFrame(np.random.randint(0,10,(3,3)))#(lf)"),
    #"Expanded Value" = Table.ExpandTableColumn(#"Run Python script", "Value", {"0", "1", "2"}, {"Col0", "Col1", "Col2"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded Value",{"Name"}),
    Table1_ = #"Removed Columns",
    Table2_ = Table1_ 
in
    Table2_

Puede trabajar en Table1_ y Table2_ desde el último paso, dentro de la misma consulta

Tal vez estas personas bien informados tienen otras ideas @ImkeF@edhans@Jimmy801@mahoneypat @PhilipTreacy

Por favor, marque la pregunta resuelta cuando haya terminado y considere dar un pulgar hacia arriba si las publicaciones son útiles.

Póngase en contacto conmigo de forma privada para obtener asistencia con cualquier necesidad de BI a gran escala, tutoría, etc.

Salud

SU18_powerbi_badge

Helpful resources

Announcements
Fabcon_Europe_Social_Bogo

Europe’s largest Microsoft Fabric Community Conference

Join the community in Stockholm for expert Microsoft Fabric learning including a very exciting keynote from Arun Ulag, Corporate Vice President, Azure Data.

Power BI Carousel June 2024

Power BI Monthly Update - June 2024

Check out the June 2024 Power BI update to learn about new features.

RTI Forums Carousel3

New forum boards available in Real-Time Intelligence.

Ask questions in Eventhouse and KQL, Eventstream, and Reflex.

Top Solution Authors