Source code for ppc_robot_lib.reporting.transformation.sorting

import pandas as pd

from ppc_robot_lib.utils.types import OrderBy, Order
import pandas


[docs] def sort_values( table: pandas.DataFrame, order: list[OrderBy] | tuple[OrderBy, ...], inplace: bool = True ) -> pandas.DataFrame: """ Sorts the table by one or more columns. **Example:** >>> from ppc_robot_lib.steps.transformations import SortStep >>> from ppc_robot_lib.utils.types import Order, OrderBy >>> SortStep("in_table", order=[ ... OrderBy("Impressions", Order.DESC), ... OrderBy("CampaignName", Order.ASC), ... ]) :param table: Input table. :param order: List of :py:class:`ppc_robot_lib.utils.types.OrderBy` objects that specify the sorting order. :param inplace: Perform inplace sorting? :return: Sorted table. If ``inplace=True``, the same instance is returned. """ columns = [] ascending = [] for order_by in order: columns.append(order_by.column) ascending.append(False if order_by.order is Order.DESC else True) if not columns: return table new_table = table.sort_values(by=columns, ascending=ascending, inplace=inplace) if inplace: return table else: return new_table
def sort_according_to_parameters( table, parameters: list, abstract_columns: dict[str, list[str]] = None ) -> pd.DataFrame: """ Sorts table according to additional columns parameter 'order' if it exists :param table: :param parameters: :param abstract_columns: special user columns normally referencing to set of columns EXAMPLE input: abstract_columns = {'_name': ['CampaignName', 'AdGroupName', 'Criteria']} parameter = [{'field': '_name', 'order': 'ASC'}] output to sort: order = [ OrderBy(column='CampaignName', order=Order.ASC), OrderBy(column='AdGroupName', order=Order.ASC), OrderBy(column='Criteria', order=Order.ASC), ] :return: sorted table """ order: list = [] for parameter in parameters: if isinstance(parameter, dict) and 'order' in parameter.keys(): if abstract_columns and parameter['field'] in abstract_columns: for abstract_column in abstract_columns[parameter['field']]: if abstract_column in table.columns: order.append( OrderBy( column=abstract_column, order=Order.ASC if parameter['order'] == 'ASC' else Order.DESC ) ) else: # there is not condition to check column is in table cause it could not happen order.append( OrderBy(column=parameter['field'], order=Order.ASC if parameter['order'] == 'ASC' else Order.DESC) ) return sort_values(table, order=order)