Зарегистрируйте фрейм данных, используя ведение журнала и панды ⇐ Python
Зарегистрируйте фрейм данных, используя ведение журнала и панды
Я использую pandas для работы с кадрами данных и регистрацию для регистрации промежуточных результатов, а также предупреждений и ошибок в отдельный файл журнала. Мне нужно напечатать в один и тот же файл журнала несколько промежуточных кадров данных. В частности, я хочу:
[*]Печатать кадры данных в тот же файл журнала, что и остальные сообщения регистрации (чтобы облегчить отладку и избежать записи множества промежуточных файлов, как в случае с вызовами). в to_csv с указанием места назначения файла), [*]Управляйте подробностью ведения журнала с помощью уровней ведения журнала, например DEBUG или INFO. [*]Управляйте подробностью журнала с помощью отдельной переменной, которая определяет, сколько строк фрейма данных нужно распечатать. [*]Печать по одной строке в каждой строке с выровненными столбцами и каждой строкой, которой предшествуют типичные метаданные журнала, например 240102 10:58:20 INFO: .
Лучшее, что я смог придумать, это приведенный ниже код, который слишком многословен. Есть ли более простой и питонический способ регистрации фрагмента кадра данных?
Пример:
импортировать ввод-вывод журнал импорта импортировать панд как pd # Вывести в журнал такое количество строк из нескольких промежуточных фреймов данных, # установлено значение 20 или около того: MAX_NUM_DF_LOG_LINES = 4 logging.basicConfig( datefmt = '%y%m%d %H:%M:%S', format = '%(asctime)s %(имя уровня)s: %(сообщение)s') logger = logging.getLogger(__name__) # Или logging.DEBUG и т. д.: logger.setLevel(уровень = logging.INFO) # Пример простого сообщения журнала: logger.info('Чтение ввода.') ТЕСТДАТА=""" ферментативные области N длина ааа все 10 238045 ааа все 20 170393 Ааа я поймал 10 292735 Ааа я поймал 20 229824 АагИ все 10 88337 АагИ все 20 19144 AagI захватил 10 34463 AagI захватила 20 19220 """ df = pd.read_csv(io.StringIO(TESTDATA), sep='\s+') # ...некоторый код.... # Пример сообщения журнала с фрагментом кадра данных, здесь с использованием # `head` (но это может быть другой метод, разрезающий кадр данных): logger.debug('менее важные промежуточные результаты: df:') для строки в df.head(MAX_NUM_DF_LOG_LINES).to_string().splitlines(): logger.debug(строка) # ...еще код.... logger.info('более важные промежуточные результаты: df:') для строки в df.head(MAX_NUM_DF_LOG_LINES).to_string().splitlines(): logger.info (строка) # ...еще код.... Печать:
240102 10:58:20 ИНФОРМАЦИЯ: Чтение ввода. 240102 10:58:20 ИНФО: более важные промежуточные результаты: df: 240102 10:58:20 ИНФОРМАЦИЯ: длина N участков фермента 240102 10:58:20 ИНФО: 0 аааи все 10 238045 240102 10:58:20 ИНФО: 1 АааИ все 20 170393 240102 10:58:20 ИНФО: 2 AaaI захвачено 10 292735 240102 10:58:20 ИНФО: 3 AaaI захвачено 20 229824 Связано:
Ничто из этого не достигает того, что я пытаюсь сделать, но оно приближается:
[*]Как распечатать многострочные журналы с помощью модуля журналирования Python? - см. этот комментарий, который аккуратен, но не очень питоничен, поскольку он вызывает print изнутри понимания списка, а затем отбрасывает результат: "Обратите внимание, что последний работает только на py2 из-за чтобы отображать лениво; вы можете сделать [logger.info(line) for line in 'line 1\nline 2\nline 3'.splitlines()] на py3. – Кюухати, 22 июня 2021 г., 16:30" [*]Записать или зарегистрировать вывод данных pandas Dataframe — он печатает что-то вроде этого, то есть в начале каждой строки отсутствуют метаданные временной метки/уровня: 240102 12:27:19 ИНФОРМАЦИЯ: заголовок кадра данных - длина N областей фермента 0 аааи все 10 238045 1 аааи все 20 170393 2 AaaI захватили 10 292735 ... [*]Как записать кадр данных в выходной файл — то же, что и в предыдущем ответе.
Я использую pandas для работы с кадрами данных и регистрацию для регистрации промежуточных результатов, а также предупреждений и ошибок в отдельный файл журнала. Мне нужно напечатать в один и тот же файл журнала несколько промежуточных кадров данных. В частности, я хочу:
[*]Печатать кадры данных в тот же файл журнала, что и остальные сообщения регистрации (чтобы облегчить отладку и избежать записи множества промежуточных файлов, как в случае с вызовами). в to_csv с указанием места назначения файла), [*]Управляйте подробностью ведения журнала с помощью уровней ведения журнала, например DEBUG или INFO. [*]Управляйте подробностью журнала с помощью отдельной переменной, которая определяет, сколько строк фрейма данных нужно распечатать. [*]Печать по одной строке в каждой строке с выровненными столбцами и каждой строкой, которой предшествуют типичные метаданные журнала, например 240102 10:58:20 INFO: .
Лучшее, что я смог придумать, это приведенный ниже код, который слишком многословен. Есть ли более простой и питонический способ регистрации фрагмента кадра данных?
Пример:
импортировать ввод-вывод журнал импорта импортировать панд как pd # Вывести в журнал такое количество строк из нескольких промежуточных фреймов данных, # установлено значение 20 или около того: MAX_NUM_DF_LOG_LINES = 4 logging.basicConfig( datefmt = '%y%m%d %H:%M:%S', format = '%(asctime)s %(имя уровня)s: %(сообщение)s') logger = logging.getLogger(__name__) # Или logging.DEBUG и т. д.: logger.setLevel(уровень = logging.INFO) # Пример простого сообщения журнала: logger.info('Чтение ввода.') ТЕСТДАТА=""" ферментативные области N длина ааа все 10 238045 ааа все 20 170393 Ааа я поймал 10 292735 Ааа я поймал 20 229824 АагИ все 10 88337 АагИ все 20 19144 AagI захватил 10 34463 AagI захватила 20 19220 """ df = pd.read_csv(io.StringIO(TESTDATA), sep='\s+') # ...некоторый код.... # Пример сообщения журнала с фрагментом кадра данных, здесь с использованием # `head` (но это может быть другой метод, разрезающий кадр данных): logger.debug('менее важные промежуточные результаты: df:') для строки в df.head(MAX_NUM_DF_LOG_LINES).to_string().splitlines(): logger.debug(строка) # ...еще код.... logger.info('более важные промежуточные результаты: df:') для строки в df.head(MAX_NUM_DF_LOG_LINES).to_string().splitlines(): logger.info (строка) # ...еще код.... Печать:
240102 10:58:20 ИНФОРМАЦИЯ: Чтение ввода. 240102 10:58:20 ИНФО: более важные промежуточные результаты: df: 240102 10:58:20 ИНФОРМАЦИЯ: длина N участков фермента 240102 10:58:20 ИНФО: 0 аааи все 10 238045 240102 10:58:20 ИНФО: 1 АааИ все 20 170393 240102 10:58:20 ИНФО: 2 AaaI захвачено 10 292735 240102 10:58:20 ИНФО: 3 AaaI захвачено 20 229824 Связано:
Ничто из этого не достигает того, что я пытаюсь сделать, но оно приближается:
[*]Как распечатать многострочные журналы с помощью модуля журналирования Python? - см. этот комментарий, который аккуратен, но не очень питоничен, поскольку он вызывает print изнутри понимания списка, а затем отбрасывает результат: "Обратите внимание, что последний работает только на py2 из-за чтобы отображать лениво; вы можете сделать [logger.info(line) for line in 'line 1\nline 2\nline 3'.splitlines()] на py3. – Кюухати, 22 июня 2021 г., 16:30" [*]Записать или зарегистрировать вывод данных pandas Dataframe — он печатает что-то вроде этого, то есть в начале каждой строки отсутствуют метаданные временной метки/уровня: 240102 12:27:19 ИНФОРМАЦИЯ: заголовок кадра данных - длина N областей фермента 0 аааи все 10 238045 1 аааи все 20 170393 2 AaaI захватили 10 292735 ... [*]Как записать кадр данных в выходной файл — то же, что и в предыдущем ответе.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение