gpt4 book ai didi

Java:对两个或多个时间序列求和

转载 作者:搜寻专家 更新时间:2023-10-31 20:08:37 25 4
gpt4 key购买 nike

我有多个时间序列:

       x
| date | value |
| 2017-01-01 | 1 |
| 2017-01-05 | 4 |
| ... | ... |

y
| date | value |
| 2017-01-03 | 3 |
| 2017-01-04 | 2 |
| ... | ... |

令人沮丧的是,在我的数据集中,两个系列中的日期并不总是匹配的。对于缺少一个的情况,我想使用最后一个可用日期(如果没有,则为 0)。例如 2017-01-03我会用 y=3x=1 (从日期前)得到 output = 3 + 1 = 4

我有以下形式的每个时间序列:

class Timeseries {
List<Event> x = ...;
}

class Event {
LocalDate date;
Double value;
}

并将它们读入 List<Timeseries> allSeries

我想我也许可以使用流对它们求和

List<TimeSeries> allSeries = ...
Map<LocalDate, Double> byDate = allSeries.stream()
.flatMap(s -> s.getEvents().stream())
.collect(Collectors.groupingBy(Event::getDate,Collectors.summingDouble(Event::getValue)));

但这不会有我上面提到的缺少日期逻辑。

我还能怎样做到这一点? (不一定要按流)

最佳答案

我会说您需要为适当的查询功能扩展 Timeseries 类。

class Timeseries {
private SortedMap<LocalDate, Integer> eventValues = new TreeMap<>();
private List<Event> eventList;

public Timeseries(List<Event> events) {
events.forEach(e -> eventValue.put(e.getDate(), e.getValue());
eventList=new ArrayList(events);
}
public List<Event> getEvents() {
return Collections.unmodifiableList(eventList);
}

public Integer getValueByDate(LocalDate date) {
Integer value = eventValues.get(date);
if (value == null) {
// get values before the requested date
SortedMap<LocalDate, Integer> head = eventValues.headMap(date);
value = head.isEmpty()
? 0 // none before
: head.get(head.lastKey()); // first before
}
return value;
}
}

然后合并

Map<LocalDate, Integer> values = new TreeMap<>();
List<LocalDate> allDates = allSeries.stream().flatMap(s -> s.getEvents().getDate())
.distinct().collect(toList());

for (LocalDate date : allDates) {
for (Timeseries series : allSeries) {
values.merge(date, series.getValueByDate(date), Integer::ad);
}
}

编辑:实际上,NavigableMap 接口(interface)在这种情况下更有用,它使丢失数据成为可能

Integer value = eventValues.get(date);
if (value == null) {
Entry<LocalDate, Integer> ceiling = eventValues.ceilingKey(date);
value = ceiling != null ? eventValues.get(ceiling) : 0;
}

关于Java:对两个或多个时间序列求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49130555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com