给定一个文本元素数组,我想计算出现的次数并将它们作为带有文本键和整数值的子对象返回。(PostgreSQL 9.4)
情况 1 - 没有参考集
SELECT ARRAY['3G','2G','2G','3G','3G','3G','3G','4G']
Run Code Online (Sandbox Code Playgroud)
应该转化为
SELECT '{"2G": 2, "3G": 5, "4G": 1}'::jsonb
Run Code Online (Sandbox Code Playgroud)
案例 2 - 使用参考集
给定一组可能的条目ARRAY['2G','3G','4G'],返回的 json 还应包含计数为零的元素。
SELECT ARRAY['3G','2G','2G','3G','3G','3G','3G']
Run Code Online (Sandbox Code Playgroud)
应该转变为
SELECT '{"2G": 2, "3G": 5, "4G": 0}'::jsonb
Run Code Online (Sandbox Code Playgroud)
我通过使用非常接近案例 1 和 2
-- case 1
SELECT json_object( array_agg(r.a)::text[],array_agg(r.num)::text[] )
FROM (
SELECT a, count(a) as num
FROM unnest( ARRAY['3G','2G','2G','3G','3G','3G','3G','4G'] ) a
GROUP BY a ORDER BY a
) r;
--case 2
SELECT json_object( array_agg(r.ref)::text[],array_agg(r.num)::text[] )
FROM (
SELECT ref, count(a) as num
FROM …Run Code Online (Sandbox Code Playgroud) 我创建了一个数据帧并分组和聚合时间戳,为每个分组提供最小值和最大值,结果数据帧看起来像这个 DF 定义为病人 ID,时间戳我按病人 ID 对 DF 进行分组,然后我想获取最小值和最大值每个组的最大时间戳,我这样做了
bypatient_date = pd.DataFrame(byencounter.agg({'timestamp' : [np.min,np.max]})).reset_index())
patient_id timestamp
amin amax
0 19 3396-08-21 3396-08-25
1 99 2723-09-27 2727-03-17
2 3014 2580-12-02 2581-05-01
3 24581 3399-07-19 3401-04-13
Run Code Online (Sandbox Code Playgroud)
我正在尝试找出每个患者 ID 的最小值和最大值之间的差异,但在尝试访问时间戳 amin 和时间戳 amax 中的值时遇到问题有没有办法在不循环但使用内置 pandas 或 numpy 的情况下执行此操作
如何在对数(至少以二为底)编译时间(严格来说,以对数实例化数量)中定义聚合的数量?
我目前能做的就是在线性时间内实现期望的目标:
#include <type_traits>
#include <utility>
struct filler { template< typename type > operator type (); };
template< typename A, typename index_sequence = std::index_sequence<>, typename = void >
struct aggregate_arity
: index_sequence
{
};
template< typename A, std::size_t ...indices >
struct aggregate_arity< A, std::index_sequence< indices... >, std::__void_t< decltype(A{(indices, std::declval< filler >())..., std::declval< filler >()}) > >
: aggregate_arity< A, std::index_sequence< indices..., sizeof...(indices) > >
{
};
struct A0 {};
struct A1 { double x; };
struct A2 { int i; …Run Code Online (Sandbox Code Playgroud) 我有一个数据库查询,如:
SELECT
Foo,
Foo2,
some_calc as Bar,
some_other_calc as Bar2,
From
FooBar
-- some inner joins for the calcs
GROUP BY FOO
ORDER BY Bar DESC, Bar2 DESC;
Run Code Online (Sandbox Code Playgroud)
我想使用 order 查询按数据库排序,然后将FOOs组合在一起,以便第一个分组块包含FOO具有最大 Bar 的块。FOOs的第二个分组块包含秒最高的 Bar 等。
但这不起作用,因为 Postgres 不允许随机分组:
column "Bar" must appear in the GROUP BY clause or be used in an aggregate function.
我怎样才能解决这个问题?
示例数据和输出:
????????????????????????????
? FO ? Bar ? Bar 2 ?
????????????????????????????
? 6 ? 10 ? ?
? …Run Code Online (Sandbox Code Playgroud) 如何以方便的方式选择表中的所有列和聚合函数?
即说我有一个有 100 列的表,我想发送以下内容
SELECT Max(Columns 44), ALL OTHER COLUMNS
FROM zz
Group by ALL OTHER COLUMNS
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一个名为“myindex”的 ElasticSearch 索引,我将三种不同映射类型(人员、事件和供应商)的文档加载到其中...
curl -XPOST localhost:9200/myindex/person/_bulk --data-binary @../JSON_DATA/persons.json
curl -XPOST localhost:9200/myindex/event/_bulk --data-binary @../JSON_DATA/events.json
curl -XPOST localhost:9200/myindex/vendor/_bulk --data-binary @../JSON_DATA/vendors.json
Run Code Online (Sandbox Code Playgroud)
使用以下命令可以看到索引创建成功:
curl 'localhost:9200/_cat/indices?v'
Run Code Online (Sandbox Code Playgroud)
我可以使用以下命令成功列出所有映射类型:
curl -s -XGET 'http://localhost:9200/myindex/_mapping/?pretty'
Run Code Online (Sandbox Code Playgroud)
我的问题 - A 部分:如何获取显式命名索引(“myindex”)中每种映射类型的文档聚合/总数?换句话说,我想知道每种映射类型的文档数量。
注意:我尝试过curl -s -XGET 'http://localhost:9200/myindex/_count/?pretty',但它只返回所有映射类型的总计数,而不是每种映射类型的总计数。换句话说,它并没有细分县城海滩测绘类型。
我的问题 - B 部分:鉴于能够获取每种映射类型的文档聚合/总数,如何获取存储在显式命名索引(“myindex”)中的任何一种特定映射类型的聚合计数?换句话说,我想知道索引“myindex”下一种显式命名的映射类型(例如“事件”)的文档数量。
搜索界面中的一个常见问题是您想要返回一组结果,但可能想要返回有关所有文档的信息。(例如,我想查看所有红色衬衫,但想知道还有哪些其他颜色可供选择)。
这有时被称为“分面结果”或“分面导航”。Elasticsearch 参考中的示例在解释原因/方式方面非常清楚,因此我将其用作此问题的基础。
摘要/问题:看起来我可以为此同时使用后过滤器或全局聚合。它们似乎都以不同的方式提供完全相同的功能。它们可能有我看不到的优点或缺点?如果是这样,我应该使用哪个?
我在下面包含了一个完整的示例,其中包含一些文档和基于参考指南中示例的两种类型方法的查询。
选项 1:后置过滤器
我们可以做的是在我们的原始查询中获得更多结果,因此我们可以“对”这些结果进行聚合,然后过滤我们的实际结果。
这个例子很清楚地解释了它:
但也许您还想告诉用户有多少 Gucci 衬衫有其他颜色可供选择。如果你只是在颜色字段上添加一个术语聚合,你只会得到红色,因为你的查询只返回 Gucci 的红色衬衫。
相反,您希望在聚合期间包括所有颜色的衬衫,然后仅将颜色过滤器应用于搜索结果。
请参阅下面的示例代码中的内容。
一个问题是我们不能使用缓存。这是在(尚未适用于 5.1)elasticsearch 指南中警告:
性能考虑 仅当您需要对搜索结果和聚合进行差异过滤时才使用 post_filter。有时人们会使用 post_filter 进行常规搜索。
不要这样做!post_filter 的性质意味着它在查询之后运行,因此过滤(例如缓存)的任何性能优势都将完全丧失。
post_filter 应该仅与聚合结合使用,并且仅在需要差分过滤时使用。
然而,有一个不同的选择:
选项 2:全局聚合
有一种方法可以进行不受搜索查询影响的聚合。所以不是得到很多,聚合,然后过滤,我们只是得到我们过滤的结果,但对所有东西进行聚合。看看参考
我们可以得到完全相同的结果。我没有阅读任何关于缓存的警告,但似乎最终我们需要做同样多的工作。所以这可能是唯一的遗漏。
由于我们需要子聚合(您不能在同一“级别”上拥有global和 a )filter,因此它稍微复杂一点。
我读到的关于使用此查询的唯一抱怨是,如果您需要对多个项目执行此操作,则可能必须重复自己。最后,我们可以生成大多数查询,因此重复自己对我的用例来说并不是什么大问题,而且我并不认为这是与“无法使用缓存”同等的问题。
题
似乎这两个功能至少重叠,或者可能提供完全相同的功能。这让我很困惑。除此之外,我想知道其中一个或另一个是否有我没有看到的优势,以及这里是否有任何最佳实践?
例子
映射和文件
PUT /shirts
{
"mappings": {
"item": {
"properties": {
"brand": { "type": "keyword"},
"color": { "type": "keyword"},
"model": …Run Code Online (Sandbox Code Playgroud) 我是弹性搜索的新手。我试图获取一组文档的总词频计数,但我似乎无法在elasticsearch 中计算出来。我知道有一个使用聚合的文档计数功能。通过术语向量,我可以找到文档中术语的频率,但是如何找到一组文档中术语的总频率呢?
单个文档的术语向量:
GET /test/product/3/_termvector
Run Code Online (Sandbox Code Playgroud)
汇总文档数:
GET /test/product/_search?pretty=true
{
"size" : 0,
"query" : {
"match_all" : {}
},
"aggs" : {
"phrases" : {
"terms" : {
"field" : "title",
"size" : 10000
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我是第一次使用 Pandas,但在聚合方面遇到了一些问题。我有一个包含三个计算字段的数据框,由这样的应用语句添加:
dataset['calculated_field'] = dataset.apply(
lambda row: calculation_function(
row['field1'],
row['field2']
),
axis = 1
)
Run Code Online (Sandbox Code Playgroud)
计算字段是布尔值,但有一个问题。它们可以包含空值。
我试图找到布尔列的平均值,每个平均值都忽略该列的空字段。
我试过这样的事情:
resultset = dataset.groupby(['grouping_field'])[['calculated_field','calculated_field_2','calculated_field_3']].mean()
Run Code Online (Sandbox Code Playgroud)
问题在于,由于 True/False/None 布尔值是“对象”类型,pandas 将列完全作为“讨厌”列删除。.
但是,我无法将该列转换为 bool,因为它会使空值变为“False”
我还尝试了长路由并为每个聚合创建了 3 个单独的数据帧,因此我可以删除空值并转换为 bool(可以聚合):
dataset_for_field1 = dataset.dropna(subset = ['calculated_field']).copy()
dataset_for_field1['calculated_field'] = dataset_for_field1['calculated_field'].astype('bool')
result_for_field1 = dataset_for_field1.groupby(['grouping_field'])['calculated_field'].mean()
Run Code Online (Sandbox Code Playgroud)
这给了我我正在寻找的数据,但是在三个单独的数据框中。
有没有办法用每列的平均值获得一个数据框,而忽略空值?
我有一个data.frame看起来像这样的(但是有更多的列和行):
Gene Cell1 Cell2 Cell3
1 A 2 7 8
2 A 5 2 9
3 B 2 7 8
4 C 1 4 3
Run Code Online (Sandbox Code Playgroud)
我想对 中具有相同值的行进行求和Gene,以获得如下结果:
Gene Cell1 Cell2 Cell3
1 A 7 9 17
2 B 2 7 8
3 C 1 4 3
Run Code Online (Sandbox Code Playgroud)
根据之前问题的答案,我尝试使用aggregate但我无法理解如何获得上述结果。这是我尝试过的:
aggregate(df[,-1], list(df[,1]), FUN = sum)
Run Code Online (Sandbox Code Playgroud)
有人知道我做错了什么吗?