es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Función de Palantir Foundry: análisis acumulativo de ingresos.

Me gustaría escribir una función que haga lo siguiente:

Datos sin procesar:

cliente | producto | ingreso
| ——– | ————– |—— |
Cliente A | Producto 1 | EUR 10
Cliente A | Producto 2 | EUR 10
Cliente B | Producto 1 | EUR 5
Cliente B | Producto 2 | EUR 2
Cliente C | Producto 1 | EUR 5

Datos objetivo:

cliente | ingreso | ingreso acumulativo
| ——– | ————– |—— |
Cliente A | EUR 20 | EUR 20
Cliente B | EUR 7 | EUR 27
Cliente C | EUR 5 | EUR 32

Sé exactamente cómo hacer eso en PySpark pero no estoy familiarizado con TypeScript con funciones, ya que quiero activar el cálculo “sobre la marcha” en el front end.

Aquí está el código de PySpark:

from pyspark.sql import functions as F, window as W
window = W.Window.partitionBy(F.col("helper")).orderBy(F.col("net_revenue").desc())
df = ( df .groupby("customer") .agg( F.sum("net_revenue").alias("net_revenue") ) .withColumn('helper', F.lit(1)) .withColumn( "cumulative_revenue", F.sum("net_revenue").over(window) ) )

¿Puede indicarme cómo puedo escribir esa parte del código de la función?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para lograr la funcionalidad deseada en TypeScript, puedes escribir una función que tome los datos sin procesar como argumento y devuelva los datos deseados. Aquí tienes un ejemplo de función utilizando TypeScript:

    interface RawData {
      customer: string;
      product: string;
      revenue: number;
    }
    
    interface TargetData {
      customer: string;
      revenue: number;
      cumulativeRevenue: number;
    }
    
    function transformData(rawData: RawData[]): TargetData[] {
      const groupedData = rawData.reduce((acc, curr) => {
        acc[curr.customer] = (acc[curr.customer] || 0) + curr.revenue;
        return acc;
      }, {});
    
      const targetData: TargetData[] = Object.entries(groupedData).map(([customer, revenue], idx, arr) => {
        const cumulativeRevenue = arr.slice(0, idx + 1).reduce((acc, [_, revenue]) => acc + revenue, 0);
        return {
          customer,
          revenue,
          cumulativeRevenue,
        };
      });
    
      return targetData;
    }
    

    Aquí tienes cómo puedes utilizar esta función:

    const rawData = [
      { customer: 'Customer A', product: 'Product 1', revenue: 10 },
      { customer: 'Customer A', product: 'Product 2', revenue: 10 },
      { customer: 'Customer B', product: 'Product 1', revenue: 5 },
      { customer: 'Customer B', product: 'Product 2', revenue: 2 },
      { customer: 'Customer C', product: 'Product 1', revenue: 5 },
    ];
    
    const targetData = transformData(rawData);
    
    console.log(targetData);
    
    // Salida:
    // [
    //   { customer: 'Customer A', revenue: 20, cumulativeRevenue: 20 },
    //   { customer: 'Customer B', revenue: 7, cumulativeRevenue: 27 },
    //   { customer: 'Customer C', revenue: 5, cumulativeRevenue: 32 },
    // ]
    

    La función transformData toma un arreglo de objetos que representan los datos sin procesar. Primero agrupa los datos por cliente utilizando el método reduce. Luego utiliza el método map para transformar los datos en el formato deseado. Para cada cliente y su ingreso, calcula el ingreso acumulativo de todos los clientes anteriores utilizando nuevamente reduce.

    Esta función debería ser capaz de realizar la transformación deseada en el frontend.

Comments are closed.