Skip to main content

Compute the Pareto (non-dominated) set, i.e., skyline operator/query.

Project description

paretoset Build Status PyPI version Downloads Black

Compute the Pareto (non-dominated) set, i.e., skyline operator/query.

There are two common ways to optimize a function of several variables:

  • Scalarization combines objectives by a weighted sum: this gives a linear ordering and single a minimum value.
  • The Pareto set contains efficient (non-dominated) solutions: this gives a partial ordering and a set of minimal values.

The disadvantage of scalarization is that objectives must be weighted a priori. The Pareto set contains every value that could be obtained by scalarization, but also values possibly not found by scalarization.

Examples - Skyline queries for data analysis and insight

Hotels that are cheap and close to the beach

In the database context, the Pareto set is called the skyline and computing the Pareto set is called a skyline query. The folllowing example is from the paper "The Skyline Operator" by Börzsönyi et al.

Suppose you are going on holiday and you are looking for a hotel that is cheap and close to the beach. These two goals are complementary as the hotels near the beach tend to be more expensive. The database system is unable to decide which hotel is best for you, but it can at least present you all interesting hotels. Interesting are all hotels that are not worse than any other hotel in both dimensions. You can now make your final decision, weighing your personal preferences for price and distance to the beach.

Here's an example showing hotels in the Pareto set.

from paretoset import paretoset
import pandas as pd

hotels = pd.DataFrame({"price": [50, 53, 62, 87, 83, 39, 60, 44], 
                       "distance_to_beach": [13, 21, 19, 13, 5, 22, 22, 25]})
mask = paretoset(hotels, sense=["min", "min"])
paretoset_hotels = hotels[mask]

Top performing salespeople

Suppose you wish to query a database for salespeople that might be eligible for a raise. To find top performers (low salary, but high sales) for every department:

from paretoset import paretoset
import pandas as pd

salespeople = pd.DataFrame(
    {
        "salary": [94, 107, 67, 87, 153, 62, 43, 115, 78, 77, 119, 127],
        "sales": [123, 72, 80, 40, 64, 104, 106, 135, 61, 81, 162, 60],
        "department": ["c", "c", "c", "b", "b", "a", "a", "c", "b", "a", "b", "a"],
    }
)
mask = paretoset(salespeople, sense=["min", "max", "diff"])
top_performers = salespeople[mask]

Example - Pareto efficient solutions in multiobjective optimization

Suppose you wish to query a database for salespeople that might be eligible for a raise. To find top performers (low salary, but high sales) for every department:

from paretoset import paretoset
import numpy as np
from collections import namedtuple

# Create Solution objects holding the problem solution and objective values
Solution = namedtuple("Solution", ["solution", "objective_values"])
solutions = [Solution(solution=object, objective_values=np.random.randn(2)) for _ in range(999)]

# Create an array of shape (solutions, objectives) and compute the non-dominated set
objective_values_array = np.vstack([s.objective_values for s in solutions])
mask = paretoset(objective_values_array, sense=["min", "max"])

# Filter the list of solutions, keeping only the non-dominated solutions
efficient_solutions = [solution for (solution, m) in zip(solutions, mask) if m]

Installation

The software is available through GitHub, and through PyPI. You may install the software using pip.

pip install paretoset

Contributing

You are very welcome to scrutinize the code and make pull requests if you have suggestions and improvements. Your submitted code must be PEP8 compliant, and all tests must pass.

Performance

The graph below shows how long it takes to compute the Pareto set. Gaussian data has only a few observations in the Pareto set, while uniformly distributed data on a simplex has every observations in the Pareto set.

References

  • "The Skyline Operator" by Börzsönyi et al. introduces the Skyline Operator in the database context.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

paretoset-1.1.0.tar.gz (13.4 kB view details)

Uploaded Source

Built Distribution

paretoset-1.1.0-py3-none-any.whl (13.2 kB view details)

Uploaded Python 3

File details

Details for the file paretoset-1.1.0.tar.gz.

File metadata

  • Download URL: paretoset-1.1.0.tar.gz
  • Upload date:
  • Size: 13.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.1

File hashes

Hashes for paretoset-1.1.0.tar.gz
Algorithm Hash digest
SHA256 193ed21eedd54a65cfddcfb8835df4f01dae5ea8b36dac4409c7ceb7533c35c7
MD5 61a8ea66bc886a6dc62f795f8966291e
BLAKE2b-256 b542e40a1ea9e55fc4594bf99b110e2d1fcf65f30770de032429dd00617b2eca

See more details on using hashes here.

File details

Details for the file paretoset-1.1.0-py3-none-any.whl.

File metadata

  • Download URL: paretoset-1.1.0-py3-none-any.whl
  • Upload date:
  • Size: 13.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.1

File hashes

Hashes for paretoset-1.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a3ea5d83e314cf866594f653a70e38ebe0b742841557fe24ddd6008d2bf597db
MD5 55112c042c0e152a5073e16498fa96a1
BLAKE2b-256 a3888702134fe01a61f48f19d3166d54b551945eda8525e26912312999d846a7

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page