Source code for bw2analyzer.econ
import numpy as np
[docs]
def gini_coefficient(x):
"""
Return computed Gini coefficient.
See https://en.wikipedia.org/wiki/Gini_coefficient
Adapted from econpy library.
copyright: 2005-2009 Alan G. Isaac
license: MIT license
contact: aisaac AT american.edu
Args:
*x* (list or array): Data
Returns:
Gini coefficient (float)
"""
x = np.array(x)
x.sort()
y = np.cumsum(x)
length = float(x.shape[0])
B = y.sum() / (y[-1] * length)
return float(1.0 + 1 / length - 2 * B)
[docs]
def herfindahl_index(x, normalize=True):
"""
Return computed Herfindahl index.
See https://en.wikipedia.org/wiki/Herfindahl_index
Normalized scores are bounded [0, 1]; non-normalized scores are [1/len(x), 1]. Normalization only counts non-zero values.
Args:
*x* (list or array): Data
*normalize* (bool, default=True): Flag to normalize scores.
Returns:
Herfindahl index (float)
"""
# Normalize so that total is 1
x = np.array(x) / np.sum(x)
index = (x ** 2).sum()
if normalize:
correction = 1 / (x != 0).sum()
index = (index - correction) / (1 - correction)
return float(index)
[docs]
def concentration_ratio(x, number=4):
"""
Return computed concentration ratio.
See https://en.wikipedia.org/wiki/Concentration_ratio
The concentration ratio measures the share of the market controlled by the top *number* firms. Returned ratio values vary from 0 to 1.
Args:
*x* (list or array): Data
*number* (int, default=4): Number of values to consider. 4 and 8 are commonly used.
Returns:
Concentration ratio (float)
"""
# Normalize so that total is 1
x = np.array(x) / np.sum(x)
x.sort()
return float(x[-number:].sum())
[docs]
def theil_index(x):
"""
Return Theil entropy index.
See https://en.wikipedia.org/wiki/Theil_Index
The Theil index is a measure of economic inequality based on information theory. It is the difference between a dataset's maximum possible entropy and observed entropy.
Args:
*x* (list or array): Data
Returns:
Theil index (float)
"""
x = np.array(x).copy()
# Have to filter values because of log transform
x = np.abs(x[x != 0])
average, n = np.average(x), x.shape[0]
return float(1 / n * ((x / average) * np.log(x / average)).sum())