按组查找最近的日期和输出值

Posted

技术标签:

【中文标题】按组查找最近的日期和输出值【英文标题】:Find the most recent date and output value by group 【发布时间】:2018-07-20 18:14:09 【问题描述】:

我只想显示每个组的最新值。

以下 CSV 示例:肉桂葡萄干品种的百吉饼总量是在三个不同的采样期收集的:2017 年 5 月、2017 年 3 月和 2016 年 11 月,它们的数量分别为:300、100 和 20。

我已经获取了年份和月份,将它们组合起来,并将它们转换为数字格式,这样我就可以执行 d3.max 来定位最近(最高)的值。最高的是 42856(2017 年 5 月),但我想显示金额(300)而不是 d3.max 金额。

breakfastItem,gluten,breakfastItemType,month,year,dateCode,value
Bagel,Yes,Cinnamon Raisin,May,2017,42856,300
Bagel,Yes,Cinnamon Raisin,March,2017,42795,100
Bagel,Yes,Cinnamon Raisin,November,2016,42675,20
Bagel,Yes,Blueberry,February,2017,42767,50
Bagel,Yes,Blueberry,November,2016,42675,30
Bagel,Yes,Blueberry,March,2016,42430,100
Bagel,Yes,Plain,February,2018,43132,200
Bagel,Yes,Plain,December,2017,43070,202
Bagel,Yes,Plain,February,2016,42401,201

这是我的 javascript

d3.csv("Breakfast.csv",function(data) 
        data.forEach(function(d)
            d.value = +d.value;
            d.year = +d.year;
            d.dateCode = +d.dateCode;
        );

        var breakfastCombinations = d3.nest()
        .key(function(d) return d.breakfastItem; )
        .key(function(d) return d.breakfastItemType; )
        .rollup(function(oldestDate)  
            return d3.max(oldestDate, function(d) 
                return d.dateCode; );
            )
        .entries(data);
        document.getElementById("breakfastjson").innerhtml = JSON.stringify(breakfastCombinations,false,2); 

    );

将我的 JSON 弹出为

 
    "key": "Bagel",
    "values": [
      
        "key": "Cinnamon Raisin",
        "value": 42856
      ,
      
        "key": "Blueberry",
        "value": 42767
      ,
      
        "key": "Plain",
        "value": 43132
      
    ]
  

但我希望“价值”是该类型百吉饼的总量,而不是 dateCode。像这样:

  
    "key": "Bagel",
    "values": [
      
        "key": "Cinnamon Raisin",
        "value": 300
      ,
      
        "key": "Blueberry",
        "value": 50
      ,
      
        "key": "Plain",
        "value": 200
      
    ]
  

我想使用此 dateCode 来识别要显示的许多不同信息(如月、年等)的信息。我试过这样的组合:

        .rollup(function(oldestDate)  
        return d3.max(oldestDate, function(d) 
            return d.dateCode; ).value;
        )

        .rollup(function(oldestDate)  
        return d3.max(oldestDate, function(d) 
            return d.dateCode.value; );
        )

但我似乎找不到正确的语法来显示它。救命!

【问题讨论】:

【参考方案1】:

你只需要对对象数组oldestDate进行排序,得到第一个的value属性,它是最高的:

.rollup(function(oldestDate) 
    return oldestDate.sort(function(a, b) 
        return b.dateCode - a.dateCode
    )[0].value
);

这里是演示:

var csv = `breakfastItem,gluten,breakfastItemType,month,year,dateCode,value
Bagel,Yes,Cinnamon Raisin,May,2017,42856,300
Bagel,Yes,Cinnamon Raisin,March,2017,42795,100
Bagel,Yes,Cinnamon Raisin,November,2016,42675,20
Bagel,Yes,Blueberry,February,2017,42767,50
Bagel,Yes,Blueberry,November,2016,42675,30
Bagel,Yes,Blueberry,March,2016,42430,100
Bagel,Yes,Plain,February,2018,43132,200
Bagel,Yes,Plain,December,2017,43070,202
Bagel,Yes,Plain,February,2016,42401,201`;

var data = d3.csvParse(csv, function(d) 
  d.value = +d.value;
  d.year = +d.year;
  d.dateCode = +d.dateCode;
  return d;
);

var breakfastCombinations = d3.nest()
  .key(function(d) 
    return d.breakfastItem;
  )
  .key(function(d) 
    return d.breakfastItemType;
  )
  .rollup(function(oldestDate) 
    return oldestDate.sort(function(a, b) 
      return b.dateCode - a.dateCode
    )[0].value
  )
  .entries(data);

console.log(breakfastCombinations)
<script src="https://d3js.org/d3.v4.min.js"></script>

【讨论】:

效果很好,这正是我所需要的。谢谢!

以上是关于按组查找最近的日期和输出值的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 在查找前一行时按组迭代数据帧

熊猫:按组计算唯一的日期时间值会给出奇怪的值

无法按组解决字谜?

按组和列之间查找最小值

查找最大值并按 id 为非数字字段按组分配值

如何在mysql中按组查找累积值?