CoolFace
Apppublic

yes2code/Data-Analytics

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
app.py1046 linesDownload Raw Back to root
1import streamlit as st2import numpy as np3import pandas as pd4import io5import matplotlib.pyplot as plt6from matplotlib.ticker import PercentFormatter7import seaborn as sns8from sklearn.preprocessing import (9    OneHotEncoder,10    OrdinalEncoder,11    StandardScaler,12    MinMaxScaler,13)14from sklearn.model_selection import train_test_split15from imblearn.under_sampling import RandomUnderSampler16from imblearn.over_sampling import RandomOverSampler, SMOTE17from sklearn.linear_model import Ridge, Lasso, LogisticRegression18from sklearn.tree import DecisionTreeRegressor, DecisionTreeClassifier19from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier20from sklearn.svm import SVR, SVC21from sklearn.naive_bayes import MultinomialNB22from xgboost import XGBRFRegressor, XGBRFClassifier23from lightgbm import LGBMRegressor, LGBMClassifier24from sklearn.metrics import (25    mean_absolute_error,26    mean_squared_error,27    mean_squared_error,28    r2_score,29)30from sklearn.metrics import (31    accuracy_score,32    f1_score,33    confusion_matrix,34    precision_score,35    recall_score,36)37import pickle38 39st.set_page_config(page_title="Data Analytics", page_icon="📊")40sns.set_style("white")41sns.set_context("poster", font_scale=0.7)42palette = [43    "#1d7874",44    "#679289",45    "#f4c095",46    "#ee2e31",47    "#ffb563",48    "#918450",49    "#f85e00",50    "#a41623",51    "#9a031e",52    "#d6d6d6",53    "#ffee32",54    "#ffd100",55    "#333533",56    "#202020",57]58 59 60def main():61    file = st.sidebar.file_uploader("Upload Your CSV File Here: ")62    #st.markdown("**Process the uploaded CSV file**")63    process = st.sidebar.button("Process files")64    option = st.sidebar.radio(65        "Select Data Analysis: ",66        (67            "Exploratory Data Analysis",68            "Univariate Analysis",69            "Bivariate Analysis",70 71        ),72    )73    placeholder = st.empty()74    placeholder.markdown(75    "<h1 style='text-align: center;'>Tabular/CSV Data Analytics📊</h1>",76    unsafe_allow_html=True77)78 79 80    if file is not None and process:81        data = load_csv(file)82        st.session_state["data"] = data83 84    if "data" in st.session_state:85        data = st.session_state["data"]86        placeholder.empty()87 88        if option == "Exploratory Data Analysis":89            st.markdown(90                "<h1 style='text-align: center;'>Exploratory Data Analysis</h1>", unsafe_allow_html=True91            )92 93            st.subheader("Data Overview")94            st.write(data_overview(data))95            st.write(duplicate(data))96            st.dataframe(data.head())97 98            st.subheader("Data Types and Unique Value Counts")99            display_data_info(data)100 101            st.subheader("Missing Data")102            missing_data(data)103 104            st.subheader("Value Counts")105            value_counts(data)106 107            st.subheader("Descriptive Statistics")108            st.write(data.describe().T)109 110        if option == "Univariate Analysis":111            st.markdown(112                "<h1 style='text-align: center;'>Univariate Analysis</h1>",113                unsafe_allow_html=True,114            )115            plot = st.radio(116                "Select a chart: ",117                ("Count Plot", "Pie Chart", "Histogram", "Violin Plot", "Scatter Plot"),118            )119 120            if plot == "Count Plot":121                column = st.selectbox(122                    "Select a column", [""] + list(data.select_dtypes("O"))123                )124                if column:125                    countplot(data, column)126 127            if plot == "Pie Chart":128                column = st.selectbox(129                    "Select a column", [""] + list(data.select_dtypes("O"))130                )131                if column:132                    piechart(data, column)133 134            if plot == "Histogram":135                column = st.selectbox(136                    "Select a column",137                    [""] + list(data.select_dtypes(include=["int", "float"])),138                )139                if column:140                    histogram(data, column)141 142            if plot == "Violin Plot":143                column = st.selectbox(144                    "Select a column",145                    [""] + list(data.select_dtypes(include=["int", "float"])),146                )147                if column:148                    violinplot(data, column)149 150            if plot == "Scatter Plot":151                column = st.selectbox(152                    "Select a column",153                    [""] + list(data.select_dtypes(include=["int", "float"])),154                )155                if column:156                    scatterplot(data, column)157 158        if option == "Bivariate Analysis":159            st.markdown(160                "<h1 style='text-align: center;'>Bivariate Analysis</h1>",161                unsafe_allow_html=True,162            )163            plot = st.radio(164                "Select a chart: ",165                ("Scatter Plot", "Bar Plot", "Box Plot", "Pareto Chart"),166            )167 168            if plot == "Scatter Plot":169                columns = st.multiselect(170                    "Select two columns",171                    [""] + list(data.select_dtypes(include=["int", "float"])),172                )173 174                if columns:175                    biscatterplot(data, columns)176 177            if plot == "Bar Plot":178                columns = st.multiselect("Select two columns", list(data.columns))179 180                if columns:181                    bibarplot(data, columns)182 183            if plot == "Box Plot":184                columns = st.multiselect("Select two columns", list(data.columns))185 186                if columns:187                    biboxplot(data, columns)188 189            if plot == "Pareto Chart":190                column = st.selectbox(191                    "Select a columns",192                    [""] + list(data.select_dtypes(include="object")),193                )194 195                if column:196                    paretoplot(data, column)197 198        if option == "Preprocess":199            st.markdown(200                "<h1 style='text-align: center;'>Data Preprocessing</h1>",201                unsafe_allow_html=True,202            )203 204            operation = st.radio(205                "Select preprocessing step: ",206                (207                    "Drop Columns",208                    "Handling Missing Values",209                    "Encode Categorical Features",210                ),211            )212 213            if operation == "Drop Columns":214                columns = st.multiselect("Select Columns to drop: ", (data.columns))215                drop_columns = st.button("Drop Columns")216                if drop_columns:217                    data.drop(columns, axis=1, inplace=True)218                    st.success("Dropped selected columns✅✅✅")219 220            elif operation == "Handling Missing Values":221                num_missing = st.selectbox(222                    "Select a Approach (Numerical columns only): ",223                    ("", "Drop", "Backward Fill", "Forward Fill", "Mean", "Median"),224                ).lower()225 226                cat_missing = st.selectbox(227                    "Select a Approach (Categorical columns only): ",228                    ("", "Drop", "Most Frequent Values", "Replace with 'Unknown'"),229                ).lower()230                hmv = st.button("Handle Missing Values")231 232                if hmv:233                    if num_missing:234                        num_data = data.select_dtypes(include=["int64", "float64"])235 236                        if num_missing == "drop":237                            data = data.dropna(subset=num_data.columns)238 239                        elif num_missing in [240                            "mean",241                            "median",242                            "backward fill",243                            "forward fill",244                        ]:245                            if num_missing == "mean":246                                fill_values = num_data.mean()247                            elif num_missing == "median":248                                fill_values = num_data.median()249                            elif num_missing == "backward fill":250                                fill_values = num_data.bfill()251                            elif num_missing == "forward fill":252                                fill_values = num_data.ffill()253 254                            data.fillna(value=fill_values, inplace=True)255 256                            st.success(257                                "Imputed missing values in numerical columns with selected approach."258                            )259 260                    if cat_missing:261                        cat_data = data.select_dtypes(exclude=["int", "float"])262 263                        if cat_missing == "drop":264                            data = data.dropna(subset=cat_data.columns)265 266                        elif cat_missing == "most frequent values":267                            mode_values = data[cat_data.columns].mode().iloc[0]268                            data[cat_data.columns] = data[cat_data.columns].fillna(269                                mode_values270                            )271 272                        elif cat_missing == "replace with 'unknown'":273                            data[cat_data.columns] = data[cat_data.columns].fillna(274                                "Unknown"275                            )276 277                        st.success(278                            "Imputed missing values in categorical columns with selected approach."279                        )280 281            elif operation == "Encode Categorical Features":282                oe_columns = st.multiselect(283                    "Choose Columns for Ordinal Encoding",284                    [""] + list(data.select_dtypes(include="object")),285                )286                st.info("Other columns will be One Hot Encoded.")287 288                encode_columns = st.button("Encode Columns")289 290                if encode_columns:291                    bool_columns = data.select_dtypes(include=bool).columns292                    data[bool_columns] = data[bool_columns].astype(int)293                    if oe_columns:294                        oe = OrdinalEncoder()295                        data[oe_columns] = oe.fit_transform(296                            data[oe_columns].astype("str")297                        )298 299                    try:300                        remaining_cat_cols = [301                        col302                        for col in data.select_dtypes(include="object")303                        if col not in oe_columns304                    ]305                    except:306                        pass307 308                    if len(remaining_cat_cols) > 0:309                        data = pd.get_dummies(310                            data, columns=remaining_cat_cols, drop_first=False311                        )312                        st.success("Encoded categorical columns")313 314 315                bool_columns = data.select_dtypes(include=bool).columns316                data[bool_columns] = data[bool_columns].astype(int)317            st.session_state["data"] = data318 319 320                321 322 323            preprocessed_data_csv = data.to_csv(index=False)324            preprocessed_data_buffer = io.StringIO()325            preprocessed_data_buffer.write(preprocessed_data_csv)326            preprocessed_data_bytes = preprocessed_data_buffer.getvalue()327            if st.download_button(328                label="Download Preprocessed Data",329                key="preprocessed_data",    330                on_click=None,331                data=preprocessed_data_bytes.encode(),332                file_name="preprocessed_data.csv",333                mime="text/csv",334            ):335                st.success('Data Downloaded')336 337 338        if option == "Training and Evaluation":339            st.markdown(340                "<h1 style='text-align: center;'>Training and Evaluation</h1>",341                unsafe_allow_html=True,342            )343            algo = st.selectbox("Choose Algorithm Type:", ("", "Regression", "Classification"))344 345            if algo == "Regression":346                target = st.selectbox("Chose Target Variable (Y): ", list(data.columns))347 348                try:349                    X = data.drop(target, axis=1)350                    Y = data[target]351                except Exception as e:352                    st.write(str(e))353 354                st.write(355                    "80% of the data will be used for training the model, rest of 20% data will be used for evaluating the model."356                )357                X_train, X_test, y_train, y_test = train_test_split(358                    X, Y, test_size=0.2, random_state=42359                )360 361                scale = st.selectbox(362                    "Choose how do you want to scale features:",363                    ("", "Standard Scaler", "Min Max Scaler"),364                )365 366                if scale == "Standard Scaler":367                    scaler = StandardScaler()368                    X_train = scaler.fit_transform(X_train)369                    X_test = scaler.transform(X_test)370 371                elif scale == "Min Max Scaler":372                    scaler = MinMaxScaler()373                    X_train = scaler.fit_transform(X_train)374                    X_test = scaler.transform(X_test)375 376                model = st.selectbox(377                    "Choose Regression Model for training: ",378                    (379                        "",380                        "Ridge Regression",381                        "Decision Tree Regressor",382                        "Random Forest Regressor",383                        "SVR",384                        "XGBRF Regressor",385                        "LGBM Regressor",386                    ),387                )388 389                if model == "Ridge Regression":390                    reg = Ridge(alpha=1.0)391                    reg.fit(X_train, y_train)392                    pred = reg.predict(X_test)393                    st.write(394                        "Mean Absolute Error (MAE): {:.4f}".format(395                            mean_absolute_error(pred, y_test)396                        )397                    )398                    st.write(399                        "Mean Squared Error (MSE): {:.4f}".format(400                            mean_squared_error(pred, y_test)401                        )402                    )403                    st.write(404                        "Root Mean Squared Error (RMSE): {:.4f}".format(405                            mean_squared_error(pred, y_test, squared=False)406                        )407                    )408                    st.write("R-squared (R²): {:.4f}".format(r2_score(pred, y_test)))409 410                    if st.download_button(411                        label="Download Trained Model",412                        key="trained_model",413                        on_click=None,414                        data=pickle.dumps(reg),415                        file_name="ridge_regression_model.pkl",416                        mime="application/octet-stream",417                    ):418                        with open("ridge_regression_model.pkl", "wb") as model_file:419                            pickle.dump(reg, model_file)420 421                elif model == "Decision Tree Regressor":422                    reg = DecisionTreeRegressor(max_depth=10)423                    reg.fit(X_train, y_train)424                    pred = reg.predict(X_test)425                    st.write(426                        "Mean Absolute Error (MAE): {:.4f}".format(427                            mean_absolute_error(pred, y_test)428                        )429                    )430                    st.write(431                        "Mean Squared Error (MSE): {:.4f}".format(432                            mean_squared_error(pred, y_test)433                        )434                    )435                    st.write(436                        "Root Mean Squared Error (RMSE): {:.4f}".format(437                            mean_squared_error(pred, y_test, squared=False)438                        )439                    )440                    st.write("R-squared (R²): {:.4f}".format(r2_score(pred, y_test)))441 442                    if st.download_button(443                        label="Download Trained Model",444                        key="trained_model",445                        on_click=None,446                        data=pickle.dumps(reg),447                        file_name="decision_tree_regression_model.pkl",448                        mime="application/octet-stream",449                    ):450                        with open(451                            "decision_tree_regression_model.pkl", "wb"452                        ) as model_file:453                            pickle.dump(reg, model_file)454 455                elif model == "Random Forest Regressor":456                    reg = RandomForestRegressor(max_depth=10, n_estimators=100)457                    reg.fit(X_train, y_train)458                    pred = reg.predict(X_test)459                    st.write(460                        "Mean Absolute Error (MAE): {:.4f}".format(461                            mean_absolute_error(pred, y_test)462                        )463                    )464                    st.write(465                        "Mean Squared Error (MSE): {:.4f}".format(466                            mean_squared_error(pred, y_test)467                        )468                    )469                    st.write(470                        "Root Mean Squared Error (RMSE): {:.4f}".format(471                            mean_squared_error(pred, y_test, squared=False)472                        )473                    )474                    st.write("R-squared (R²): {:.4f}".format(r2_score(pred, y_test)))475 476                    if st.download_button(477                        label="Download Trained Model",478                        key="trained_model",479                        on_click=None,480                        data=pickle.dumps(reg),481                        file_name="random_forest_regression_model.pkl",482                        mime="application/octet-stream",483                    ):484                        with open(485                            "random_forest_regression_model.pkl", "wb"486                        ) as model_file:487                            pickle.dump(reg, model_file)488 489                elif model == "SVR":490                    reg = SVR(C=1.0, epsilon=0.2)491                    reg.fit(X_train, y_train)492                    pred = reg.predict(X_test)493                    st.write(494                        "Mean Absolute Error (MAE): {:.4f}".format(495                            mean_absolute_error(pred, y_test)496                        )497                    )498                    st.write(499                        "Mean Squared Error (MSE): {:.4f}".format(500                            mean_squared_error(pred, y_test)501                        )502                    )503                    st.write(504                        "Root Mean Squared Error (RMSE): {:.4f}".format(505                            mean_squared_error(pred, y_test, squared=False)506                        )507                    )508                    st.write("R-squared (R²): {:.4f}".format(r2_score(pred, y_test)))509 510                    if st.download_button(511                        label="Download Trained Model",512                        key="trained_model",513                        on_click=None,514                        data=pickle.dumps(reg),515                        file_name="svr_model.pkl",516                        mime="application/octet-stream",517                    ):518                        with open("svr_model.pkl", "wb") as model_file:519                            pickle.dump(reg, model_file)520 521                elif model == "XGBRF Regressor":522                    reg = XGBRFRegressor(reg_lambda=1)523                    reg.fit(X_train, y_train)524                    pred = reg.predict(X_test)525                    st.write(526                        "Mean Absolute Error (MAE): {:.4f}".format(527                            mean_absolute_error(pred, y_test)528                        )529                    )530                    st.write(531                        "Mean Squared Error (MSE): {:.4f}".format(532                            mean_squared_error(pred, y_test)533                        )534                    )535                    st.write(536                        "Root Mean Squared Error (RMSE): {:.4f}".format(537                            mean_squared_error(pred, y_test, squared=False)538                        )539                    )540                    st.write("R-squared (R²): {:.4f}".format(r2_score(pred, y_test)))541 542                    if st.download_button(543                        label="Download Trained Model",544                        key="trained_model",545                        on_click=None,546                        data=pickle.dumps(reg),547                        file_name="xgbrf_regression_model.pkl",548                        mime="application/octet-stream",549                    ):550                        with open("xgbrf_regression_model.pkl", "wb") as model_file:551                            pickle.dump(reg, model_file)552 553                elif model == "LGBM Regressor":554                    reg = LGBMRegressor(reg_lambda=1)555                    reg.fit(X_train, y_train)556                    pred = reg.predict(X_test)557                    st.write(558                        "Mean Absolute Error (MAE): {:.4f}".format(559                            mean_absolute_error(pred, y_test)560                        )561                    )562                    st.write(563                        "Mean Squared Error (MSE): {:.4f}".format(564                            mean_squared_error(pred, y_test)565                        )566                    )567                    st.write(568                        "Root Mean Squared Error (RMSE): {:.4f}".format(569                            mean_squared_error(pred, y_test, squared=False)570                        )571                    )572                    st.write("R-squared (R²): {:.4f}".format(r2_score(pred, y_test)))573 574                    if st.download_button(575                        label="Download Trained Model",576                        key="trained_model",577                        on_click=None,578                        data=pickle.dumps(reg),579                        file_name="lgbm_regression_model.pkl",580                        mime="application/octet-stream",581                    ):582                        with open("lgbm_regression_model.pkl", "wb") as model_file:583                            pickle.dump(reg, model_file)584 585            elif algo == "Classification":586                target = st.selectbox("Chose Target Variable (Y): ", list(data.columns))587 588                try:589                    X = data.drop(target, axis=1)590                    Y = data[target]591                except Exception as e:592                    st.write(str(e))593 594                st.write(595                    "80% of the data will be used for training the model, rest of 20% data will be used for evaluating the model."596                )597                X_train, X_test, y_train, y_test = train_test_split(598                    X, Y, test_size=0.2, random_state=42599                )600 601                balance = st.selectbox(602                    "Do you want to balance dataset?", ("", "Yes", "No")603                )604                if balance == "Yes":605                    piechart(data, target)606 607                    sample = st.selectbox(608                        "Which approach you want to use?",609                        ("", "Random Under Sampling", "Random Over Sampling", "SMOTE"),610                    )611 612                    if sample == "Random Under Sampling":613                        rus = RandomUnderSampler(random_state=42)614                        X_train, y_train = rus.fit_resample(X_train, y_train)615 616                    elif sample == "Random Over Sampling":617                        ros = RandomOverSampler(random_state=42)618                        X_train, y_train = ros.fit_resample(X_train, y_train)619 620                    elif sample == "SMOTE":621                        smote = SMOTE(random_state=42)622                        X_train, y_train = smote.fit_resample(X_train, y_train)623 624                scale = st.selectbox(625                    "Choose how do you want to scale features:",626                    ("", "Standard Scaler", "Min Max Scaler"),627                )628 629 630                if scale == "Standard Scaler":631                    scaler = StandardScaler()632                    X_train = scaler.fit_transform(X_train)633                    X_test = scaler.transform(X_test)634 635                elif scale == "Min Max Scaler":636                    scaler = MinMaxScaler()637                    X_train = scaler.fit_transform(X_train)638                    X_test = scaler.transform(X_test)639 640                model = st.selectbox(641                    "Choose Classification Model for training: ",642                    (643                        "",644                        "Logistic Regression",645                        "Decision Tree Classifier",646                        "Random Forest Classifier",647                        "SVC",648                        "XGBRF Classifier",649                        "LGBM Classifier",650                    ),651                )652 653                if model == "Logistic Regression":654                    clf = LogisticRegression(penalty="l2")655                    clf.fit(X_train, y_train)656                    pred = clf.predict(X_test)657                    st.write(658                        "Accuracy Score: {:.4f}".format(accuracy_score(pred, y_test))659                    )660 661                    try:662                        st.write("F1 Score: {:.4f}".format(f1_score(pred, y_test)))663                        st.write('Precision Score: {:.4f}' .format(precision_score(pred, y_test)))664                        st.write('Recall Score: {:.4f}'.format(recall_score(pred, y_test)))665                    except ValueError:666                        st.write('Macro Precision Score: {:.4f}' .format(precision_score(pred, y_test, average='macro')))667                        st.write('Macro Recall Score: {:.4f}'.format(recall_score(pred, y_test, average='macro'))) 668                        st.write("Macro F1 Score: {:.4f}".format(f1_score(pred, y_test, average='macro')))669        670 671                    plot_confusion_matrix(672                        pred, y_test, "Logistic Regression Confusion Matrix "673                    )674 675                    if st.download_button(676                        label="Download Trained Model",677                        key="trained_model",678                        on_click=None,679                        data=pickle.dumps(clf),680                        file_name="logistic_regression_model.pkl",681                        mime="application/octet-stream",682                    ):683                        with open("logistic_regression_model.pkl", "wb") as model_file:684                            pickle.dump(clf, model_file)685 686                if model == "Decision Tree Classifier":687                    clf = DecisionTreeClassifier(max_depth=5)688                    clf.fit(X_train, y_train)689                    pred = clf.predict(X_test)690                    st.write(691                        "Accuracy Score: {:.4f}".format(accuracy_score(pred, y_test))692                    )693                    try:694                        st.write("F1 Score: {:.4f}".format(f1_score(pred, y_test)))695                        st.write('Precision Score: {:.4f}' .format(precision_score(pred, y_test)))696                        st.write('Recall Score: {:.4f}'.format(recall_score(pred, y_test)))697                    except ValueError:698                        st.write('Macro Precision Score: {:.4f}' .format(precision_score(pred, y_test, average='macro')))699                        st.write('Macro Recall Score: {:.4f}'.format(recall_score(pred, y_test, average='macro'))) 700                        st.write("Macro F1 Score: {:.4f}".format(f1_score(pred, y_test, average='macro')))701                                           702                    plot_confusion_matrix(703                        pred, y_test, "DecisionTree Classifier Confusion Matrix "704                    )705 706                    if st.download_button(707                        label="Download Trained Model",708                        key="trained_model",709                        on_click=None,710                        data=pickle.dumps(clf),711                        file_name="decision_tree_classifier_model.pkl",712                        mime="application/octet-stream",713                    ):714                        with open(715                            "decision_tree_classifier_model.pkl", "wb"716                        ) as model_file:717                            pickle.dump(clf, model_file)718 719                if model == "Random Forest Classifier":720                    clf = RandomForestClassifier(n_estimators=100, max_depth=5)721                    clf.fit(X_train, y_train)722                    pred = clf.predict(X_test)723                    st.write(724                        "Accuracy Score: {:.4f}".format(accuracy_score(pred, y_test))725                    )726                    try:727                        st.write("F1 Score: {:.4f}".format(f1_score(pred, y_test)))728                        st.write('Precision Score: {:.4f}' .format(precision_score(pred, y_test)))729                        st.write('Recall Score: {:.4f}'.format(recall_score(pred, y_test)))730                    except ValueError:731                        st.write('Macro Precision Score: {:.4f}' .format(precision_score(pred, y_test, average='macro')))732                        st.write('Macro Recall Score: {:.4f}'.format(recall_score(pred, y_test, average='macro'))) 733                        st.write("Macro F1 Score: {:.4f}".format(f1_score(pred, y_test, average='macro')))734                    735                    plot_confusion_matrix(736                        pred, y_test, "RandomForest Classifier Confusion Matrix "737                    )738 739                    if st.download_button(740                        label="Download Trained Model",741                        key="trained_model",742                        on_click=None,743                        data=pickle.dumps(clf),744                        file_name="random_forest_classifier_model.pkl",745                        mime="application/octet-stream",746                    ):747                        with open(748                            "random_forest_classifier_model.pkl", "wb"749                        ) as model_file:750                            pickle.dump(clf, model_file)751 752                if model == "SVC":753                    clf = SVC(C=1.5)754                    clf.fit(X_train, y_train)755                    pred = clf.predict(X_test)756                    st.write(757                        "Accuracy Score: {:.4f}".format(accuracy_score(pred, y_test))758                    )759                    try:760                        st.write("F1 Score: {:.4f}".format(f1_score(pred, y_test)))761                        st.write('Precision Score: {:.4f}' .format(precision_score(pred, y_test)))762                        st.write('Recall Score: {:.4f}'.format(recall_score(pred, y_test)))763                    except ValueError:764                        st.write('Macro Precision Score: {:.4f}' .format(precision_score(pred, y_test, average='macro')))765                        st.write('Macro Recall Score: {:.4f}'.format(recall_score(pred, y_test, average='macro'))) 766                        st.write("Macro F1 Score: {:.4f}".format(f1_score(pred, y_test, average='macro')))767                    768 769                    plot_confusion_matrix(pred, y_test, "SVC Confusion Matrix ")770 771                    if st.download_button(772                        label="Download Trained Model",773                        key="trained_model",774                        on_click=None,775                        data=pickle.dumps(clf),776                        file_name="svc_model.pkl",777                        mime="application/octet-stream",778                    ):779                        with open("svc_model.pkl", "wb") as model_file:780                            pickle.dump(clf, model_file)781 782                if model == "XGBRF Classifier":783                    clf = XGBRFClassifier(reg_lambda=1.0)784                    clf.fit(X_train, y_train)785                    pred = clf.predict(X_test)786                    st.write(787                        "Accuracy Score: {:.4f}".format(accuracy_score(pred, y_test))788                    )789                    try:790                        st.write("F1 Score: {:.4f}".format(f1_score(pred, y_test)))791                        st.write('Precision Score: {:.4f}' .format(precision_score(pred, y_test)))792                        st.write('Recall Score: {:.4f}'.format(recall_score(pred, y_test)))793                    except ValueError:794                        st.write('Macro Precision Score: {:.4f}' .format(precision_score(pred, y_test, average='macro')))795                        st.write('Macro Recall Score: {:.4f}'.format(recall_score(pred, y_test, average='macro'))) 796                        st.write("Macro F1 Score: {:.4f}".format(f1_score(pred, y_test, average='macro')))797                    798 799                    plot_confusion_matrix(800                        pred, y_test, "XGBRF Classifier Confusion Matrix "801                    )802 803                    if st.download_button(804                        label="Download Trained Model",805                        key="trained_model",806                        on_click=None,807                        data=pickle.dumps(clf),808                        file_name="xgbrf_classifier_model.pkl",809                        mime="application/octet-stream",810                    ):811                        with open("xgbrf_classifier_model.pkl", "wb") as model_file:812                            pickle.dump(clf, model_file)813 814                if model == "LGBM Classifier":815                    clf = LGBMClassifier(reg_lambda=1.0)816                    clf.fit(X_train, y_train)817                    pred = clf.predict(X_test)818                    st.write(819                        "Accuracy Score: {:.4f}".format(accuracy_score(pred, y_test))820                    )821                    try:822                        st.write("F1 Score: {:.4f}".format(f1_score(pred, y_test)))823                        st.write('Precision Score: {:.4f}' .format(precision_score(pred, y_test)))824                        st.write('Recall Score: {:.4f}'.format(recall_score(pred, y_test)))825                    except ValueError:826                        st.write('Macro Precision Score: {:.4f}' .format(precision_score(pred, y_test, average='macro')))827                        st.write('Macro Recall Score: {:.4f}'.format(recall_score(pred, y_test, average='macro'))) 828                        st.write("Macro F1 Score: {:.4f}".format(f1_score(pred, y_test, average='macro')))829                   830                    plot_confusion_matrix(831                        pred, y_test, "LGBM Classifier Confusion Matrix "832                    )833 834                    if st.download_button(835                        label="Download Trained Model",836                        key="trained_model",837                        on_click=None,838                        data=pickle.dumps(clf),839                        file_name="lgbm_classifier_model.pkl",840                        mime="application/octet-stream",841                    ):842                        with open("lgbm_classifier_model.pkl", "wb") as model_file:843                            pickle.dump(clf, model_file)844 845 846def load_csv(file):847    data = pd.read_csv(file)848    return data849 850 851def data_overview(data):852    r, c = data.shape853    st.write(f"Number of Rows: {r}")854    return f"Number of Columns: {c}"855 856 857def missing_data(data):858    missing_values = data.isna().sum()859    missing_values = missing_values[missing_values > 0]860    missing_value_per = (missing_values / data.shape[0]) * 100861    missing_value_per = missing_value_per.round(2).astype(str) + "%"862    missing_df = pd.DataFrame(863        {"Missing Values": missing_values, "Percentage": missing_value_per}864    )865    missing_df_html = missing_df.to_html(866        classes="table table-striped", justify="center"867    )868    return st.markdown(missing_df_html, unsafe_allow_html=True)869 870 871def display_data_info(data):872    dtypes = pd.DataFrame(data.dtypes, columns=["Data Type"])873    dtypes.reset_index(inplace=True)874    nunique = pd.DataFrame(data.nunique(), columns=["Unique Counts"])875    nunique.reset_index(inplace=True)876    dtypes.columns = ["Column", "Data Type"]877    nunique.columns = ["Column", "Unique Counts"]878    combined_df = pd.merge(dtypes, nunique, on="Column")879    combined_df_html = combined_df.to_html(880        classes="table table-striped", justify="center"881    )882    return st.markdown(combined_df_html, unsafe_allow_html=True)883 884 885def value_counts(data):886    column = st.selectbox("Select a Column", [""] + list(data.columns))887    if column:888        st.write(data[column].value_counts())889 890 891def duplicate(data):892    if data.duplicated().any():893        st.write(894            f"There is/are {data.duplicated().sum()} duplicate rows in the DataFrame. Duplicated values will be dropped."895        )896        data.drop_duplicates(keep="first", inplace=True)897        return ""898 899    else:900        return "There are no duplicate rows in the DataFrame."901 902def countplot(data, col):903    plt.figure(figsize=(10, 6))904    sns.countplot(y=data[col], palette=palette[1:], edgecolor="#1c1c1c", linewidth=2)905    plt.title(f"Countplot of {col} Column")906    st.pyplot(plt)907 908 909def piechart(data, col):910    value_counts = data[col].value_counts()911    plt.figure(figsize=(8, 6))912    plt.pie(913        value_counts,914        labels=value_counts.index,915        autopct="%1.1f%%",916        colors=palette,917        shadow=False,918        wedgeprops=dict(edgecolor="#1c1c1c"),919    )920    plt.title(f"Pie Chart of {col} Column")921    st.pyplot(plt)922 923 924def histogram(data, col):925    plt.figure(figsize=(10, 6))926    sns.histplot(927        data[col],928        kde=True,929        color=palette[4],930        fill=True,931        edgecolor="#1c1c1c",932        linewidth=2,933    )934    plt.title(f"Histogram of {col} Column")935    st.pyplot(plt)936 937 938def violinplot(data, col):939    plt.figure(figsize=(10, 6))940    sns.violinplot(data[col], color=palette[8])941    plt.title(f"Violin Plot of {col} Column")942    st.pyplot(plt)943 944 945def scatterplot(data, col):946    plt.figure(figsize=(10, 8))947    sns.scatterplot(data[col], color=palette[3])948    plt.title(f"Scatter Plot of {col} Column")949    st.pyplot(plt)950 951 952def biscatterplot(data, cols):953    try:954        plt.figure(figsize=(10, 8))955        sns.scatterplot(956            data=data,957            x=cols[0],958            y=cols[1],959            palette=palette[1:],960            edgecolor="#1c1c1c",961            linewidth=2,962        )963        plt.title(f"Scatter Plot of {cols[0]} and {cols[1]} Columns")964        st.pyplot(plt)965    except Exception as e:966        st.write(str(e))967 968 969def bibarplot(data, cols):970    try:971        plt.figure(figsize=(10, 8))972        sns.barplot(973            data=data,974            x=cols[0],975            y=cols[1],976            palette=palette[1:],977            edgecolor="#1c1c1c",978            linewidth=2,979        )980        plt.title(f"Bar Plot of {cols[0]} and {cols[1]} Columns")981        st.pyplot(plt)982    except Exception as e:983        st.write(str(e))984 985 986def biboxplot(data, cols):987    try:988        plt.figure(figsize=(10, 8))989        sns.boxplot(data=data, x=cols[0], y=cols[1], palette=palette[1:], linewidth=2)990        plt.title(f"Box Plot of {cols[0]} and {cols[1]} Columns")991        st.pyplot(plt)992    except Exception as e:993        st.write(str(e))994 995 996def paretoplot(data, categorical_col):997    try:998        value_counts = data[categorical_col].value_counts()999        cumulative_percentage = (value_counts / value_counts.sum()).cumsum()1000        pareto_df = pd.DataFrame(1001            {1002                "Categories": value_counts.index,1003                "Frequency": value_counts.values,1004                "Cumulative Percentage": cumulative_percentage.values * 100,1005            }1006        )1007        pareto_df = pareto_df.sort_values(by="Frequency", ascending=False)1008 1009        fig, ax1 = plt.subplots(figsize=(10, 8))1010        ax1.bar(1011            pareto_df["Categories"],1012            pareto_df["Frequency"],1013            color=palette[1:],1014            edgecolor="#1c1c1c",1015            linewidth=2,1016        )1017        ax2 = ax1.twinx()1018        ax2.yaxis.set_major_formatter(PercentFormatter())1019        ax2.plot(1020            pareto_df["Categories"],1021            pareto_df["Cumulative Percentage"],1022            color=palette[3],1023            marker="D",1024            ms=10,1025        )1026        ax1.set_xlabel(categorical_col)1027        ax1.set_ylabel("Frequency", color=palette[0])1028        ax2.set_ylabel("Cumulative Percentage", color=palette[3])1029        st.pyplot(fig)1030 1031    except Exception as e:1032        pass1033 1034 1035def plot_confusion_matrix(y_true, y_pred, title):1036    cm = confusion_matrix(y_true, y_pred)1037    plt.figure(figsize=(6, 4))1038    sns.heatmap(cm, annot=True, fmt="d", cmap="Blues", cbar=False)1039    plt.xlabel("Predicted Label")1040    plt.ylabel("True Label")1041    plt.title(title)1042    st.pyplot(plt)1043 1044 1045if __name__ == "__main__":1046    main()