import gradio as gr
import pandas as pd
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import inspect
import io
# style formating for Header
def header(input:str):
"""
Usage:
header('your text')
Output:
...
blocks, one per paragraph.
"""
paragraphs = input.strip().split("
")
text = ''.join(f'{para.strip()}
' for para in paragraphs if para.strip())
return gr.Markdown(text)
# this for displaying dataframe and also provied downlaod csv
def Dataset(df,title, source, key=None):
def get_file():
return source
with gr.Column(elem_classes='dataframe-layout', elem_id=f"dataset-{key}" if key else None):
# Title and download button in a row
with gr.Row():
gr.Markdown(f'{title}
') # title formating
download_btn = gr.DownloadButton(
label="Download CSV",
value=get_file,
elem_id=f"download-{key}" if key else None
)
# Dataframe display
gr.Dataframe(
value=df.head(20),
headers=list(df.columns),
elem_id=f"table-{key}" if key else None,
interactive=False, # read only
# disable the warp for reduce height of data
# wrap=True
)
def describe_value_counts(series):
description = series.describe().to_frame(name='value')
description = description.reset_index() # Move index (stat name) into column
description.columns = ['Statistic', 'Value']
return description
# this is for EDA, preprocess
def plot_distribution(df, column):
"""
Generates a matplotlib plot (bar chart or histogram) showing the distribution
of values in a selected column from the dataframe.
Parameters:
-----------
df : pd.DataFrame
The dataframe to plot from.
column : str
The column name to visualize.
Returns:
--------
matplotlib.figure.Figure
A figure object representing the distribution plot.
"""
fig, ax = plt.subplots(figsize=(10, 5))
if df[column].dtype == 'object' or df[column].nunique() < 20:
# Bar plot for categorical/small unique values
value_counts = df[column].value_counts().head(20)
ax.bar(value_counts.index, value_counts.values)
ax.set_xticklabels(value_counts.index, rotation=45, ha='right')
ax.set_ylabel('Count')
ax.set_title(f'Distribution of {column}')
else:
# Histogram for numerical
ax.hist(df[column].dropna(), bins=100, edgecolor='black')
ax.set_title(f'Distribution of {column}')
ax.set_xlabel(column)
ax.set_ylabel('Frequency')
fig.tight_layout()
return fig
## this is for eda, preprocess, and training
def code_cell(code):
"""
simply syntax for gr.code
Usage :
Code_cell('df = pd.read_csv(path)')
or
using triple string for multiple line
code_cell("""""")
"""
gr.Code(inspect.cleandoc(code), language='python')
## This for EDA, Preprocess, and training
def plot_training_results(x,y1,y2,y1label,y2label,ylabel,xlabel,title=""):
fig,ax=plt.subplots(figsize=(8,5))
ax.plot(x, y1, marker='o', label=y1label, color='blue')
ax.plot(x, y2, marker='s', label=y2label, color='orange')
ax.set_title(title)
ax.set_xlabel(xlabel=xlabel)
ax.set_ylabel(ylabel=ylabel)
ax.legend()
ax.grid(True)
return fig
# for Recommendation section
def input_name_textbox(Label:str, Placeholder:str):
"""
usage:
app_name = input_name_textbox('Input Your App', 'Enter game title...')
Args:
Label (str): Title textbox
Placeholder (str): placeholder text
Returns:
variable : str
"""
inputbox = gr.Textbox(
label=Label,
placeholder=Placeholder,
elem_classes="text-input"
)
return inputbox
def input_number(Label:str,Precision = 0,**kwargs):
"""
usage:
app_name = input_number('Input Number', 'Enter game number...')
Args:
Label (str): Title textbox
Placeholder (str): placeholder text
Returns:
variable : str
"""
inputbox = gr.Number(
label=Label,
elem_classes="text-input",
precision=Precision,
**kwargs
)
return inputbox
def show_missing_values(df:pd.DataFrame):
try:
missing_df = pd.DataFrame(df.isnull().sum(), columns=['Missing Values'])
missing_df = missing_df.reset_index().rename(columns={'index': 'Column'})
return missing_df
except Exception as e:
return pd.DataFrame({'Error': [str(e)]})
def input_paragaph_textbox(Label:str, Placeholder:str):
"""
usage:
paragraph = input_paragaph_textbox('Your Story', 'Type your text...')
Args:
Label (str): Title textbox
Placeholder (str): placeholder text
Returns:
variable : str
"""
paragraph = gr.Textbox(
label=Label,
placeholder=Placeholder,
lines=5,
max_lines=8,
max_length=1200,
elem_classes="text-input"
)
return paragraph
def input_choice(Label:str, Choices:list, Multiselect:bool):
"""Allow user to select choices\n
Multiselect True for multiple choices\n
Multiselect False for single choices\n
Usage:\n
genre = gr.Dropdown(\n
label="Select Your Genre (Multiple Choice)",\n
choices=[\n
'Action', 'Adventure', 'RPG', 'Strategy', 'Simulation',\n
'Casual', 'Indie', 'Sports', 'Racing', 'Fighting',\n
'Puzzle', 'Shooter', 'Platformer', 'MMO', 'Horror',\n
'Survival', 'Open World', 'Visual Novel', 'Point & Click',\n
'Sandbox', 'Metroidvania', 'Tactical', 'Rhythm',\n
'Stealth', 'Rogue-like', 'Rogue-lite'\n
],\n
multiselect=True,\n
value=[],\n
elem_classes="dropdown"\n
)\n
or only single choice \n
price_range_input = gr.Dropdown(\n
label="Select Your Price Range (Only Single Choice)",\n
choices=[\n
'Free',\n
'5$ - 10%',\n
'10$ - 50%',\n
'50$ - 100%',\n
'100$ - 500%',\n
'above 500%',\n
],
multiselect=False,\n
value=[],\n
elem_classes="dropdown"\n
)\n
Args:\n
Label (str): _description_\n
Choices (list): _description_\n
"""
multiple_choice = gr.Dropdown(
label=Label,
choices=Choices,
multiselect=Multiselect, # True Allowing multi select
value=[] if Multiselect else None, # the choosen value will be passed here
elem_classes="dropdown"
)
return multiple_choice