Spaces:
Runtime error
Runtime error
Fix Streamlit duplicate element ID error and enhance CyberOps Dashboard with graphical navigation
9a084f0
verified
import os | |
import streamlit as st | |
import pandas as pd | |
import matplotlib.pyplot as plt | |
import dask.dataframe as dd | |
from dotenv import load_dotenv | |
from itertools import combinations | |
from collections import defaultdict | |
# Load environment variables | |
load_dotenv() | |
# Configuration from environment variables | |
FILE_UPLOAD_LIMIT = int(os.getenv('FILE_UPLOAD_LIMIT', 200)) | |
EXECUTION_TIME_LIMIT = int(os.getenv('EXECUTION_TIME_LIMIT', 300)) | |
RESOURCE_LIMIT = int(os.getenv('RESOURCE_LIMIT', 1024)) # in MB | |
DATA_DIR = os.getenv('DATA_DIR', './data') | |
CONFIG_FLAG = os.getenv('CONFIG_FLAG', 'default') | |
# Main application logic | |
def main(): | |
st.title("CyberOps Dashboard") | |
# Sidebar for user inputs | |
st.sidebar.header("Options") | |
# Main frame for introduction and navigation | |
with st.container(): | |
st.subheader("Welcome to CyberOps Dashboard") | |
st.write(""" | |
The CyberOps Dashboard is designed to assist cybersecurity professionals in analyzing and visualizing data efficiently. | |
With this tool, you can upload CSV files, visualize data trends, and perform advanced data analysis. | |
""") | |
# Navigation section | |
st.subheader("Navigation") | |
st.write("Use the buttons below to navigate to different sections:") | |
col1, col2, col3 = st.columns(3) | |
with col1: | |
if st.button("Data Upload"): | |
uploaded_file = st.sidebar.file_uploader("Select a CSV file:", type=["csv"], key="file_uploader_data_upload") | |
with col2: | |
if st.button("Data Visualization"): | |
st.sidebar.selectbox('Select X-axis:', [], key="data_visualization_x") | |
st.sidebar.selectbox('Select Y-axis:', [], key="data_visualization_y") | |
with col3: | |
if st.button("Analysis Tools"): | |
st.sidebar.multiselect('Select columns for combinations:', [], key="analysis_tools_columns") | |
uploaded_file = st.sidebar.file_uploader("Select a CSV file:", type=["csv"], key="file_uploader_main") | |
if uploaded_file: | |
def load_csv(file): | |
return pd.read_csv(file) | |
def load_dask_csv(file): | |
return dd.read_csv(file) | |
if os.path.getsize(uploaded_file) < RESOURCE_LIMIT * 1024 * 1024: | |
df = load_csv(uploaded_file) | |
else: | |
df = load_dask_csv(uploaded_file) | |
if not df.empty: | |
st.write("Data Preview:") | |
st.dataframe(df.compute() if isinstance(df, dd.DataFrame) else df) | |
# Select columns for plotting | |
x_column = st.sidebar.selectbox('Select X-axis:', df.columns, key="x_column_plot") | |
y_column = st.sidebar.selectbox('Select Y-axis:', df.columns, key="y_column_plot") | |
# Plotting | |
fig, ax = plt.subplots() | |
ax.plot(df[x_column], df[y_column], marker='o') | |
ax.set_xlabel(x_column) | |
ax.set_ylabel(y_column) | |
ax.set_title(f"{y_column} vs {x_column}") | |
st.pyplot(fig) | |
# Combinatorial analysis | |
col_combinations = st.sidebar.multiselect('Select columns for combinations:', df.columns, key="col_combinations") | |
if col_combinations: | |
st.write("Column Combinations:") | |
comb = list(combinations(col_combinations, 2)) | |
st.write(comb) | |
# Grouping and aggregation | |
group_by_column = st.sidebar.selectbox('Select column to group by:', df.columns, key="group_by_column") | |
if group_by_column: | |
grouped_df = df.groupby(group_by_column).agg(list) | |
st.write("Grouped Data:") | |
st.dataframe(grouped_df.compute() if isinstance(grouped_df, dd.DataFrame) else grouped_df) | |
if __name__ == "__main__": | |
main() |