【发布时间】:2014-04-01 22:17:21
【问题描述】:
我有一个大的哈希数组 (~5MB),我需要按滚动日期范围对其进行分组。
这是将数组转换为我正在寻找的滚动数据集的 Ruby 方法:
def rolling(options = {})
rolling_items = []
options[:date_range].each do |day|
start_date = rolling_start_date(day)
end_date = day
range = start_date..end_date
new_items = options[:data].select{|key, value| range.cover? Date.parse(key[:created].to_s)}.uniq { |h| h[:customer] }
amount = new_items.count
rolling_items.push({created: day, amount: amount})
end
rolling_items
end
这调用了一个rolling_start_date 方法,该方法需要给定的一天并吐出它的开始日期:
def rolling_start_date(end_date)
old = Time.utc(end_date.year, end_date.month, end_date.day)
previous = old - 1.month
if old.day > previous.day
start_date = previous + 1.day
else
start_date = old - 1.month + 1.day
end
start_date.to_date
end
我会调用 rolling 方法:rolling(date_range: Date.current.beginning_of_day-1.year..Date.current.end_of_day, data: customers)
这是gist of the huge array 的客户。在上面的调用中用于data。
所以rolling 方法然后循环遍历整个date_range 中的每一天并找到它的rolling_start_date,然后在这种情况下找到新日期范围内的哈希值并计算唯一客户并推送它到一个新的rolling_items 数组,所以我最终得到一个如下所示的数组:
[
{:created=>Fri, 21 Feb 2014, :amount=>2711},
{:created=>Sat, 22 Feb 2014, :amount=>2716},
{:created=>Sun, 23 Feb 2014, :amount=>2720},
{:created=>Mon, 24 Feb 2014, :amount=>2731},
{:created=>Tue, 25 Feb 2014, :amount=>2746},
{:created=>Wed, 26 Feb 2014, :amount=>2761},
{:created=>Thu, 27 Feb 2014, :amount=>2765},
{:created=>Fri, 28 Feb 2014, :amount=>2754},
...
]
...其中每个哈希是该日期范围内唯一客户的总数。
所以我需要弄清楚如何做仍然是获取每个滚动日期范围的唯一客户数量,而不需要循环 5MB 数组 365 次。
【问题讨论】:
-
有趣且表述清楚的问题。也许你可以打破
new_items = options...的行以避免需要水平滚动。 -
我的理解是否正确,
{:created=>Fri, 21 Feb 2014, :amount=>2711},表示您在上个月左右增加了 2711 个客户?如果是这种情况,是否将每个哈希值改为该日期的客户总数,然后根据需要计算差异以获得滚动值?