Gold goal: switch to dynamic goal

Previously the goal was simply a static amount, this changes it so that
it is set to 110% of the average revenue from the previous 7 days
(disregarding highest and lowest revenues). To prevent too large of
swings due to "spikes", the goal is restricted to no more than a 20%
change from the previous day's goal.
This commit is contained in:
Chad Birch
2013-11-06 20:18:03 -07:00
committed by Neil Williams
parent 9a135ac379
commit c4e3c9fa35
2 changed files with 35 additions and 3 deletions

View File

@@ -34,6 +34,7 @@ from r2.models.gold import (
gold_payments_by_user,
gold_received_by_user,
days_to_pennies,
gold_goal_on,
gold_revenue_on,
)
from r2.models.promo import (
@@ -4285,10 +4286,12 @@ class Goldvertisement(Templated):
revenue_today = gold_revenue_on(today)
yesterday = today - datetime.timedelta(days=1)
revenue_yesterday = gold_revenue_on(yesterday)
revenue_goal = g.live_config["gold_revenue_goal"]
revenue_goal = gold_goal_on(today)
revenue_goal_yesterday = gold_goal_on(yesterday)
self.percent_filled = int((revenue_today / revenue_goal) * 100)
self.percent_filled_yesterday = int((revenue_yesterday / revenue_goal) * 100)
self.percent_filled_yesterday = int((revenue_yesterday /
revenue_goal_yesterday) * 100)
self.hours_paid = ServerSecondsBar.current_value_of_month()
self.time_left_today = timeuntil(end_time, precision=60)
Templated.__init__(self)

View File

@@ -24,7 +24,7 @@ from r2.lib.db.tdb_sql import make_metadata, index_str, create_table
from pylons import g, c
from pylons.i18n import _
from datetime import datetime
from datetime import datetime, timedelta
import sqlalchemy as sa
from sqlalchemy.exc import IntegrityError, OperationalError
from sqlalchemy.ext.declarative import declarative_base
@@ -48,6 +48,7 @@ from r2.models.wiki import WikiPage
from r2.lib.memoize import memoize
gold_bonus_cutoff = datetime(2010,7,27,0,0,0,0,g.tz)
gold_static_goal_cutoff = datetime(2013, 11, 7, tzinfo=g.display_tz)
ENGINE_NAME = 'authorize'
@@ -455,3 +456,31 @@ def gold_revenue_on(date):
.where(sa.func.date_trunc('day', gold_table.c.date) == date))
rows = ENGINE.execute(query)
return rows.fetchone()[0] or 0
@memoize("gold-goal")
def gold_goal_on(date):
"""Returns the gold revenue goal (in pennies) for a given date."""
# handle the old static goal
if date <= gold_static_goal_cutoff.date():
return g.live_config["gold_revenue_goal"]
# fetch the revenues from the previous 7 days
previous_date = date - timedelta(days=1)
previous_revenues = []
while previous_date >= date - timedelta(days=7):
previous_revenues.append(gold_revenue_on(previous_date))
previous_date -= timedelta(days=1)
# throw out highest and lowest values and set goal to 110% of average
previous_revenues = sorted(previous_revenues)[1:-1]
average_revenue = sum(previous_revenues) / float(len(previous_revenues))
goal = average_revenue * 1.1
# don't let this be more than 20% different from the previous goal
previous_goal = gold_goal_on(date - timedelta(days=1))
goal = min(previous_goal * 1.2, goal)
goal = max(previous_goal * 0.8, goal)
return round(goal, 0)