【问题标题】:Palantir Foundry Function - cumulative revenue analysisPalantir Foundry Function - 累计收入分析
【发布时间】:2022-01-07 02:38:06
【问题描述】:

我想写一个函数如下:

原始数据:

customer product revenue
Customer A Product 1 EUR 10
Customer A Product 2 EUR 10
Customer B Product 1 EUR 5
Customer B Product 2 EUR 2
Customer C Product 1 EUR 5

目标数据:

customer revenue cumulative revenue
Customer A EUR 20 EUR 20
Customer B EUR 7 EUR 27
Customer C EUR 5 EUR 32

我确切地知道如何在 PySpark 中做到这一点,但不熟悉带有功能的打字稿,因为我想在前端触发“即时”计算。

这是 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) ) )

您能告诉我如何编写那段功能代码吗?

【问题讨论】:

  • 嗨,很多来自 Palantir 的人经常回答这些问题,直到 EOY 才放假。如果在我们回来之前社区中没有人回答,那么我们会给你一个答案。避免关闭您的问题的一个好方法(我可以看到一个投票结束,因为“需要更多关注)是在 pyspark 中提供您希望在函数中看到的代码。
  • @fmsf:谢谢 - 这是来自 pyspark.sql 的 PySpark 代码 ''' 导入函数为 F,窗口为 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) ) ) '''

标签: typescript palantir-foundry


【解决方案1】:

Functions 目前不支持此工作流的快速简洁方式。 .groupBy().sum().segmentBy() 函数无法帮助您完成您正在尝试做的事情。

此外,我们有意将字符串(在您的情况下为 customer)上的分组结果数限制为 1000 个。

解决此问题的最佳方法是遍历原始数据的每一行,创建一个地图来跟踪自定义的收入和累积收入。

之后(如果我理解您想要正确执行的操作),您可以编辑每个计算收入所引用的对象,例如 data.revenue = newRevenue

获取代码示例,让您了解如何执行此操作:

interface CustomerRevenueData {
    revenue: Integer;
    cumulativeRevenue: Integer;
}

@Function()
public cumulativeRevenueAnalysis(): void {
    const data = Objects().search().initialDataObject().all();

    // The string key represents the customer name
    const customRevenueData = new FunctionsMap<string, CustomerRevenueData>();

   data.forEach(dataPoint => {
       // your logic here, updating the revenue/cumulative revenue for each customer you find
   })
}

【讨论】:

  • 您好,感谢您的代码。我可以根据您上面的建议找出代码。但是,我当前的数据有 > 100 万行,显然在这里执行 forEach 会导致 Functions on Foundry 超时。我到达平台的边缘了吗?
  • 视情况而定。您在哪个上下文中使用此功能?有什么方法可以计算结果,比如一次计算 200 个对象?
  • 基于@RyanArifin 的建议,3 种典型的实现方式: 1. 通过让用户选择特定的数据段(例如时间段/市场/客户类别),然后再应用该功能。 2. 创建一个附加的对象类型,该对象类型已经在一定程度上通过数据转换进行聚合,然后将该函数应用于该对象类型。 3. 让用户使用第一个函数预先计算一些聚合并将结果捕获到变量中。然后将这些变量用作第二个函数的输入。
  • 总体情况是,假设我们在全球拥有 500 万客户,我们希望能够说前 x% 的客户占 x% 的收入。我正在研究以下功能 - 1. 用户按各种维度过滤客户,可能低至 1 M,2. 用户查看图表,其中 x 轴是客户按收入递减的百分比,y 轴是他们的累积收入基于他们的选择动态。 3.基于该图表,用户应该能够在图表上过滤不同的百分位,并动态查看下面的客户表。
猜你喜欢
  • 2022-07-05
  • 2022-07-06
  • 2022-06-27
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
相关资源
最近更新 更多