将pandas聚合转换为elasticsearch

mjqavswn  于 2023-05-06  发布在  ElasticSearch
关注(0)|答案(1)|浏览(147)

bounty还有5天到期。回答此问题可获得+50声望奖励。Irene Hawkins正在寻找一个答案从一个有信誉的来源

我试图做一个汇总,需要显示拥有不少于10家餐馆和至少有100票餐馆的城市,并找出平均成本最高的7个城市
我知道如何在pandas中做到这一点,具体方法如下:

import pandas as pd
import numpy as np

df_filtered = df[df.groupby('City')['RestaurantName'].transform('nunique') >= 10]
df_filtered = df_filtered[df_filtered['Votes'] >= 100]

df_city_avg = df_filtered.groupby('City')['AverageCostForTwo'].mean().reset_index()
df_top_cities = df_city_avg.sort_values(by='AverageCostForTwo', ascending=False).head(7)

但是我不确定我如何在弹性中执行这种聚合,任何建议或想法都将是非常有帮助的,我对此有点迷失。
我的数据看起来是这样的:Data

r7knjye2

r7knjye21#

下面可能是Elasticsearch中聚合的解决方案。在这里,它将返回两个平均成本最高的前7个城市,每个城市至少有10家餐厅,每个餐厅至少有100张选票。

{
  "query": {
    "bool": {
      "must": [
        {"range": {"Votes": {"gte": 100}}},
        {"terms": {"City.keyword": {"size": 10, "min_doc_count": 10}}}
      ]
    }
  },
  "aggs": {
    "cities": {
      "terms": {"field": "City.keyword"},
      "aggs": {
        "avg_cost": {
          "avg": {"field": "AverageCostForTwo"},
          "order": {"_avg": "desc"}
        }
      }
    }
  },
  "size": 0,
  "sort": [{"cities>avg_cost": {"order": "desc"}}],
  "size": 7
}

相关问题