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)