Triple media móvil exponencial en Power Query M

Un usuario Pregunto ✅

¡Hola! Necesito ayuda para crear una media móvil exponencial triple en Power Query M. Ya sé cómo hacerlo en Excel, y recientemente recibí una excelente ayuda de @Fowmy crear una media móvil exponencial en Query. He intentado repetir «Step3» en el código M a continuación, sin embargo, el primer valor no debe ser el primer valor en la columna «EMA». Se supone que es # 15 de fila de la columna EMA como el primer valor -> 0.483628093 (ver captura de pantalla). Esta EMA sería la columna «EMA2». La tercera columna sería «EMA3», y su primer valor sería fila # 22 (7 días EMAs). Con estos 3 EMAs, la columna final sería TEMA, y esto debería ser simple ya que la fórmula es (3 * EMA1) – (3 * EMA2) + EMA3. También se incluye un enlace a una hoja de cálculo de Excel de ejemplo que muestra un TEMA y cómo se supone que debe calcularse.

let
    Source = Excel.Workbook(File.Contents("C:UsersxyzDesktopematest.xlsx"), null, true),
    Sheet1_Sheet = Source{[Item="Sheet1",Kind="Sheet"]}[Data],
    #"Promoted Headers" = Table.PromoteHeaders(Sheet1_Sheet, [PromoteAllScalars=true]),
    #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Date", type date}, {"rand", type number}}),
    Step1 = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1, Int64.Type),
  Step2 = Table.AddColumn(
    Step1,
    "Average",
    each if [Index] > 6 then List.Average(List.Range(Step1[rand], _[Index] - 7, 7)) else null
  , type number),
  Step3 = Table.AddColumn(
    Step2,
    "EMA",
    each
      if [Index] > 6 then
        let
          start = List.First(List.RemoveNulls(Step2[Average])),
          vlist = List.Range(Step2[rand], 8, _[Index] - 7),
          acc = List.Accumulate(
            vlist,
            start,
            (state, current) => (current - state) * (2 / (1 + 7)) + state
          )
        in
          if [Index] = 7 then start else acc
      else
        null,
  type number ),
  Step4 = Table.AddColumn(
    Step3,
    "EMA2",
    each
      if [Index] > 13 then
        let
          start = List.First(List.RemoveNulls(Step3[EMA])),
          vlist = List.Range(Step3[EMA], 15, _[Index] - 7),
          acc = List.Accumulate(
            vlist,
            start,
            (state, current) => (current - state) * (2 / (1 + 7)) + state
          )
        in
          if [Index] = 14 then start else acc
      else
        null,
  type number )
in
    Step4

image_2021-06-24_225219.png

madre.xlsx

Gracias por la ayuda!

Hay @jsflint,

La lógica parece ser un poco compleja que puede reducir el rendimiento de Power Query.

En este caso, se probará directamente al archivo de Excel.

Consulte:

Procedimientos recomendados al trabajar con Power Query | Documentos de Microsoft

¡Mira tus pasos! Precaución de rendimiento de Power Query para Power BI

Guía completa del ajuste del rendimiento de Power BI: aprendizaje de SQLGene

Saludos
Eyelyn Qin
Si este post ayudaentonces por favor considere Aceptarlo como la solución para ayudar a los otros miembros a encontrarlo más rápidamente.

En respuesta a Syndicate_Admin

Estoy tratando de evitar hacer los cálculos en Excel, luego vincular a él porque luego me requerirá actualizar manualmente la hoja de cálculo para actualizar el informe. Necesito el informe activo para conectarse y, a continuación, hacer que Power Query realice los cálculos para los EMAs y TEMA.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *