AhmedKhaled1122/Data-Analysis-and-Machine-Learning
0
1import numpy as np2import pandas as pd3import streamlit as st4import preprocessing as pp5from streamlit_sortables import sort_items6 7def preprocessing_page():8 st.set_page_config(page_title="Preprocessing", layout="wide")9 st.title("Preprocessing")10 11def sort_values(df, col):12 sort_item = sort_items(df[col].unique().tolist(), direction="vertical", key=f'sort_item_{col}')13 return sort_item14 15def encoding(df):16 st.header("Encoding")17 non_numerical_columns = df.select_dtypes(exclude=['number']).columns18 columns = st.multiselect('Select Columns for Encoding', options=non_numerical_columns, default=non_numerical_columns)19 20 for col in columns:21 st.markdown(f"### Column: {col} -> unique values {df[col].nunique()}")22 encode = st.selectbox('Select Encoder', options=['label encoder', 'ordinal encoder', 'one hot encoder', 'frequency encoder'], key=f'encoder_{col}')23 24 if encode == 'label encoder':25 df = pp.label_encoder(df, col)26 st.success(f'Label Encoding applied successfully to column: {col}')27 28 elif encode == 'ordinal encoder':29 sort = sort_values(df, col)30 df = pp.ordinal_encoder(df, col, sort)31 st.success(f'Ordinal Encoding applied successfully to column: {col}')32 33 34 elif encode == 'one hot encoder':35 df = pp.one_hot_encoder(df, col)36 st.success(f'One Hot Encoding applied successfully to column: {col}')37 38 else:39 df = pp.frequency_encoder(df, col)40 st.success(f'Frequency Encoding applied successfully to column: {col}')41 42 st.dataframe(df, height=213)43 st.markdown(f"**Shape:** {df.shape[0]} rows × {df.shape[1]} columns")44 45 return df46 47 48def show_skewness(df):49 continuous_columns = pp.detect_skewness(df, 0)50 continuous_columns_copy = df[continuous_columns].copy()51 52 st.header('Handle Skewness')53 54 cols = st.columns(4)55 for i, col in enumerate(continuous_columns):56 with cols[i%4]:57 fig = pp.histogram(df, col)58 st.pyplot(fig)59 60 continuous_columns_skewness = pp.detect_skewness(df, 1)61 62 select_columns = st.multiselect('Select Columns To Handle Skewness', options=continuous_columns, default=continuous_columns_skewness)63 select_method = st.selectbox('Select transformation method', options=['Log Transformation', 'Box Cox Transformation', 'Yeojohnson Transformation'])64 if select_method == 'Log Transformation':65 for col in select_columns:66 df = pp.log_transform(df, col)67 elif select_method == 'Box Cox Transformation':68 for col in select_columns:69 if df[col].min() > 0:70 df = pp.box_cox_transform(df, col)71 else:72 for col in select_columns:73 df = pp.yeojohnson_transform(df, col)74 75 st.success(f'Skewness handling completed by {select_method} for {select_columns}')76 77 col1, col2 = st.columns(2)78 for col in select_columns:79 with col1:80 st.subheader('Before Skewness Handling')81 fig = pp.histogram(continuous_columns_copy, col)82 st.pyplot(fig)83 84 with col2:85 st.subheader('After Skewness Handling')86 fig = pp.histogram(df, col)87 st.pyplot(fig)88 89 return df90 91def scaler(df):92 st.subheader('Feature Scaling')93 numeric_cols = df.select_dtypes(include=['number']).columns94 col1, col2 = st.columns(2)95 with col1:96 columns = st.multiselect('Select columns to scale', options=numeric_cols, default=numeric_cols)97 with col2:98 method = scale_method = st.selectbox("Select scaling method", options=['Normalization (MinMaxScaler)', 'Standardization (StandardScaler)'])99 100 for col in columns:101 if method == 'Normalization (MinMaxScaler)':102 pp.min_max_scaler(df, col)103 else:104 pp.standerd_scaler(df, col)105 106 st.success(f'Scaler handling completed by {method} for {columns}')107 st.dataframe(df, height=213)108 st.markdown(f"**Shape:** {df.shape[0]} rows × {df.shape[1]} columns")109 110 return df111 112def correlation(df):113 st.header('Correlations')114 target_column = st.selectbox('Select Target Column', options=df.select_dtypes(include='number').columns)115 corrs = {}116 for col in df.select_dtypes(include='number').columns:117 118 corrs [col] = pp.detect_corr(df, target_column, col)119 120 corrs = pd.Series(corrs).sort_values(ascending=True)121 cols = st.columns(3)122 123 st.subheader('Correlations per columns')124 chunks = [corrs.iloc[i::3] for i in range(3)]125 126 cols = st.columns(3)127 128 for col, chunk in zip(cols, chunks):129 col.table(chunk.to_frame(name="Correlations Per Column"))130 131 default_columns = corrs[corrs.abs() < 0.1].index.tolist() + df.select_dtypes(exclude='number').columns.tolist()132 columns_to_drop = st.multiselect("Drop Unnecessary Columns And Low Correlation With Target", options=df.columns, default=default_columns)133 134 df = pp.delete_low_corr(df, columns_to_drop)135 136 st.success('successfully Droped Unnecessary Columns And Low Correlation With Target')137 st.dataframe(df, height=213)138 st.markdown(f"**Shape:** {df.shape[0]} rows × {df.shape[1]} columns")139 return df140 