#!/usr/bin/env python
# -*- coding: utf-8 -*-
# This file is part of the
# Apode Project (https://github.com/ngrion/apode).
# Copyright (c) 2020, Néstor Grión and Sofía Sappia
# License: MIT
# Full Text: https://github.com/ngrion/apode/blob/master/LICENSE.txt
# =============================================================================
# DOCS
# =============================================================================
"""Welfare measures for Apode."""
# =============================================================================
# IMPORTS
# =============================================================================
import attr
import numpy as np
# =============================================================================
# FUNCTIONS
# =============================================================================
[docs]@attr.s(frozen=True)
class WelfareMeasures:
"""Welfare Measures.
The following welfare measures are implemented:
- utilitarian : Utilitarian utility function
- rawlsian : Rawlsian utility function
- isoelastic : Isoelastic utility function
- sen : Sen utility function
- theill : Theill utility function
- theilt : Theilt utility function
Parameters
----------
method : String
Welfare measure.
**kwargs
Arbitrary keyword arguments.
"""
idf = attr.ib()
def __call__(self, method=None, **kwargs):
"""Return the ApodeData object."""
method = "utilitarian" if method is None else method
method_func = getattr(self, method)
return method_func(**kwargs)
[docs] def utilitarian(self):
"""Utilitarian utility function.
The utilitarian utility function.
Return
------
out: float
Utility value.
"""
y = self.idf.data[self.idf.income_column].values
return np.mean(y)
[docs] def rawlsian(self):
"""Rawlsian utility function.
The rawlsian utility function.
Return
------
out: float
Utility value.
"""
y = self.idf.data[self.idf.income_column].values
return np.min(y)
[docs] def isoelastic(self, alpha):
"""Isoelastic utility function.
The isoelastic utility function.
Return
------
out: float
Utility value.
"""
y = self.idf.data[self.idf.income_column].values
if alpha == 0:
return np.mean(y)
elif alpha == np.Inf:
return np.min(y)
elif alpha == 1:
return (1 / len(y)) * np.sum(np.log(y))
return (1 / len(y)) * np.sum(np.power(y, 1 - alpha)) / (1 - alpha)
[docs] def sen(self):
"""Sen utility function.
The Sen utility function.
Return
------
out: float
Utility value.
"""
y = self.idf.data[self.idf.income_column].values
u = np.mean(y)
g = self.idf.inequality.gini()
return u * (1 - g)
[docs] def theill(self):
"""Theil L utility function.
The Theil L utility function.
Return
------
out: float
Utility value.
"""
y = self.idf.data[self.idf.income_column].values
u = np.mean(y)
tl = self.idf.inequality.entropy(alpha=0)
return u * np.exp(-tl)
[docs] def theilt(self):
"""Theil T utility function.
The Theil T utility function.
Return
------
out: float
Utility value.
"""
y = self.idf.data[self.idf.income_column].values
u = np.mean(y)
tt = self.idf.inequality.entropy(alpha=1)
return u * np.exp(-tt)