Как показать стилизованный фрейм данных в консоли tkinterPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как показать стилизованный фрейм данных в консоли tkinter

Сообщение Anonymous »

Я написал код Python, предоставленный код представляет собой приложение Python, которое обрабатывает файл Excel и выделяет определенные строки желтым цветом на основе определенных критериев, определенных в различных функциях определения. Он использует библиотеку Pandas для манипулирования данными, Tkinter для графического пользовательского интерфейса и pandastable для отображения DataFrame в формате таблицы. по какой-то причине я не вижу цветовую подсветку в консоли tkinter, однако я вижу ее в сохраненном выводе Excel.
Вот описание функциональности кода:
Импорт: код импортирует необходимые библиотеки: Pandas для манипулирования данными, NumPy для числовых операций, Tkinter для создания графического интерфейса, filedialog для открытия файлов, messagebox для отображения сообщений и pandastable для создания таблиц.Функции выделения: код определяет несколько функций, которые выделяют строки на основе различных критериев:
highlight_missing_values: выделяет строки, в которых отсутствуют определенные столбцы для типов с плавающей ставкой.
highlight_missing_ccy: выделяет строки, в которых отсутствует валюта, но присутствует индекс базовых цен или кривая базовых цен.
highlight_negative_spread: выделяет строки, в которых спред отрицательный для строки типа актива.
highlight_spread_validation: выделяет строки, в которых спред находится за пределами указанного диапазона.
highlight_explicit_validation: выделяет строки, в которых «Интерпретировать записи как Для столбца "Маржа – Явная" для плавающих или управляемых типов ставок не установлено значение.
highlight_COA_ccy: добавляет новый столбец в DataFrame на основе узла планирования и валюты.
Функцияprocess_excel: Эта функция является основной точкой входа в приложение. Он выполняет следующие действия:
Открывает диалоговое окно файла, позволяющее пользователю выбрать файл Excel. Читает разные листы из выбранного файла Excel. Очищает и объединяет данные с листов. Применяет функции выделения к объединенному DataFrame. Отображает DataFrame в пандатаблице в окне Tkinter. Сохраняет выходной DataFrame в новый файл Excel.
Я попробовал приведенный ниже фрагмент кода, но он не выделяет строку желтым цветом в соответствии с определенной функцией в консоли tkinter, я могу посмотрите фрейм данных в консоли tkinter, но он не имеет стиля.
import pandas as pd
import numpy as np
from tkinter import Tk, filedialog, Label, Button, messagebox, Frame
from pandastable import Table

# Function to highlight missing values
def highlight_missing_values(row):
if row['COA_Type'] == 'Floating' and pd.notna(row['Currency']):
is_blank = row[['Lockout period', 'lookback(days)', 'Reset Interval', 'Amortization Type', 'Rate Index/ Coupon Spread Reference Index']].isnull().any()
return 'background-color: yellow' if is_blank else ''
return ''

# Function to highlight missing currency
def highlight_missing_ccy(row):
return 'background-color: yellow' if pd.isna(row['Currency']) and (pd.notna(row['Base Price index']) or pd.notna(row['Base Price Curve'])) else ''

# Function to highlight negative spread
def highlight_negative_spread(row):
return 'background-color: yellow' if row['A/L/O'] == 'A' and row['Period1'] < 0 else ''

# Function to highlight spread validation
def highlight_spread_validation(row):
return 'background-color: yellow' if row['Period1'] > 35 or row['Period1'] < -10 else ''

# Function to highlight explicit validation
def highlight_explicit_validation(row):
return 'background-color: yellow' if row['COA_Type'] in ['Floating', 'Managed'] and pd.notna(row['Interpret Entries As']) and row['Interpret Entries As'] != 'Margin - Explicit' else

# Function to highlight COA currency
def highlight_COA_ccy(df):
new_column_value = None
for index in range(len(df)):
planning_node_str = str(df.loc[index, 'Planning_node'])
if planning_node_str.endswith('(QRM)') or planning_node_str.endswith(' OTHER USD'):
new_column_value = planning_node_str
df.loc[index, 'coa_ccy'] = new_column_value
cols = df.columns.tolist()
planning_node_id_idx = cols.index('Planning_node_id')
cols.insert(planning_node_id_idx + 1, cols.pop(cols.index('coa_ccy')))
return df[cols]

# Function to read the Excel file and perform operations
def process_excel():
# Open file dialog to select Excel file
file_path = filedialog.askopenfilename(title="Select an Excel file", filetypes=(("Excel files", "*.xlsx"), ("All files", "*.*")))
if not file_path:
messagebox.showerror("Error", "No file selected!")
return

try:
xls = pd.ExcelFile(file_path)

# Read sheets from the workbook
sheet1_df = pd.read_excel(xls, sheet_name='Sheet1', header=1)
sheet2_df = pd.read_excel(xls, sheet_name='Sheet2', header=1)
eba_mapping = pd.read_excel(xls, sheet_name='EBA-mapping')
index_currency_df = pd.read_excel(xls, sheet_name='Index-ccy', names=['Index', 'ccy'])

# Data cleaning and merging
sheet1_df = sheet1_df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)
sheet2_df = sheet2_df.apply(lambda x: x.str.strip() if x.dtype == "object" else x)

selected_columns_df1 = sheet1_df[['Planning_node', 'Planning_node_id', 'Base Price index']]
selected_columns_df2 = sheet2_df[['Lockout period', 'lookback(days)', 'Base Price index']]

common_df = pd.concat([selected_columns_df1, selected_columns_df2], join='outer', axis=1, ignore_index=False)

merged_df = pd.merge(common_df, eba_mapping[['COA', 'BS Flag', 'Rate Type']], left_on='Planning_node', right_on='COA', how='left')
merged_df = merged_df.drop(columns=['COA']).rename(columns={'BS Flag': 'A/L/O', 'Rate Type': 'COA_Type'})

# Apply the COA ccy function
merged_df = highlight_COA_ccy(merged_df)

# Display the DataFrame in the pandastable
display_df(merged_df)

# Save the output to an Excel file
output_file = file_path.replace('.xlsx', '_output.xlsx')
merged_df.to_excel(output_file, engine='openpyxl', index=False)
messagebox.showinfo("Success", f"File saved as {output_file}")

except Exception as e:
messagebox.showerror("Error", str(e))

# Function to display the DataFrame in the Tkinter console using pandastable
def display_df(df):
# Clear the previous table if it exists
for widget in output_frame.winfo_children():
widget.destroy()

# Create a new Table in the output_frame
table = Table(output_frame, dataframe=df, showtoolbar=True, showstatusbar=True)
table.show()

# Highlight rows based on logic from highlight functions
for index, row in df.iterrows():
style = highlight_missing_values(row)
style += highlight_missing_ccy(row)
style += highlight_negative_spread(row)
style += highlight_spread_validation(row)
style += highlight_explicit_validation(row)

if style:
table.getWidget().item(index).config(background=style.split(':')[-1])

# Main Tkinter window
root = Tk()
root.title("Excel Processor")
root.geometry("800x600")

# Label and Button
label = Label(root, text="Press the button to select an Excel file for processing.")
label.pack(pady=10)

process_button = Button(root, text="Select Excel File", command=process_excel)
process_button.pack(pady=10)

# Frame for output console
output_frame = Frame(root)
output_frame.pack(pady=10, fill='both', expand=True)

# Run the application
root.mainloop()


Подробнее здесь: https://stackoverflow.com/questions/790 ... er-console
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»