Skip to content

Commit

Permalink
update tests
Browse files Browse the repository at this point in the history
  • Loading branch information
lepy committed Apr 17, 2018
1 parent 5eafa30 commit 10330a5
Show file tree
Hide file tree
Showing 6 changed files with 222 additions and 14 deletions.
75 changes: 72 additions & 3 deletions README.md
Expand Up @@ -9,13 +9,21 @@
[![saythanks.io/to/lepy](https://img.shields.io/badge/Say%20Thanks-!-1EAEDB.svg)](https://saythanks.io/to/lepy)
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.1219617.svg)](https://doi.org/10.5281/zenodo.1219617)


* python representation of fuzzy numbers|data
* specify uncertainty easily

# Usage

To use phuzzy in a project:

## phuzzy.Triangle

p = phuzzy.Triangle(alpha0=[1,4], alpha1=[2], number_of_alpha_levels=5)

p.df

alpha low high
alpha l r
0 0.00 1.00 4.0
1 0.25 1.25 3.5
2 0.50 1.50 3.0
Expand All @@ -30,7 +38,7 @@

p.df

alpha low high
alpha l r
0 0.00 1.00 4.00
1 0.25 1.25 3.75
2 0.50 1.50 3.50
Expand All @@ -45,7 +53,7 @@

p.df

alpha low high
alpha l r
0 0.000000 1.000000 3.000000
1 0.071429 1.234184 2.765816
2 0.142857 1.342402 2.657598
Expand All @@ -63,3 +71,64 @@
14 1.000000 2.000000 2.000000

![](doc/truncnorm.png)

## phuzzy.TruncGenNorm

import phuzzy.mpl as phm
tgn = phm.TruncGenNorm(alpha0=[1, 4], alpha1=[2, 3], number_of_alpha_levels=15, beta=3.)
tgn.plot(show=False, filepath="truncgennorm.png", title=True)

![](doc/truncgennorm.png)

## phuzzy.Superellipse

import phuzzy.mpl as phm
se = phm.Superellipse(alpha0=[-1, 2.], alpha1=None, m=1.0, n=.5, number_of_alpha_levels=17)
se.plot(show=True, filepath="superellipse.png", title=True)

![](doc/superellipse.png)

## Addition

x = phuzzy.Trapezoid(alpha0=[0, 4], alpha1=[2, 3], number_of_alpha_levels=5)
y = phuzzy.TruncNorm(alpha0=[1, 3], number_of_alpha_levels=15, name="y")
z = x + y
z.name = "x+y"

![](docs/operations/x+y.png)

## Substaction

x = phuzzy.Trapezoid(alpha0=[0, 4], alpha1=[2, 3], number_of_alpha_levels=5)
y = phuzzy.TruncNorm(alpha0=[1, 3], number_of_alpha_levels=15, name="y")
z = x - y
z.name = "x-y"

![](docs/operations/x-y.png)

## Multiplication

x = phuzzy.Trapezoid(alpha0=[0, 4], alpha1=[2, 3], number_of_alpha_levels=5)
y = phuzzy.TruncNorm(alpha0=[1, 3], number_of_alpha_levels=15, name="y")
z = x * y
z.name = "x*y"

![](docs/operations/x_mul_y.png)

## Division

x = phuzzy.Trapezoid(alpha0=[0, 4], alpha1=[2, 3], number_of_alpha_levels=5)
y = phuzzy.TruncNorm(alpha0=[1, 3], number_of_alpha_levels=15, name="y")
z = x / y
z.name = "x/y"

![](docs/operations/x:y.png)

## Power

x = phuzzy.Trapezoid(alpha0=[0, 4], alpha1=[2, 3], number_of_alpha_levels=5)
y = phuzzy.TruncNorm(alpha0=[1, 3], number_of_alpha_levels=15, name="y")
z = x ** y
z.name = "x^y"

![](docs/operations/x_pow_y.png)
2 changes: 2 additions & 0 deletions phuzzy/mpl.py
Expand Up @@ -83,6 +83,8 @@ def plot(self, ax=None, filepath=None, show=False, xlim=None, labels=True, title
if show is True:
plt.show()

return fig

class Uniform(phuzzy.Uniform, MPL_Mixin):
"""Uniform fuzzy number with matplotlib mixin"""
def __init__(self, **kwargs):
Expand Down
49 changes: 40 additions & 9 deletions phuzzy/shapes/__init__.py
Expand Up @@ -255,19 +255,21 @@ def import_csv(self, fh):
if isinstance(fh, str):
fh = open(fh, "r")

self.df = pd.DataFrame.from_csv(fh)
print(self.df.head())
# self.df = pd.DataFrame.from_csv(fh)
self.df = pd.read_csv(fh)
# print(self.df.head())
return self.df

def export_csv(self, filepath):
def export_csv(self, filepath=None):
"""export alpha levels to csv
:param filepath: csv file path
:return:
"""
logger.info("export df '%s'" % filepath)
if self.df is not None:
self.df.to_csv(filepath)
res = self.df.to_csv(filepath)
return res

@classmethod
def from_data(cls, **kwargs):
Expand All @@ -278,7 +280,26 @@ def from_data(cls, **kwargs):
:return: fuzzy number
"""

p = cls(**kwargs)
n = kwargs.get("n", 100)
data = kwargs.get("data")
data = np.asarray(data)
kwargs["alpha0"] = [data.min(), data.max()]
# means = []
# mean = 3 * data.mean() - data.min() - data.max()
mean = data.mean()
# means.append(mean)
# # print("!", mean)
# for _ in range(n):
# train_data = np.random.choice(data, int(len(data) * 50))
#
# mean = 3 * train_data.mean() - train_data.min() - train_data.max()
# means.append(mean)
#
# mean = np.array(means).mean()
kwargs["alpha1"] = [mean]
p = Triangle(**kwargs)
# print("!!", mean)

return p

def __str__(self):
Expand Down Expand Up @@ -381,22 +402,26 @@ def from_data(cls, **kwargs):

n = kwargs.get("n", 100)
data = kwargs.get("data")
data = np.asarray(data)
kwargs["alpha0"] = [data.min(), data.max()]
data = np.asarray(data, float)
datamin = data.min()
datamax = data.max()
kwargs["alpha0"] = [datamin, datamax]
means = []
mean = 3 * data.mean() - data.min() - data.max()
mean = 3 * data.mean() - datamin - datamax
means.append(mean)
# print("!", mean)
for _ in range(n):
train_data = np.random.choice(data, int(len(data) * 50))

mean = 3 * train_data.mean() - train_data.min() - train_data.max()
# mean = 3 * train_data.mean() - train_data.min() - train_data.max()
mean = 3 * train_data.mean() - (train_data.min() + datamin) / 2 - (train_data.max()+datamax) / 2
means.append(mean)

mean = np.array(means).mean()
kwargs["alpha1"] = [mean]
p = cls(**kwargs)
print("!!", mean)
print("!!", data)

return p

Expand All @@ -405,6 +430,7 @@ def pdf(self, x):
a = self._a
b = self._b
c = self._c
x = np.asarray(x)
condlist = [x <= self._a, x <= self._c, x == c, x < self._b, x >= self._b]
choicelist = [0.,
2. * (x - a) / (b - a) / (c - a),
Expand All @@ -424,6 +450,7 @@ def cdf(self, x, **kwargs):
a = self._a
b = self._b
c = self._c
x = np.asarray(x)
condlist = [x <= self._a, x <= self._c, x < self._b, x >= self._b]
choicelist = [0.,
(x - a) ** 2 / (c - a) / (b - a),
Expand Down Expand Up @@ -479,6 +506,7 @@ def pdf(self, x):
b = self._b
c = self._c
d = self._d
x = np.asarray(x)
condlist = [x <= self._a, x <= self._b, x <= self._c, x < self._d, x >= self._d]
choicelist = [0.,
2. / (c + d - a - b) * (x - a) / (b - a),
Expand All @@ -499,6 +527,7 @@ def cdf(self, x, **kwargs):
b = self._b
c = self._c
d = self._d
x = np.asarray(x)
condlist = [x <= self._a, x <= self._b, x <= self._c, x < self._d, x >= self._d]
choicelist = [0.,
(x - a) ** 2 / (c + d - a - b) / (b - a),
Expand Down Expand Up @@ -544,6 +573,7 @@ def pdf(self, x):
"""https://en.wikipedia.org/wiki/Uniform_distribution_(continuous)"""
a = self._a
b = self._b
x = np.asarray(x)
condlist = [x <= self._a, x < self._b, x >= self._b]
choicelist = [0.,
1. / (b - a),
Expand All @@ -560,6 +590,7 @@ def cdf(self, x, **kwargs):

a = self._a
b = self._b
x = np.asarray(x)
condlist = [x <= self._a, x < self._b, x >= self._b]
choicelist = [0.,
(x - a) / (b - a),
Expand Down
78 changes: 78 additions & 0 deletions tests/test_fuzzy_number.py
@@ -1,5 +1,9 @@
# -*- coding: utf-8 -*-

import pytest
import phuzzy
import numpy as np
from io import StringIO

def test_fuzzy():
n = phuzzy.FuzzyNumber()
Expand All @@ -9,6 +13,16 @@ def test_fuzzy():
assert hasattr(n, "df")
assert hasattr(n, "number_of_alpha_levels")

t = phuzzy.FuzzyNumber.from_data(data=[1,3,5], number_of_alpha_levels=3)
print(t.df)
assert len(t.df) == 3
print(t.__class__.__name__)
s = t.to_str()
print(s)
pdf = t.pdf([2])
print(pdf)
cdf = t.pdf([2])
print(cdf)

def test_triangle():
t = phuzzy.Triangle(alpha0=[1, 3], alpha1=[2], number_of_alpha_levels=15)
Expand All @@ -20,6 +34,12 @@ def test_triangle():
print(t.get_01())
print(t.df.columns)
assert all([x==y for x, y in zip(sorted(t.df.columns), sorted(["alpha", "l", "r"]))])
s = t.to_str()
print(s)
pdf = t.pdf([2])
print(pdf)
cdf = t.pdf([2])
print(cdf)


def test_trapezoid():
Expand All @@ -30,6 +50,13 @@ def test_trapezoid():
print(len(p.df))
assert len(p.df) == 5
print(p.get_01())
p.discretize(alpha0=[1, 4], alpha1=[2, 3], alpha_levels=5)
s = p.to_str()
print(s)
pdf = p.pdf([2])
print(pdf)
cdf = p.pdf([2])
print(cdf)


def test_uniform():
Expand All @@ -39,6 +66,57 @@ def test_uniform():
print(p.to_str())
print(p.get_01())

s = p.to_str()
print(s)
assert s=="Uniform[1,4]"
# p2 = phuzzy.Uniform.from_str(s)
# print(p2.alpha0)
# assert p2.alpha0

def test_from_str():
with pytest.raises(NotImplementedError) as exp:
p2 = phuzzy.FuzzyNumber.from_str("WTF")
print(p2.alpha0)

def test_unify():
x = phuzzy.Uniform(alpha0=[1, 4], number_of_alpha_levels=5)
y = phuzzy.Trapezoid(alpha0=[1, 4], alpha1=[2, 3], number_of_alpha_levels=7)
a, b = x._unify(y)
assert len(a.df) == 7
assert len(b.df) == 7

def test_discretize():
x = phuzzy.FuzzyNumber(alpha0=[1, 4], number_of_alpha_levels=5)
with pytest.raises(NotImplementedError) as exp:
x.discretize(alpha0=[1, 4], alpha1=[2, 3], alpha_levels=10)

def test_import_export():
y = phuzzy.Trapezoid(alpha0=[1, 4], alpha1=[2, 3], number_of_alpha_levels=7)
e = y.export_csv()
print(e)

fh = StringIO(e)
fh.seek(0)

z = phuzzy.FuzzyNumber(alpha0=[1, 4], alpha1=[2, 3], number_of_alpha_levels=2)
z.import_csv(fh)
assert len(z.df) == 7

def test_from_data():
x = phuzzy.FuzzyNumber.from_data(data=[1,3,5], number_of_alpha_levels=3)
print(x.df)
assert len(x.df) == 3
print(x.__class__.__name__)

y = phuzzy.FuzzyNumber.from_data(data=[1,2,5]+[2]*1000, number_of_alpha_levels=3)
print(y.df)
assert len(y.df) == 3
print(x.__class__.__name__)

y = phuzzy.Triangle.from_data(data=[1,2,5]+[2]*1000, number_of_alpha_levels=3)
print(y.df)
assert len(y.df) == 3
print(x.__class__.__name__)

if __name__ == '__main__':
test_fuzzy()

0 comments on commit 10330a5

Please sign in to comment.