2016-04-29 2 views
1

Lassen Sie mich Ihnen zuerst sagen, was ich will, möchte ich ein Diagramm eines Wachstums eines Benutzers Investmentfonds Portfolio machen.Wie konvertiert man alle täglichen Daten eines Jahres in monatliche Daten

Jetzt habe ich einen Benutzer, der im letzten Jahr in ein Portfolio investiert.

Jetzt habe ich eine Aufgabe, die alle täglichen Wachstumswerte eines Benutzers Portfolio in Benutzerportfolio Wachstumstabelle speichert.

Jetzt ab dem aktuellen Datum habe ich alle täglichen Werte eines Portfolios Wachstum in meinem Benutzerportfolio Wachstumstabelle.

Was ich will, ist das monatliche Wachstum eines Benutzer-Portfolios in einem Diagramm zu zeigen.

Also, meine Frage hier ist, wie konvertiere ich alle Tageswerte zu monatlichen Werten vom Datum seiner Investition? Also, dass ich es in einem Diagramm zeigen kann.

UserPortfolio Schema

# == 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 
# 

Danke!

Edit: Ich wurde gebeten, für das, was ich von Tin Man tut hatte: Also, das ist Demo von dem, was ich bisher versucht hatte.

Inititally habe ich versucht, diese Art von Code:

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

, für die ich eine riesige Liste von Enddaten bekommen, wie es über alle Termine itterates:

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... 

Aber alles, was ich wollte, war apprictaed Betrag des letzten Datums des Monats, also wenn ich über 10 Monate iteriere, ist alles, was ich will, 10 Werte. Also habe ich versucht, den Index um 30 Tage im Voraus um die folgende Logik zu erhöhen.

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 

Aber noch bin ich immer die folgende Ausgabe:

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 

ich aber den Indexwert zu erhöhen könnte das Ergebnis ändern, aber es kam nicht. Kann mir bitte jemand eine Lösung vorschlagen?

Edit: Ich glaube, ich fand die Antwort, statt itterating über einen Datumsbereich, habe ich while-Schleife Zustand end_date

Dies zu überprüfen ist, was ich getan habe:

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 

Ausgang:

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 
+0

Schreiben eine SQL keine Option ist? Bitte geben Sie Ihre Tabelle und Modellstruktur an. – Uzbekjon

+0

getan, und es ist gut, auch wenn ich den letzten Wert jedes Monats vom Datum der Benutzerinvestition zu aktuellen Daten erhalten. – VoidZero

+0

Vorgeschlagene Antworten sind in Ordnung, aber Sie sollten das DB für Sie tun lassen. Auf diese Weise würden Sie Ressourcen sparen. Welche DB benutzen Sie? – Uzbekjon

Antwort

1

Was Sie tun müssen, ist, Sie müssen alle Werte von Betrag oder Investition oder was auch immer Sie von einem einzelnen Monat nehmen möchten.

Jetzt addieren sie.

und den Durchschnitt nehmen.

für zB. wir nehmen für aktuellen Monat

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 

Dies werden Sie für aktuellen Monat durchschnittlich ähnlich Sie für jeden Monat für ganzes Jahr erhalten können.

Dann legen Sie es in einen Hash oder ein Array und zeigen Sie sie in Grafik.

+0

Dies wird Ergebnis des aktuellen Monats geben nur –

+0

eigentlich wollte ich nicht den Durchschnitt, aber die Enddatum Menge von ein Monat. – VoidZero

+0

dann einfach (Date.today.end_of_month) anstelle von (Date.today.beginning_of_month..Date.today.end_of_month) –

1

Versuchen:

> 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 
+0

Anstatt Code auszugeben, erklären Sie, warum der Code nützlich ist und was er tut. Die Idee ist, auf eine Weise zu antworten, die nicht nur die unmittelbare Frage aufklärt, sondern sie auch nur löst. –

Verwandte Themen