Как отформатировать разницу в процентных пунктах в Python? - PullRequest
1 голос
/ 03 августа 2020

Я должен представить разницу между двумя процентами, используя Python. Например, разница между 40% и 41,234% составляет 1,234 процентных пункта или 1,234 п.п.

Если бы я хотел отформатировать увеличение в процентах, я бы использовал спецификатор формата {:.0%}:

increase = 0.01234

"{:+.3%} ".format(increase)
>>> "+1.234 %"

То, что я ищу

Спецификатор формата, который заменяет % на pp, например:

"{some_specifier} ".format(increase)
>>> "+1.234 pp"

То, что я не ищу для

Я знаю, что могу использовать такие f-строки

f"{increase * 100:+.3f} pp"
>>> "+1.234 pp"

, но я специально ищу спецификатор формата, который можно использовать с .format().

Edit

Я понял, что здесь может быть полезно немного предыстории. В моей реализации increase может представлять обычное число с плавающей запятой, целое число, процент или процентную точку. Чтобы получить правильное представление, я использовал отображение переменного формата, которое выглядит примерно так:

format_mapping = {
    "var_x": "{:,.0f}",    # for large numbers
    "var_y": "{:+.3f}",    # for small numbers
    "var_z": "{:.4%}",     # for percentages
}

Имена переменных представляют имена столбцов pandas фрейма данных my_data, так что я затем можно применить форматирование к этим столбцам для отчетности

for var in my_data.columns:
    fmt = format_mapping[var]
    my_data[var] = pd.Series(fmt.format(value) for value in my_data[var])

Ответы [ 3 ]

2 голосов
/ 03 августа 2020

Есть вещи, которые вы можете сделать с встроенными каналами и подклассом класса Format, но в этом случае, я думаю, было бы проще просто написать функции для его обработки:

def pct(num, digits=0):
    return '{:+.{}} pp'.format(num * 100, digits)

...

f"{pct(increase, 4)}"
# '+1.234 pp'

затем вы можете поместить все эти функции в их собственный файл, если хотите, и вызывать их, просто вызывая их в f-строках.

1 голос
/ 03 августа 2020

Вы можете объявить пользовательский форматировщик и заменить "%" на "pp", переопределив Formatter.format_field() метод:

from string import Formatter    

class MyFormatter(Formatter):
    def format_field(self, value, spec):
        if spec.endswith("p"):
            return super(MyFormatter, self).format_field(value, spec[:-1] + "%")[:-1] + "pp"
        else:
            return super(MyFormatter, self).format_field(value, spec)

Использование:

print(MyFormatter().format("%: {0:+.3%}; pp: {0:+.3p}", 0.01234))

PS В python 3 можно использовать super() без аргументов.

1 голос
/ 03 августа 2020

Вы можете использовать следующее:

increase = 0.01234

print("{:+.4} {}".format(increase*100, "pp"))

Результат:

+1.234 pp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...