如何将一年的所有日常数据转换为月度数据

时间:2016-04-29 11:45:04

标签: ruby-on-rails ruby ruby-on-rails-4

首先让我告诉你我想要什么,我想制作一个用户共同基金组合增长的图表。

现在我有一位用户去年投资了投资组合。

现在我有一个任务存储用户的所有日增长值 用户组合增长表中的投资组合。

截至当前日期,我在用户投资组合增长表中拥有投资组合增长的所有每日价值。

我想要的是在图表上显示用户投资组合的每月增长。

所以,我的问题是如何将所有每日价值转换为他投资日期的月度值?所以,我可以在图表上显示它。

UserPortfolio架构

# == Schema Information
#
# Table name: user_portfolios
#
#  id              :integer          not null, primary key
#  user_id         :integer          not null
#  portfolio_name  :string
#  amount          :integer          not null
#  investment_plan :string           not null
#  duration        :integer          default(1), not null
#  risk_level      :string           not null
#  created_at      :datetime         not null
#  updated_at      :datetime         not null

UserPortfolioGrowth

# == Schema Information
#
# Table name: user_portfolio_growths
#
#  id                :integer          not null, primary key
#  user_portfolio_id :integer
#  appreciated_value :float
#  created_at        :datetime         not null
#  updated_at        :datetime         not null
#

谢谢!

修改 我被问到Tin Man所做的事情: 所以,这是我迄今为止尝试过的演示。

最初我尝试过这种类型的代码:

start = 10.months.ago.to_date
end_date = Date.today
(start..end_date).each do |date|
  puts date.end_of_month
end 

我得到了一个巨大的结束日期列表,因为它在所有日期都是如此:

2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
............. and so on...

但是我想要的只是月份的最后一个日期,所以基本上如果我迭代超过10个月,我想要的只有10个值。 因此,我试图通过以下逻辑将指数提前30天。

start = 10.months.ago.to_date
end_date = Date.today
(start..end_date).each do |date|
  puts date.end_of_month
  date = date.end_of_month + 1.day
end

但我仍然得到以下输出:

2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
........................... and so on

我虽然增加索引值可能会改变结果,但事实并非如此。 请有人就此提出任何解决方案吗?

修改 我想我找到了答案,而不是在日期范围内进行迭代,我使用while循环来检查end_date的条件

这就是我所做的:

 start = 10.months.ago.to_date
    end_date = Date.today
    date_i = start
    while(date_i < end_date)
      puts date_i.end_of_month
      date_i = date_i + 1.month
    end

输出:

2015-07-31
2015-08-31
2015-09-30
2015-10-31
2015-11-30
2015-12-31
2016-01-31
2016-02-29
2016-03-31
2016-04-30

2 个答案:

答案 0 :(得分:1)

您需要做的是,您必须采取金额或投资的所有价值或您想要的一个月的任何价值。

现在添加它们。

并取平均值。

例如。我们采取当月

total_amount = UserPortfolio.where(created_at: (Date.today.beginning_of_month..Date.today.end_of_month)).pluck(:amount)
average_amount = total_amount.inject(0, :+)/total_amount.count

这将为您提供当月的平均值 同样,你可以获得全年的每一个月。

然后将其放入散列或数组中并在图形中显示它们。

答案 1 :(得分:1)

尝试:

> months_result = user_portfolio.user_portfolio_growths.group_by{|e| e.created_at.strftime('%B')}
> month_with_total = months_result.each{|month, data| [month, data.pluck(:appreciated_value).sum]}.to_h
#=> {"January" => 12546.00, "February" => 56487.00} something like this