当前位置: 首页 > 知识库问答 >
问题:

Palantir打字稿顺序行和过滤器

姚晋
2023-03-14

我已经创建了一个函数,允许我通过groupby和聚合函数获得一个表。由于我分组的列有很多值,我想按行降序排序(按“百分比”列,由2列划分创建),然后只保留前5行。

我想在TypeScript中实现这一点,如果可能的话,可以将其附加到groupby函数下。

谢谢你!!!

输出示例:

代码示例:

export class funzione1 {
     @Function()
        public async test1(object1: ObjectSet<object1>):
            Promise<TwoDimensionalAggregation<string>> {
                const numerators = await object1.groupBy(e => e.column1.topValues())
                                        .sum(e => e.column2);
                const denominators = await object1.groupBy(e => e.column1.topValues())
                                        .sum(e => e.column3);
        return this.divideTwoDimensional(numerators, denominators);
    }

    private divideTwoDimensional(numerators:TwoDimensionalAggregation<string>,
                             denominators: TwoDimensionalAggregation<string>):
                             TwoDimensionalAggregation<string> {

        const percentage = numerators.buckets.map((bucket, i) => {
           const numerator = bucket.value;
           const denominator = denominators.buckets[i].value;
            if (denominator === 0) {
                return { key: bucket.key, value: 0 };
            }
            return { key: bucket.key, value: numerator / denominator }
        });

        return { buckets: percentage };
    }

共有2个答案

黄弘深
2023-03-14

您可以使用JavaScript按百分比对桶进行排序。带有自定义比较器的sort()函数。例如,这里的helper函数sortBucketsByValue2D使用它按桶的百分比值对桶进行排序:

import { Function, TwoDimensionalAggregation, BucketKey, BucketValue } from "@foundry/functions-api";
import { Objects, object1 } from "@foundry/ontology-api";

export class funzione1 {
    @Function()
    public async test1(object1: ObjectSet<object1>):
        Promise<TwoDimensionalAggregation<string>> {
        const numerators = await object1.groupBy(e => e.column1.topValues())
            .sum(e => e.column2);
        const denominators = await object1.groupBy(e => e.column1.topValues())
            .sum(e => e.column3);
        
        const withPercentage = divideTwoDimensional(numerators, denominators);
        return sortBucketsByValue2D(withPercentage, 'desc');
    }
}

const divideTwoDimensional = (
    numerators: TwoDimensionalAggregation<string>,
    denominators: TwoDimensionalAggregation<string>
): TwoDimensionalAggregation<string> => {
    const percentage = numerators.buckets.map((bucket, i) => {
        const numerator = bucket.value;
        const denominator = denominators.buckets[i].value;
        if (denominator === 0) {
            return { key: bucket.key, value: 0 };
        }
        return { key: bucket.key, value: numerator / denominator }
    });

    return { buckets: percentage };
}

/**
 * Sort buckets of a 2D aggregation by their value in the specified order
 * 
 * Example input 1:
 * { buckets: [
 *   { key: { min: "2022-01-01", max: "2022-12-31" }, value: 456 },
 *   { key: { min: "2021-01-01", max: "2021-12-31" }, value: 123 },
 *   { key: { min: "2023-01-01", max: "2023-12-31" }, value: 789 },
 * ]}
 * 
 * Example output 1:
 * { buckets: [
 *   { key: { min: "2021-01-01", max: "2021-12-31" }, value: 123 },
 *   { key: { min: "2022-01-01", max: "2022-12-31" }, value: 456 },
 *   { key: { min: "2023-01-01", max: "2023-12-31" }, value: 789 },
 * ]}
 * 
 * Example input 2:
 * { buckets: [
 *   { key: 17, value: 456 },
 *   { key: 21, value: 123 },
 *   { key: 23, value: 789 },
 * ]}
 * 
 * Example output 2:
 * { buckets: [
 *   { key: 21, value: 123 },
 *   { key: 17, value: 456 },
 *   { key: 23, value: 789 },
 * ]}
 */
function sortBucketsByValue2D<K extends BucketKey, V extends BucketValue>(
    buckets: TwoDimensionalAggregation<K, V>,
    order: 'asc' | 'desc' = 'asc'
): TwoDimensionalAggregation<K, V> {
    return {
        // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
        buckets: buckets.buckets.sort(({ value: v1 }, { value: v2 }) => {
            // These are be either numbers, timestamps or localdates which can be compared like this
            return (order === 'desc' ? -1 : 1) * (v1.valueOf() - v2.valueOf());
        }),
    };
}
濮阳烨然
2023-03-14

您可以使用百分比列表来实现这一点;它只是一个具有键/值结构的对象数组,如:

{
  key: "bucketKey",
  value: .5
}

因此,您可以像对任何其他对象列表一样对该对象列表进行排序。

类似地,排序后,可以使用本机数组切片方法返回数组的第一个元素。

如果在创建百分比数组和添加bucket对象的return语句之间执行此操作,则应该会得到所需的结果。

 类似资料:
  • 不论是客户端,还是服务器,都可以添加多个过滤器。假设我们按照添加的顺序把它们叫做 filter1, filter2, … filterN。那幺它们的执行顺序是这样的。 在客户端的执行顺序 +------------------- OutputFilter -------------------+ | +-------+ +-------+ +-------

  • 我在我的网络应用程序中偶然发现了一个错误,在我发现发生了什么之前,这个错误让我抓耳挠腮(最终扯了扯头发)。 基本上,我在我的网站上定义了两个过滤器。xml和两个类似的映射: 它们都是Spring MVC过滤器。我的问题是,我得到的表单数据没有被解释为UTF-8,尽管事实上编码过滤器应该在其他任何东西有机会从中读取之前将请求编码设置为UTF-8。 我最后注意到,表单方法过滤器在编码过滤器之前执行,尽

  • 问题内容: 我已经读过这个问题,我的一个同事让我感到怀疑: 在过滤查询中,何时应用过滤器?在执行查询之前还是之后?什么时候缓存结果? 如果事先应用了过滤器,那么在过滤器中复制查询部分不是一件好事吗?如果之后应用了筛选器,那么我将无法理解缓存的内容。 问题答案: 幸运的是,ES为您提供了两种类型的过滤器供您使用: 在第一种情况下,过滤器将应用于查询找到的所有文档。在第二种情况下,将在查询运行之前过滤

  • 我正在努力寻找 有什么不同?

  • 如果我有一个清单,比如说 我如何才能获得一个名字不同的年龄最大的学生名单?在C#中,使用system.linq GroupBy然后比较,然后用select进行扁平化,这将非常简单,我不太确定如何在Java中实现同样的功能。

  • 如何在Spring启动中指定过滤器的顺序?我需要在Spring Security过滤器之后插入我的MDC过滤器。我几乎尝试了一切,但我的过滤器总是第一位的。这不起作用: 这也不管用: