使用核心数据聚合每日平均值,移动平均线

Posted

技术标签:

【中文标题】使用核心数据聚合每日平均值,移动平均线【英文标题】:Aggregating daily avgs using Core Data, moving averages 【发布时间】:2016-04-25 22:05:09 【问题描述】:

我有一个实体,它有一个“金额”属性和一个“日期”属性。我有很多这样的实体,一天中有多个。我想提供一个每日平均金额,比如一个月的时间。

我了解如何使用聚合函数获取每日金额的平均值。但我不明白如何返回数据集中所有日期的每日平均值列表。

似乎必须有比每天创建一个获取请求更好的方法?也许我必须以某种方式使用子查询?

(相关但不同,我还想计算一个移动平均线,这样我就可以返回一个 20 天的移动平均数。在这种情况下,一个平均值列表,每个是当天的 20 天平均值)

【问题讨论】:

【参考方案1】:

Core Data 不是数据库。您可以在数据库中做一些需要在 Core Data 中编写代码的事情(从技术上讲,您也需要在数据库中编写代码)。这是您需要编写代码的情况。

因此,您可以每天获取并让商店计算平均值,也可以检索您感兴趣的所有数据并在内存中计算每日平均值。

每天进行一次提取会减少代码,但会更慢,因为您需要每天访问商店一次。

在内存中进行一次提取和计算会更快,但会占用更多代码。

就我个人而言,我会从商店中获取所有相关数据,然后遍历谓词并让谓词计算每天的平均值。

【讨论】:

嗨,马库斯。谢谢你的评论。看起来你在 Core Data 方面有很多经验,所以如果你能查看我发布的答案并在发现问题时发表评论,我将不胜感激。 有效吗?如果是这样,那么您不需要我的确认 :) 由于您能够调整数据模型和传入数据,因此您比原始问题暗示的灵活性更大,并且您找到了更清洁的解决方案。干得好:)【参考方案2】:

所以,似乎对数据集稍作改动,这确实是可能的。但是,至少对于这个解决方案,您需要负责您的数据集。

我添加了一个属性“dateDay”,它是一个整数,表示从锚日期到我的实体中的“日期”属性的天数。 (见Number of days between two NSDates)

然后您按“dateDay”分组并使用“平均:”NSExpression。 NSExpression 聚合在使用 groupBy 时对组进行操作。

NSExpression* ex = [NSExpression expressionWithFormat:@"average:(amount)"];
NSExpressionDescription* ed = [[NSExpressionDescription alloc] init];
ed.name = @"result";
ed.expression = ex;
ed.expressionResultType = NSInteger32AttributeType;

NSFetchRequest* request = [[NSFetchRequest alloc] initWithEntityName:@"Transaction"];
request.resultType = NSDictionaryResultType;
request.propertiesToFetch = @[@"dateDay", ed];
request.propertiesToGroupBy = @[@"dateDay"];

NSError     * error             = nil;
NSArray     * resultsArray      = [context executeFetchRequest:request error:&error];

虽然 propertiesToGroupBy 被记录为采用 NSExpression,但它似乎无法执行计算,因此传递 NSExpression 以将 NSDate 减少到可以分组的组件是行不通的。因此需要额外的属性。

【讨论】:

以上是关于使用核心数据聚合每日平均值,移动平均线的主要内容,如果未能解决你的问题,请参考以下文章

熊猫移动平均线[重复]

将线性拟合估计为移动平均线

如何计算postgres的指数移动平均线?

简单移动平均线加权移动平均线指数平滑移动平均

MACD 指标

移动平均线计算不正确