Skip to content
Snippets Groups Projects
Commit 067f2964 authored by Vincent Texier's avatar Vincent Texier
Browse files

refs #335 Fix wrong ZSUM values calculation

UD(t) is included in the monetary mass M(t) so we can only use it on M(t-1) to calculate relative values.

Formulae for ZSUM values :

        t = last UD block
        t-1 = penultimate UD block
        M = Monetary mass
        N = Members count

        Q0  value = value - ( M(t-1) / N(t) )
        R0 value = (value / UD(t)) - (( M(t-1) / N(t) ) / UD(t))
parent 8eaec0a0
No related branches found
No related tags found
No related merge requests found
......@@ -30,14 +30,21 @@ class QuantitativeZSum:
"""
Return quantitative value of amount minus the average value
t = last UD block
t-1 = penultimate UD block
M = Monetary mass
N = Members count
zsum value = value - ( M(t-1) / N(t) )
:param int amount: Value
:param sakia.core.community.Community community: Community instance
:return: int
"""
ud_block = yield from self.community.get_ud_block()
if ud_block and ud_block['membersCount'] > 0:
monetary_mass = yield from self.community.monetary_mass()
average = monetary_mass / ud_block['membersCount']
ud_block_minus_1 = yield from self.community.get_ud_block(1)
if ud_block_minus_1 and ud_block['membersCount'] > 0:
average = ud_block_minus_1['monetaryMass'] / ud_block['membersCount']
else:
average = 0
return self.amount - average
......
......@@ -29,17 +29,23 @@ class RelativeZSum:
"""
Return relative value of amount minus the average value
t = last UD block
t-1 = penultimate UD block
M = Monetary mass
N = Members count
zsum value = (value / UD(t)) - (( M(t-1) / N(t) ) / UD(t))
:param int amount: Value
:param sakia.core.community.Community community: Community instance
:return: float
"""
ud_block = yield from self.community.get_ud_block()
if ud_block and ud_block['membersCount'] > 0:
monetary_mass = yield from self.community.monetary_mass()
dividend = yield from self.community.dividend()
median = monetary_mass / ud_block['membersCount']
relative_value = self.amount / float(dividend)
relative_median = median / dividend
ud_block_minus_1 = yield from self.community.get_ud_block(1)
if ud_block_minus_1 and ud_block['membersCount'] > 0:
median = ud_block_minus_1['monetaryMass'] / ud_block['membersCount']
relative_value = self.amount / float(ud_block['dividend'])
relative_median = median / ud_block['dividend']
else:
relative_value = self.amount
relative_median = 0
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment