Repository files navigation

Documentation StatusPyPIDownloadsGitHub stars

Clearbox AI Preprocessor

This repository contains the continuation of the work presented in our series of blogposts "The whys and hows of data preparation" (part 1, part 2, part 3).

The new version of Preprocessor exploits Polars library's features to achieve blazing fast tabular data manipulation.

It is possible to input the Preprocessor a Pandas.DataFrame, a Polars.DataFrame or a Polars.LazyFrame.

Installation

You can install the preprocessor by running the following command:

$ pip install clearbox-preprocessor

Preprocessing customization

A bunch of options are available to customize the preprocessing.

The Preprocessor class features the following input arguments, besides the input dataset:

  • discarding_threshold: float (default = 0.9)

    Float number between 0 and 1 to set the threshold for discarding categorical features. If more than discarding_threshold * 100 % of values in a categorical feature are different from each other, then the column is discarded. For example, if discarding_threshold=0.9, a column will be discarded if more than 90% of its values are unique.

  • get_discarded_info: bool (defatult = False)

    When set to 'True', the preprocessor will feature the methods preprocessor.get_discarded_features_reason, which provides information on which columns were discarded and the reason why, and preprocessor.get_single_valued_columns, which provides the values of the single-valued discarded columns. Note that setting get_discarded_info=True will considerably slow down the processing operation! The list of discarded columns will be available even if get_discarded_info=False, so consider setting this flag to True only if you need to know why a column was discarded or, if it contained just one value, what that value was.

  • excluded_col: (default = [])

    List containing the names of the columns to be excluded from processing. These columns will be returned in the final dataframe withouth being manipulated.

  • time: (default = None)

    String name of the time column by which to sort the dataframe in case of time series.

  • scaling_method: (default="none")

    Specifies the scaling operation to perform on numerical features.

    • "none" : no scaling is applied
    • "normalize" : applies normalization to numerical features
    • "standardize" : applies standardization to numerical features
    • "quantile" : Transforms numerical features using quantiles information
  • num_fill_null: (default = "mean")

    Specifies the value to fill null values with or the strategy for filling null values in numerical features.

    • value : fills null values with the specified value
    • "mean" : fills null values with the average of the column
    • "forward" : fills null values with the previous non-null value in the column
    • "backward" : fills null values with the following non-null value in the column
    • "min" : fills null values with the minimum value of the column
    • "max" : fills null values with the maximum value of the column
    • "zero" : fills null values with zeros
    • "one" : fills null values with ones
  • n_bins: (default = 0)

    Integer number that determines the number of bins into which numerical features are discretized. When set to 0, the preprocessing step defaults to the scaling method specified in the 'scaling' atgument instead of discretization.

    Note that if n_bins is different than 0, discretization will take place instead of scaling, regardless of whether the 'scaling' argument is specified.

Timeseries

The Prperocessor also features a timeseries manipulation and feature extraction method called extract_ts_features().

This method takes as input:

  • the preprocessed dataframe
  • the target vector in the form of a Pandas.Series or a Polars.Series
  • the name of the time column
  • the name of the id column to group by

It returns the most relevant features selected among a wide range of features.

Usage

You can start using the Preprocessor by importing it and creating a Pandas.DataFrame or a Polars.LazyFrame:

importpolarsasplfromclearbox_preprocessorimportPreprocessorq=pl.LazyFrame(
{
"cha": ["x", None, "z", "w", "x", "k"],
"int": [123, 124, 223, 431, 435, 432],
"dat": ["2023-1-5T00:34:12.000Z", "2023-2-3T04:31:45.000Z", "2023-2-4T04:31:45.000Z", None, "2023-5-12T21:41:58.000Z", "2023-6-1T17:52:22.000Z"],
"boo": [True, False, None, True, False, False],
"equ": ["a", "a", "a", "a", None, "a"],
"flo": [43.034, 343.1, 224.23, 75.3, None, 83.2],
"str": ["asd", "fgh", "fgh", "", None, "cvb"]
}
).with_columns(pl.col('dat').str.to_datetime("%Y-%m-%dT%H:%M:%S.000Z"))
q.collect()
image

At this point, you can initialize the Preprocessor by passing the LazyFrame or DataFrame created to it and then calling the transform() method to materialize the processed dataframe.

Note that if no argument is specified beyond the dataframe q, the default settings are employed for preprocessing:

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
df
image

Customization example

In the following example, when the Preprocessor is initialized:

  1. The discarding threshold is lowered from 90% to 80% (a column will be discarded if more than 80% of its values are unique).
  2. The discarding featrues informations are stored in the preprocessor instance.
  3. The column "boo" is excluded from the preprocessing and is preserved unchanged.
  4. The scaling method of the numerical features chosen is standardization
  5. The fill null strategy for numerical features is "forward".
preprocessor=Preprocessor(q, get_discarded_info=True, discarding_threshold=0.8, excluded_col= ["boo"], scaling="standardize", num_fill_null="forward"
)
df=preprocessor.transform(q)
df
image

It is possible to inverse transform the processed dataframe with the method preprocessor.inverse_transform().

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
inverse_df=preprocessor.inverse_transform(df)

If the Processor's argument get_discarded_info is set to True during initialization, it is possible to call the method get_discarded_features_reason() to display the discarded features. In the case of discarded single-valued columns, the value contained is also displayed and is available in a dictionary called single_value_columns, stored in the Preprocessor instance, and can be used as metadata.

preprocessor.get_discarded_features_reason()
image

To do

  • Implement unit tests

About

A fast and felxible data preprocessor based on polars.

Topics

Resources

Stars

7 stars

Watchers

6 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Documentation StatusPyPIDownloadsGitHub stars

Clearbox AI Preprocessor

This repository contains the continuation of the work presented in our series of blogposts "The whys and hows of data preparation" (part 1, part 2, part 3).

The new version of Preprocessor exploits Polars library's features to achieve blazing fast tabular data manipulation.

It is possible to input the Preprocessor a Pandas.DataFrame, a Polars.DataFrame or a Polars.LazyFrame.

Installation

You can install the preprocessor by running the following command:

$ pip install clearbox-preprocessor

Preprocessing customization

A bunch of options are available to customize the preprocessing.

The Preprocessor class features the following input arguments, besides the input dataset:

  • discarding_threshold: float (default = 0.9)

    Float number between 0 and 1 to set the threshold for discarding categorical features. If more than discarding_threshold * 100 % of values in a categorical feature are different from each other, then the column is discarded. For example, if discarding_threshold=0.9, a column will be discarded if more than 90% of its values are unique.

  • get_discarded_info: bool (defatult = False)

    When set to 'True', the preprocessor will feature the methods preprocessor.get_discarded_features_reason, which provides information on which columns were discarded and the reason why, and preprocessor.get_single_valued_columns, which provides the values of the single-valued discarded columns. Note that setting get_discarded_info=True will considerably slow down the processing operation! The list of discarded columns will be available even if get_discarded_info=False, so consider setting this flag to True only if you need to know why a column was discarded or, if it contained just one value, what that value was.

  • excluded_col: (default = [])

    List containing the names of the columns to be excluded from processing. These columns will be returned in the final dataframe withouth being manipulated.

  • time: (default = None)

    String name of the time column by which to sort the dataframe in case of time series.

  • scaling_method: (default="none")

    Specifies the scaling operation to perform on numerical features.

    • "none" : no scaling is applied
    • "normalize" : applies normalization to numerical features
    • "standardize" : applies standardization to numerical features
    • "quantile" : Transforms numerical features using quantiles information
  • num_fill_null: (default = "mean")

    Specifies the value to fill null values with or the strategy for filling null values in numerical features.

    • value : fills null values with the specified value
    • "mean" : fills null values with the average of the column
    • "forward" : fills null values with the previous non-null value in the column
    • "backward" : fills null values with the following non-null value in the column
    • "min" : fills null values with the minimum value of the column
    • "max" : fills null values with the maximum value of the column
    • "zero" : fills null values with zeros
    • "one" : fills null values with ones
  • n_bins: (default = 0)

    Integer number that determines the number of bins into which numerical features are discretized. When set to 0, the preprocessing step defaults to the scaling method specified in the 'scaling' atgument instead of discretization.

    Note that if n_bins is different than 0, discretization will take place instead of scaling, regardless of whether the 'scaling' argument is specified.

Timeseries

The Prperocessor also features a timeseries manipulation and feature extraction method called extract_ts_features().

This method takes as input:

  • the preprocessed dataframe
  • the target vector in the form of a Pandas.Series or a Polars.Series
  • the name of the time column
  • the name of the id column to group by

It returns the most relevant features selected among a wide range of features.

Usage

You can start using the Preprocessor by importing it and creating a Pandas.DataFrame or a Polars.LazyFrame:

importpolarsasplfromclearbox_preprocessorimportPreprocessorq=pl.LazyFrame(
{
"cha": ["x", None, "z", "w", "x", "k"],
"int": [123, 124, 223, 431, 435, 432],
"dat": ["2023-1-5T00:34:12.000Z", "2023-2-3T04:31:45.000Z", "2023-2-4T04:31:45.000Z", None, "2023-5-12T21:41:58.000Z", "2023-6-1T17:52:22.000Z"],
"boo": [True, False, None, True, False, False],
"equ": ["a", "a", "a", "a", None, "a"],
"flo": [43.034, 343.1, 224.23, 75.3, None, 83.2],
"str": ["asd", "fgh", "fgh", "", None, "cvb"]
}
).with_columns(pl.col('dat').str.to_datetime("%Y-%m-%dT%H:%M:%S.000Z"))
q.collect()
image

At this point, you can initialize the Preprocessor by passing the LazyFrame or DataFrame created to it and then calling the transform() method to materialize the processed dataframe.

Note that if no argument is specified beyond the dataframe q, the default settings are employed for preprocessing:

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
df
image

Customization example

In the following example, when the Preprocessor is initialized:

  1. The discarding threshold is lowered from 90% to 80% (a column will be discarded if more than 80% of its values are unique).
  2. The discarding featrues informations are stored in the preprocessor instance.
  3. The column "boo" is excluded from the preprocessing and is preserved unchanged.
  4. The scaling method of the numerical features chosen is standardization
  5. The fill null strategy for numerical features is "forward".
preprocessor=Preprocessor(q, get_discarded_info=True, discarding_threshold=0.8, excluded_col= ["boo"], scaling="standardize", num_fill_null="forward"
)
df=preprocessor.transform(q)
df
image

It is possible to inverse transform the processed dataframe with the method preprocessor.inverse_transform().

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
inverse_df=preprocessor.inverse_transform(df)

If the Processor's argument get_discarded_info is set to True during initialization, it is possible to call the method get_discarded_features_reason() to display the discarded features. In the case of discarded single-valued columns, the value contained is also displayed and is available in a dictionary called single_value_columns, stored in the Preprocessor instance, and can be used as metadata.

preprocessor.get_discarded_features_reason()
image

To do

  • Implement unit tests

About

A fast and felxible data preprocessor based on polars.

Topics

Resources

Stars

7 stars

Watchers

6 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Documentation StatusPyPIDownloadsGitHub stars

Clearbox AI Preprocessor

This repository contains the continuation of the work presented in our series of blogposts "The whys and hows of data preparation" (part 1, part 2, part 3).

The new version of Preprocessor exploits Polars library's features to achieve blazing fast tabular data manipulation.

It is possible to input the Preprocessor a Pandas.DataFrame, a Polars.DataFrame or a Polars.LazyFrame.

Installation

You can install the preprocessor by running the following command:

$ pip install clearbox-preprocessor

Preprocessing customization

A bunch of options are available to customize the preprocessing.

The Preprocessor class features the following input arguments, besides the input dataset:

  • discarding_threshold: float (default = 0.9)

    Float number between 0 and 1 to set the threshold for discarding categorical features. If more than discarding_threshold * 100 % of values in a categorical feature are different from each other, then the column is discarded. For example, if discarding_threshold=0.9, a column will be discarded if more than 90% of its values are unique.

  • get_discarded_info: bool (defatult = False)

    When set to 'True', the preprocessor will feature the methods preprocessor.get_discarded_features_reason, which provides information on which columns were discarded and the reason why, and preprocessor.get_single_valued_columns, which provides the values of the single-valued discarded columns. Note that setting get_discarded_info=True will considerably slow down the processing operation! The list of discarded columns will be available even if get_discarded_info=False, so consider setting this flag to True only if you need to know why a column was discarded or, if it contained just one value, what that value was.

  • excluded_col: (default = [])

    List containing the names of the columns to be excluded from processing. These columns will be returned in the final dataframe withouth being manipulated.

  • time: (default = None)

    String name of the time column by which to sort the dataframe in case of time series.

  • scaling_method: (default="none")

    Specifies the scaling operation to perform on numerical features.

    • "none" : no scaling is applied
    • "normalize" : applies normalization to numerical features
    • "standardize" : applies standardization to numerical features
    • "quantile" : Transforms numerical features using quantiles information
  • num_fill_null: (default = "mean")

    Specifies the value to fill null values with or the strategy for filling null values in numerical features.

    • value : fills null values with the specified value
    • "mean" : fills null values with the average of the column
    • "forward" : fills null values with the previous non-null value in the column
    • "backward" : fills null values with the following non-null value in the column
    • "min" : fills null values with the minimum value of the column
    • "max" : fills null values with the maximum value of the column
    • "zero" : fills null values with zeros
    • "one" : fills null values with ones
  • n_bins: (default = 0)

    Integer number that determines the number of bins into which numerical features are discretized. When set to 0, the preprocessing step defaults to the scaling method specified in the 'scaling' atgument instead of discretization.

    Note that if n_bins is different than 0, discretization will take place instead of scaling, regardless of whether the 'scaling' argument is specified.

Timeseries

The Prperocessor also features a timeseries manipulation and feature extraction method called extract_ts_features().

This method takes as input:

  • the preprocessed dataframe
  • the target vector in the form of a Pandas.Series or a Polars.Series
  • the name of the time column
  • the name of the id column to group by

It returns the most relevant features selected among a wide range of features.

Usage

You can start using the Preprocessor by importing it and creating a Pandas.DataFrame or a Polars.LazyFrame:

importpolarsasplfromclearbox_preprocessorimportPreprocessorq=pl.LazyFrame(
{
"cha": ["x", None, "z", "w", "x", "k"],
"int": [123, 124, 223, 431, 435, 432],
"dat": ["2023-1-5T00:34:12.000Z", "2023-2-3T04:31:45.000Z", "2023-2-4T04:31:45.000Z", None, "2023-5-12T21:41:58.000Z", "2023-6-1T17:52:22.000Z"],
"boo": [True, False, None, True, False, False],
"equ": ["a", "a", "a", "a", None, "a"],
"flo": [43.034, 343.1, 224.23, 75.3, None, 83.2],
"str": ["asd", "fgh", "fgh", "", None, "cvb"]
}
).with_columns(pl.col('dat').str.to_datetime("%Y-%m-%dT%H:%M:%S.000Z"))
q.collect()
image

At this point, you can initialize the Preprocessor by passing the LazyFrame or DataFrame created to it and then calling the transform() method to materialize the processed dataframe.

Note that if no argument is specified beyond the dataframe q, the default settings are employed for preprocessing:

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
df
image

Customization example

In the following example, when the Preprocessor is initialized:

  1. The discarding threshold is lowered from 90% to 80% (a column will be discarded if more than 80% of its values are unique).
  2. The discarding featrues informations are stored in the preprocessor instance.
  3. The column "boo" is excluded from the preprocessing and is preserved unchanged.
  4. The scaling method of the numerical features chosen is standardization
  5. The fill null strategy for numerical features is "forward".
preprocessor=Preprocessor(q, get_discarded_info=True, discarding_threshold=0.8, excluded_col= ["boo"], scaling="standardize", num_fill_null="forward"
)
df=preprocessor.transform(q)
df
image

It is possible to inverse transform the processed dataframe with the method preprocessor.inverse_transform().

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
inverse_df=preprocessor.inverse_transform(df)

If the Processor's argument get_discarded_info is set to True during initialization, it is possible to call the method get_discarded_features_reason() to display the discarded features. In the case of discarded single-valued columns, the value contained is also displayed and is available in a dictionary called single_value_columns, stored in the Preprocessor instance, and can be used as metadata.

preprocessor.get_discarded_features_reason()
image

To do

  • Implement unit tests

About

A fast and felxible data preprocessor based on polars.

Topics

Resources

Stars

7 stars

Watchers

6 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Documentation StatusPyPIDownloadsGitHub stars

Clearbox AI Preprocessor

This repository contains the continuation of the work presented in our series of blogposts "The whys and hows of data preparation" (part 1, part 2, part 3).

The new version of Preprocessor exploits Polars library's features to achieve blazing fast tabular data manipulation.

It is possible to input the Preprocessor a Pandas.DataFrame, a Polars.DataFrame or a Polars.LazyFrame.

Installation

You can install the preprocessor by running the following command:

$ pip install clearbox-preprocessor

Preprocessing customization

A bunch of options are available to customize the preprocessing.

The Preprocessor class features the following input arguments, besides the input dataset:

  • discarding_threshold: float (default = 0.9)

    Float number between 0 and 1 to set the threshold for discarding categorical features. If more than discarding_threshold * 100 % of values in a categorical feature are different from each other, then the column is discarded. For example, if discarding_threshold=0.9, a column will be discarded if more than 90% of its values are unique.

  • get_discarded_info: bool (defatult = False)

    When set to 'True', the preprocessor will feature the methods preprocessor.get_discarded_features_reason, which provides information on which columns were discarded and the reason why, and preprocessor.get_single_valued_columns, which provides the values of the single-valued discarded columns. Note that setting get_discarded_info=True will considerably slow down the processing operation! The list of discarded columns will be available even if get_discarded_info=False, so consider setting this flag to True only if you need to know why a column was discarded or, if it contained just one value, what that value was.

  • excluded_col: (default = [])

    List containing the names of the columns to be excluded from processing. These columns will be returned in the final dataframe withouth being manipulated.

  • time: (default = None)

    String name of the time column by which to sort the dataframe in case of time series.

  • scaling_method: (default="none")

    Specifies the scaling operation to perform on numerical features.

    • "none" : no scaling is applied
    • "normalize" : applies normalization to numerical features
    • "standardize" : applies standardization to numerical features
    • "quantile" : Transforms numerical features using quantiles information
  • num_fill_null: (default = "mean")

    Specifies the value to fill null values with or the strategy for filling null values in numerical features.

    • value : fills null values with the specified value
    • "mean" : fills null values with the average of the column
    • "forward" : fills null values with the previous non-null value in the column
    • "backward" : fills null values with the following non-null value in the column
    • "min" : fills null values with the minimum value of the column
    • "max" : fills null values with the maximum value of the column
    • "zero" : fills null values with zeros
    • "one" : fills null values with ones
  • n_bins: (default = 0)

    Integer number that determines the number of bins into which numerical features are discretized. When set to 0, the preprocessing step defaults to the scaling method specified in the 'scaling' atgument instead of discretization.

    Note that if n_bins is different than 0, discretization will take place instead of scaling, regardless of whether the 'scaling' argument is specified.

Timeseries

The Prperocessor also features a timeseries manipulation and feature extraction method called extract_ts_features().

This method takes as input:

  • the preprocessed dataframe
  • the target vector in the form of a Pandas.Series or a Polars.Series
  • the name of the time column
  • the name of the id column to group by

It returns the most relevant features selected among a wide range of features.

Usage

You can start using the Preprocessor by importing it and creating a Pandas.DataFrame or a Polars.LazyFrame:

importpolarsasplfromclearbox_preprocessorimportPreprocessorq=pl.LazyFrame(
{
"cha": ["x", None, "z", "w", "x", "k"],
"int": [123, 124, 223, 431, 435, 432],
"dat": ["2023-1-5T00:34:12.000Z", "2023-2-3T04:31:45.000Z", "2023-2-4T04:31:45.000Z", None, "2023-5-12T21:41:58.000Z", "2023-6-1T17:52:22.000Z"],
"boo": [True, False, None, True, False, False],
"equ": ["a", "a", "a", "a", None, "a"],
"flo": [43.034, 343.1, 224.23, 75.3, None, 83.2],
"str": ["asd", "fgh", "fgh", "", None, "cvb"]
}
).with_columns(pl.col('dat').str.to_datetime("%Y-%m-%dT%H:%M:%S.000Z"))
q.collect()
image

At this point, you can initialize the Preprocessor by passing the LazyFrame or DataFrame created to it and then calling the transform() method to materialize the processed dataframe.

Note that if no argument is specified beyond the dataframe q, the default settings are employed for preprocessing:

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
df
image

Customization example

In the following example, when the Preprocessor is initialized:

  1. The discarding threshold is lowered from 90% to 80% (a column will be discarded if more than 80% of its values are unique).
  2. The discarding featrues informations are stored in the preprocessor instance.
  3. The column "boo" is excluded from the preprocessing and is preserved unchanged.
  4. The scaling method of the numerical features chosen is standardization
  5. The fill null strategy for numerical features is "forward".
preprocessor=Preprocessor(q, get_discarded_info=True, discarding_threshold=0.8, excluded_col= ["boo"], scaling="standardize", num_fill_null="forward"
)
df=preprocessor.transform(q)
df
image

It is possible to inverse transform the processed dataframe with the method preprocessor.inverse_transform().

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
inverse_df=preprocessor.inverse_transform(df)

If the Processor's argument get_discarded_info is set to True during initialization, it is possible to call the method get_discarded_features_reason() to display the discarded features. In the case of discarded single-valued columns, the value contained is also displayed and is available in a dictionary called single_value_columns, stored in the Preprocessor instance, and can be used as metadata.

preprocessor.get_discarded_features_reason()
image

To do

  • Implement unit tests

About

A fast and felxible data preprocessor based on polars.

Topics

Resources

Stars

7 stars

Watchers

6 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Documentation StatusPyPIDownloadsGitHub stars

Clearbox AI Preprocessor

This repository contains the continuation of the work presented in our series of blogposts "The whys and hows of data preparation" (part 1, part 2, part 3).

The new version of Preprocessor exploits Polars library's features to achieve blazing fast tabular data manipulation.

It is possible to input the Preprocessor a Pandas.DataFrame, a Polars.DataFrame or a Polars.LazyFrame.

Installation

You can install the preprocessor by running the following command:

$ pip install clearbox-preprocessor

Preprocessing customization

A bunch of options are available to customize the preprocessing.

The Preprocessor class features the following input arguments, besides the input dataset:

  • discarding_threshold: float (default = 0.9)

    Float number between 0 and 1 to set the threshold for discarding categorical features. If more than discarding_threshold * 100 % of values in a categorical feature are different from each other, then the column is discarded. For example, if discarding_threshold=0.9, a column will be discarded if more than 90% of its values are unique.

  • get_discarded_info: bool (defatult = False)

    When set to 'True', the preprocessor will feature the methods preprocessor.get_discarded_features_reason, which provides information on which columns were discarded and the reason why, and preprocessor.get_single_valued_columns, which provides the values of the single-valued discarded columns. Note that setting get_discarded_info=True will considerably slow down the processing operation! The list of discarded columns will be available even if get_discarded_info=False, so consider setting this flag to True only if you need to know why a column was discarded or, if it contained just one value, what that value was.

  • excluded_col: (default = [])

    List containing the names of the columns to be excluded from processing. These columns will be returned in the final dataframe withouth being manipulated.

  • time: (default = None)

    String name of the time column by which to sort the dataframe in case of time series.

  • scaling_method: (default="none")

    Specifies the scaling operation to perform on numerical features.

    • "none" : no scaling is applied
    • "normalize" : applies normalization to numerical features
    • "standardize" : applies standardization to numerical features
    • "quantile" : Transforms numerical features using quantiles information
  • num_fill_null: (default = "mean")

    Specifies the value to fill null values with or the strategy for filling null values in numerical features.

    • value : fills null values with the specified value
    • "mean" : fills null values with the average of the column
    • "forward" : fills null values with the previous non-null value in the column
    • "backward" : fills null values with the following non-null value in the column
    • "min" : fills null values with the minimum value of the column
    • "max" : fills null values with the maximum value of the column
    • "zero" : fills null values with zeros
    • "one" : fills null values with ones
  • n_bins: (default = 0)

    Integer number that determines the number of bins into which numerical features are discretized. When set to 0, the preprocessing step defaults to the scaling method specified in the 'scaling' atgument instead of discretization.

    Note that if n_bins is different than 0, discretization will take place instead of scaling, regardless of whether the 'scaling' argument is specified.

Timeseries

The Prperocessor also features a timeseries manipulation and feature extraction method called extract_ts_features().

This method takes as input:

  • the preprocessed dataframe
  • the target vector in the form of a Pandas.Series or a Polars.Series
  • the name of the time column
  • the name of the id column to group by

It returns the most relevant features selected among a wide range of features.

Usage

You can start using the Preprocessor by importing it and creating a Pandas.DataFrame or a Polars.LazyFrame:

importpolarsasplfromclearbox_preprocessorimportPreprocessorq=pl.LazyFrame(
{
"cha": ["x", None, "z", "w", "x", "k"],
"int": [123, 124, 223, 431, 435, 432],
"dat": ["2023-1-5T00:34:12.000Z", "2023-2-3T04:31:45.000Z", "2023-2-4T04:31:45.000Z", None, "2023-5-12T21:41:58.000Z", "2023-6-1T17:52:22.000Z"],
"boo": [True, False, None, True, False, False],
"equ": ["a", "a", "a", "a", None, "a"],
"flo": [43.034, 343.1, 224.23, 75.3, None, 83.2],
"str": ["asd", "fgh", "fgh", "", None, "cvb"]
}
).with_columns(pl.col('dat').str.to_datetime("%Y-%m-%dT%H:%M:%S.000Z"))
q.collect()
image

At this point, you can initialize the Preprocessor by passing the LazyFrame or DataFrame created to it and then calling the transform() method to materialize the processed dataframe.

Note that if no argument is specified beyond the dataframe q, the default settings are employed for preprocessing:

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
df
image

Customization example

In the following example, when the Preprocessor is initialized:

  1. The discarding threshold is lowered from 90% to 80% (a column will be discarded if more than 80% of its values are unique).
  2. The discarding featrues informations are stored in the preprocessor instance.
  3. The column "boo" is excluded from the preprocessing and is preserved unchanged.
  4. The scaling method of the numerical features chosen is standardization
  5. The fill null strategy for numerical features is "forward".
preprocessor=Preprocessor(q, get_discarded_info=True, discarding_threshold=0.8, excluded_col= ["boo"], scaling="standardize", num_fill_null="forward"
)
df=preprocessor.transform(q)
df
image

It is possible to inverse transform the processed dataframe with the method preprocessor.inverse_transform().

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
inverse_df=preprocessor.inverse_transform(df)

If the Processor's argument get_discarded_info is set to True during initialization, it is possible to call the method get_discarded_features_reason() to display the discarded features. In the case of discarded single-valued columns, the value contained is also displayed and is available in a dictionary called single_value_columns, stored in the Preprocessor instance, and can be used as metadata.

preprocessor.get_discarded_features_reason()
image

To do

  • Implement unit tests

About

A fast and felxible data preprocessor based on polars.

Topics

Resources

Stars

7 stars

Watchers

6 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Documentation StatusPyPIDownloadsGitHub stars

Clearbox AI Preprocessor

This repository contains the continuation of the work presented in our series of blogposts "The whys and hows of data preparation" (part 1, part 2, part 3).

The new version of Preprocessor exploits Polars library's features to achieve blazing fast tabular data manipulation.

It is possible to input the Preprocessor a Pandas.DataFrame, a Polars.DataFrame or a Polars.LazyFrame.

Installation

You can install the preprocessor by running the following command:

$ pip install clearbox-preprocessor

Preprocessing customization

A bunch of options are available to customize the preprocessing.

The Preprocessor class features the following input arguments, besides the input dataset:

  • discarding_threshold: float (default = 0.9)

    Float number between 0 and 1 to set the threshold for discarding categorical features. If more than discarding_threshold * 100 % of values in a categorical feature are different from each other, then the column is discarded. For example, if discarding_threshold=0.9, a column will be discarded if more than 90% of its values are unique.

  • get_discarded_info: bool (defatult = False)

    When set to 'True', the preprocessor will feature the methods preprocessor.get_discarded_features_reason, which provides information on which columns were discarded and the reason why, and preprocessor.get_single_valued_columns, which provides the values of the single-valued discarded columns. Note that setting get_discarded_info=True will considerably slow down the processing operation! The list of discarded columns will be available even if get_discarded_info=False, so consider setting this flag to True only if you need to know why a column was discarded or, if it contained just one value, what that value was.

  • excluded_col: (default = [])

    List containing the names of the columns to be excluded from processing. These columns will be returned in the final dataframe withouth being manipulated.

  • time: (default = None)

    String name of the time column by which to sort the dataframe in case of time series.

  • scaling_method: (default="none")

    Specifies the scaling operation to perform on numerical features.

    • "none" : no scaling is applied
    • "normalize" : applies normalization to numerical features
    • "standardize" : applies standardization to numerical features
    • "quantile" : Transforms numerical features using quantiles information
  • num_fill_null: (default = "mean")

    Specifies the value to fill null values with or the strategy for filling null values in numerical features.

    • value : fills null values with the specified value
    • "mean" : fills null values with the average of the column
    • "forward" : fills null values with the previous non-null value in the column
    • "backward" : fills null values with the following non-null value in the column
    • "min" : fills null values with the minimum value of the column
    • "max" : fills null values with the maximum value of the column
    • "zero" : fills null values with zeros
    • "one" : fills null values with ones
  • n_bins: (default = 0)

    Integer number that determines the number of bins into which numerical features are discretized. When set to 0, the preprocessing step defaults to the scaling method specified in the 'scaling' atgument instead of discretization.

    Note that if n_bins is different than 0, discretization will take place instead of scaling, regardless of whether the 'scaling' argument is specified.

Timeseries

The Prperocessor also features a timeseries manipulation and feature extraction method called extract_ts_features().

This method takes as input:

  • the preprocessed dataframe
  • the target vector in the form of a Pandas.Series or a Polars.Series
  • the name of the time column
  • the name of the id column to group by

It returns the most relevant features selected among a wide range of features.

Usage

You can start using the Preprocessor by importing it and creating a Pandas.DataFrame or a Polars.LazyFrame:

importpolarsasplfromclearbox_preprocessorimportPreprocessorq=pl.LazyFrame(
{
"cha": ["x", None, "z", "w", "x", "k"],
"int": [123, 124, 223, 431, 435, 432],
"dat": ["2023-1-5T00:34:12.000Z", "2023-2-3T04:31:45.000Z", "2023-2-4T04:31:45.000Z", None, "2023-5-12T21:41:58.000Z", "2023-6-1T17:52:22.000Z"],
"boo": [True, False, None, True, False, False],
"equ": ["a", "a", "a", "a", None, "a"],
"flo": [43.034, 343.1, 224.23, 75.3, None, 83.2],
"str": ["asd", "fgh", "fgh", "", None, "cvb"]
}
).with_columns(pl.col('dat').str.to_datetime("%Y-%m-%dT%H:%M:%S.000Z"))
q.collect()
image

At this point, you can initialize the Preprocessor by passing the LazyFrame or DataFrame created to it and then calling the transform() method to materialize the processed dataframe.

Note that if no argument is specified beyond the dataframe q, the default settings are employed for preprocessing:

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
df
image

Customization example

In the following example, when the Preprocessor is initialized:

  1. The discarding threshold is lowered from 90% to 80% (a column will be discarded if more than 80% of its values are unique).
  2. The discarding featrues informations are stored in the preprocessor instance.
  3. The column "boo" is excluded from the preprocessing and is preserved unchanged.
  4. The scaling method of the numerical features chosen is standardization
  5. The fill null strategy for numerical features is "forward".
preprocessor=Preprocessor(q, get_discarded_info=True, discarding_threshold=0.8, excluded_col= ["boo"], scaling="standardize", num_fill_null="forward"
)
df=preprocessor.transform(q)
df
image

It is possible to inverse transform the processed dataframe with the method preprocessor.inverse_transform().

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
inverse_df=preprocessor.inverse_transform(df)

If the Processor's argument get_discarded_info is set to True during initialization, it is possible to call the method get_discarded_features_reason() to display the discarded features. In the case of discarded single-valued columns, the value contained is also displayed and is available in a dictionary called single_value_columns, stored in the Preprocessor instance, and can be used as metadata.

preprocessor.get_discarded_features_reason()
image

To do

  • Implement unit tests

About

A fast and felxible data preprocessor based on polars.

Topics

Resources

Stars

7 stars

Watchers

6 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Documentation StatusPyPIDownloadsGitHub stars

Clearbox AI Preprocessor

This repository contains the continuation of the work presented in our series of blogposts "The whys and hows of data preparation" (part 1, part 2, part 3).

The new version of Preprocessor exploits Polars library's features to achieve blazing fast tabular data manipulation.

It is possible to input the Preprocessor a Pandas.DataFrame, a Polars.DataFrame or a Polars.LazyFrame.

Installation

You can install the preprocessor by running the following command:

$ pip install clearbox-preprocessor

Preprocessing customization

A bunch of options are available to customize the preprocessing.

The Preprocessor class features the following input arguments, besides the input dataset:

  • discarding_threshold: float (default = 0.9)

    Float number between 0 and 1 to set the threshold for discarding categorical features. If more than discarding_threshold * 100 % of values in a categorical feature are different from each other, then the column is discarded. For example, if discarding_threshold=0.9, a column will be discarded if more than 90% of its values are unique.

  • get_discarded_info: bool (defatult = False)

    When set to 'True', the preprocessor will feature the methods preprocessor.get_discarded_features_reason, which provides information on which columns were discarded and the reason why, and preprocessor.get_single_valued_columns, which provides the values of the single-valued discarded columns. Note that setting get_discarded_info=True will considerably slow down the processing operation! The list of discarded columns will be available even if get_discarded_info=False, so consider setting this flag to True only if you need to know why a column was discarded or, if it contained just one value, what that value was.

  • excluded_col: (default = [])

    List containing the names of the columns to be excluded from processing. These columns will be returned in the final dataframe withouth being manipulated.

  • time: (default = None)

    String name of the time column by which to sort the dataframe in case of time series.

  • scaling_method: (default="none")

    Specifies the scaling operation to perform on numerical features.

    • "none" : no scaling is applied
    • "normalize" : applies normalization to numerical features
    • "standardize" : applies standardization to numerical features
    • "quantile" : Transforms numerical features using quantiles information
  • num_fill_null: (default = "mean")

    Specifies the value to fill null values with or the strategy for filling null values in numerical features.

    • value : fills null values with the specified value
    • "mean" : fills null values with the average of the column
    • "forward" : fills null values with the previous non-null value in the column
    • "backward" : fills null values with the following non-null value in the column
    • "min" : fills null values with the minimum value of the column
    • "max" : fills null values with the maximum value of the column
    • "zero" : fills null values with zeros
    • "one" : fills null values with ones
  • n_bins: (default = 0)

    Integer number that determines the number of bins into which numerical features are discretized. When set to 0, the preprocessing step defaults to the scaling method specified in the 'scaling' atgument instead of discretization.

    Note that if n_bins is different than 0, discretization will take place instead of scaling, regardless of whether the 'scaling' argument is specified.

Timeseries

The Prperocessor also features a timeseries manipulation and feature extraction method called extract_ts_features().

This method takes as input:

  • the preprocessed dataframe
  • the target vector in the form of a Pandas.Series or a Polars.Series
  • the name of the time column
  • the name of the id column to group by

It returns the most relevant features selected among a wide range of features.

Usage

You can start using the Preprocessor by importing it and creating a Pandas.DataFrame or a Polars.LazyFrame:

importpolarsasplfromclearbox_preprocessorimportPreprocessorq=pl.LazyFrame(
{
"cha": ["x", None, "z", "w", "x", "k"],
"int": [123, 124, 223, 431, 435, 432],
"dat": ["2023-1-5T00:34:12.000Z", "2023-2-3T04:31:45.000Z", "2023-2-4T04:31:45.000Z", None, "2023-5-12T21:41:58.000Z", "2023-6-1T17:52:22.000Z"],
"boo": [True, False, None, True, False, False],
"equ": ["a", "a", "a", "a", None, "a"],
"flo": [43.034, 343.1, 224.23, 75.3, None, 83.2],
"str": ["asd", "fgh", "fgh", "", None, "cvb"]
}
).with_columns(pl.col('dat').str.to_datetime("%Y-%m-%dT%H:%M:%S.000Z"))
q.collect()
image

At this point, you can initialize the Preprocessor by passing the LazyFrame or DataFrame created to it and then calling the transform() method to materialize the processed dataframe.

Note that if no argument is specified beyond the dataframe q, the default settings are employed for preprocessing:

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
df
image

Customization example

In the following example, when the Preprocessor is initialized:

  1. The discarding threshold is lowered from 90% to 80% (a column will be discarded if more than 80% of its values are unique).
  2. The discarding featrues informations are stored in the preprocessor instance.
  3. The column "boo" is excluded from the preprocessing and is preserved unchanged.
  4. The scaling method of the numerical features chosen is standardization
  5. The fill null strategy for numerical features is "forward".
preprocessor=Preprocessor(q, get_discarded_info=True, discarding_threshold=0.8, excluded_col= ["boo"], scaling="standardize", num_fill_null="forward"
)
df=preprocessor.transform(q)
df
image

It is possible to inverse transform the processed dataframe with the method preprocessor.inverse_transform().

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
inverse_df=preprocessor.inverse_transform(df)

If the Processor's argument get_discarded_info is set to True during initialization, it is possible to call the method get_discarded_features_reason() to display the discarded features. In the case of discarded single-valued columns, the value contained is also displayed and is available in a dictionary called single_value_columns, stored in the Preprocessor instance, and can be used as metadata.

preprocessor.get_discarded_features_reason()
image

To do

  • Implement unit tests

About

A fast and felxible data preprocessor based on polars.

Topics

Resources

Stars

7 stars

Watchers

6 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Documentation StatusPyPIDownloadsGitHub stars

Clearbox AI Preprocessor

This repository contains the continuation of the work presented in our series of blogposts "The whys and hows of data preparation" (part 1, part 2, part 3).

The new version of Preprocessor exploits Polars library's features to achieve blazing fast tabular data manipulation.

It is possible to input the Preprocessor a Pandas.DataFrame, a Polars.DataFrame or a Polars.LazyFrame.

Installation

You can install the preprocessor by running the following command:

$ pip install clearbox-preprocessor

Preprocessing customization

A bunch of options are available to customize the preprocessing.

The Preprocessor class features the following input arguments, besides the input dataset:

  • discarding_threshold: float (default = 0.9)

    Float number between 0 and 1 to set the threshold for discarding categorical features. If more than discarding_threshold * 100 % of values in a categorical feature are different from each other, then the column is discarded. For example, if discarding_threshold=0.9, a column will be discarded if more than 90% of its values are unique.

  • get_discarded_info: bool (defatult = False)

    When set to 'True', the preprocessor will feature the methods preprocessor.get_discarded_features_reason, which provides information on which columns were discarded and the reason why, and preprocessor.get_single_valued_columns, which provides the values of the single-valued discarded columns. Note that setting get_discarded_info=True will considerably slow down the processing operation! The list of discarded columns will be available even if get_discarded_info=False, so consider setting this flag to True only if you need to know why a column was discarded or, if it contained just one value, what that value was.

  • excluded_col: (default = [])

    List containing the names of the columns to be excluded from processing. These columns will be returned in the final dataframe withouth being manipulated.

  • time: (default = None)

    String name of the time column by which to sort the dataframe in case of time series.

  • scaling_method: (default="none")

    Specifies the scaling operation to perform on numerical features.

    • "none" : no scaling is applied
    • "normalize" : applies normalization to numerical features
    • "standardize" : applies standardization to numerical features
    • "quantile" : Transforms numerical features using quantiles information
  • num_fill_null: (default = "mean")

    Specifies the value to fill null values with or the strategy for filling null values in numerical features.

    • value : fills null values with the specified value
    • "mean" : fills null values with the average of the column
    • "forward" : fills null values with the previous non-null value in the column
    • "backward" : fills null values with the following non-null value in the column
    • "min" : fills null values with the minimum value of the column
    • "max" : fills null values with the maximum value of the column
    • "zero" : fills null values with zeros
    • "one" : fills null values with ones
  • n_bins: (default = 0)

    Integer number that determines the number of bins into which numerical features are discretized. When set to 0, the preprocessing step defaults to the scaling method specified in the 'scaling' atgument instead of discretization.

    Note that if n_bins is different than 0, discretization will take place instead of scaling, regardless of whether the 'scaling' argument is specified.

Timeseries

The Prperocessor also features a timeseries manipulation and feature extraction method called extract_ts_features().

This method takes as input:

  • the preprocessed dataframe
  • the target vector in the form of a Pandas.Series or a Polars.Series
  • the name of the time column
  • the name of the id column to group by

It returns the most relevant features selected among a wide range of features.

Usage

You can start using the Preprocessor by importing it and creating a Pandas.DataFrame or a Polars.LazyFrame:

importpolarsasplfromclearbox_preprocessorimportPreprocessorq=pl.LazyFrame(
{
"cha": ["x", None, "z", "w", "x", "k"],
"int": [123, 124, 223, 431, 435, 432],
"dat": ["2023-1-5T00:34:12.000Z", "2023-2-3T04:31:45.000Z", "2023-2-4T04:31:45.000Z", None, "2023-5-12T21:41:58.000Z", "2023-6-1T17:52:22.000Z"],
"boo": [True, False, None, True, False, False],
"equ": ["a", "a", "a", "a", None, "a"],
"flo": [43.034, 343.1, 224.23, 75.3, None, 83.2],
"str": ["asd", "fgh", "fgh", "", None, "cvb"]
}
).with_columns(pl.col('dat').str.to_datetime("%Y-%m-%dT%H:%M:%S.000Z"))
q.collect()
image

At this point, you can initialize the Preprocessor by passing the LazyFrame or DataFrame created to it and then calling the transform() method to materialize the processed dataframe.

Note that if no argument is specified beyond the dataframe q, the default settings are employed for preprocessing:

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
df
image

Customization example

In the following example, when the Preprocessor is initialized:

  1. The discarding threshold is lowered from 90% to 80% (a column will be discarded if more than 80% of its values are unique).
  2. The discarding featrues informations are stored in the preprocessor instance.
  3. The column "boo" is excluded from the preprocessing and is preserved unchanged.
  4. The scaling method of the numerical features chosen is standardization
  5. The fill null strategy for numerical features is "forward".
preprocessor=Preprocessor(q, get_discarded_info=True, discarding_threshold=0.8, excluded_col= ["boo"], scaling="standardize", num_fill_null="forward"
)
df=preprocessor.transform(q)
df
image

It is possible to inverse transform the processed dataframe with the method preprocessor.inverse_transform().

preprocessor=Preprocessor(q)
df=preprocessor.transform(q)
inverse_df=preprocessor.inverse_transform(df)

If the Processor's argument get_discarded_info is set to True during initialization, it is possible to call the method get_discarded_features_reason() to display the discarded features. In the case of discarded single-valued columns, the value contained is also displayed and is available in a dictionary called single_value_columns, stored in the Preprocessor instance, and can be used as metadata.

preprocessor.get_discarded_features_reason()
image

To do

  • Implement unit tests

About

A fast and felxible data preprocessor based on polars.

Topics

Resources

Stars

7 stars

Watchers

6 watching

Forks

Used by

Contributors

Languages