From d47fc3505b8c23e72ab74a41b8b5bf1d5b03e150 Mon Sep 17 00:00:00 2001 From: Lasse Studion Date: Tue, 9 May 2023 08:56:50 +0200 Subject: [PATCH] Added custom delimiter. --- app.py | 214 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 110 insertions(+), 104 deletions(-) diff --git a/app.py b/app.py index d1e67ca..bdafa3b 100644 --- a/app.py +++ b/app.py @@ -66,122 +66,128 @@ st.markdown( with Gephi and [Gephi Light](https://gephi.org/gephi-lite/).*""" ) -try: - # Print explainer. - expl = st.expander(label="More info") - with expl: - st.write(info.explainer) +#try: +# Print explainer. +expl = st.expander(label="More info") +with expl: + st.write(info.explainer) - # Ask for nodes file. - csv_nodes = st.file_uploader( - label="Upload file with **nodes** (if you have one).", key="nodes", help=f'[Example]({info.node_example})' - ) +# Ask for nodes file. +csv_nodes = st.file_uploader( + label="Upload file with **nodes** (if you have one).", key="nodes", help=f'[Example]({info.node_example})' +) - # Ask for relations file. - csv_edges = st.file_uploader(label="Upload file with **relations**.", key="relations", help=f'[Example]({info.relations_example})') +# Ask for relations file. +csv_edges = st.file_uploader(label="Upload file with **relations**.", key="relations", help=f'[Example]({info.relations_example})') - col1, col2 = st.columns([1,2]) +col1, col2 = st.columns([1,2]) - # Chose separator - with col1: - # Set standard separator. - st.session_state["sep"] = ',' +# Chose separator +with col1: + # Set standard separator. + st.session_state["sep"] = ',' - # Ask for separator. - sep = st.radio( - 'Separator in your files:', - options=['comma ( , )', 'semicolon ( ; )', 'tab ( \u21E5 )', 'pipe (|)', 'space ( )'], - help='What are the values in your files separated with?' - ) - - separators = {'comma ( , )': ',', 'semicolon ( ; )': ';', 'tab ( \u21E5 )': '\t', 'pipe (|)': '|', 'space ( )': ' '} - st.session_state["sep"] = separators[sep] - - # Preview file - with col2: - preview = st.button('Preview file.') - if preview: - st.dataframe(pd.read_csv(csv_edges, sep=st.session_state["sep"])) - - - files_uploaded = st.button('Done', 'files_uploaded') - - if files_uploaded or 'files_already_uploaded' in st.session_state: - st.session_state['files_already_uploaded'] = True - - if csv_edges == None: - st.markdown(':red[You need to upload a file with relations.]') - st.stop() + # Ask for separator. + separators = {'comma ( , )': ',', 'semicolon ( ; )': ';', 'tab ( \u21E5 )': '\t', 'pipe (|)': '|', 'space ( )': ' ', '':''} + sep = st.radio( + 'Separator in your files:', + options=['comma ( , )', 'semicolon ( ; )', 'tab ( \u21E5 )', 'pipe (|)', 'space ( )', 'custom'], + help='What are the values in your files separated with?' + ) + if sep == 'custom': + sep = st.text_input('Custom delimiter:') + separators[sep] = sep + + st.session_state["sep"] = separators[sep] +# Preview file +with col2: + preview = st.button('Preview file.') + if preview: try: - df = pd.read_csv(csv_edges, sep=st.session_state["sep"]) - except pd.errors.EmptyDataError: - st.markdown(':red[Have you chosen the right kind of separator?]') - st.stop() - - df.rename({'type': 'relation_type'}, inplace=True, axis=1) # 'type' can't be used as attribute. - df.columns = [i.lower() for i in df.columns] # Remove capital letters from column names. + st.dataframe(pd.read_csv(csv_edges, sep=st.session_state["sep"]), use_container_width=True) + except pd.errors.ParserError: + st.markdown(':red[Have you selected a correct separator?]') - with st.form('select_columns'): - - # Find and store target column. - target = find_columns('target', df.columns.tolist()) - # Find and store source column. - source = find_columns('source', df.columns.tolist()) +files_uploaded = st.button('Done', 'files_uploaded') - # Confirm choise. - columns_selected = st.form_submit_button("Done") +if files_uploaded or 'files_already_uploaded' in st.session_state: + st.session_state['files_already_uploaded'] = True + + if csv_edges == None: + st.markdown(':red[You need to upload a file with relations.]') + st.stop() + + try: + df = pd.read_csv(csv_edges, sep=st.session_state["sep"]) + except pd.errors.EmptyDataError: + st.markdown(':red[Have you chosen the right kind of separator?]') + st.stop() - if columns_selected: - # Remove source and target columns from list of options. - columns = df.columns.tolist() - columns.remove(st.session_state["target"]) - columns.remove(st.session_state["source"]) + df.rename({'type': 'relation_type'}, inplace=True, axis=1) # 'type' can't be used as attribute. + df.columns = [i.lower() for i in df.columns] # Remove capital letters from column names. + + with st.form('select_columns'): + + # Find and store target column. + target = find_columns('target', df.columns.tolist()) + + # Find and store source column. + source = find_columns('source', df.columns.tolist()) + + # Confirm choise. + columns_selected = st.form_submit_button("Done") + + if columns_selected: + # Remove source and target columns from list of options. + columns = df.columns.tolist() + columns.remove(st.session_state["target"]) + columns.remove(st.session_state["source"]) + + if all([st.session_state["source"] != "", st.session_state["target"] != ""]): + source = st.session_state["source"] + target = st.session_state["target"] + + # Let the user chose what columns that should be included. + chosen_columns = st.multiselect( + label="Chose other columns to include.", options=columns, default=columns + ) + + if csv_nodes != None: # When a nodes file is uploaded. + df_nodes = pd.read_csv(csv_nodes, sep=st.session_state["sep"]) + df_nodes.columns = [i.lower() for i in df_nodes.columns] # Remove capital letters from column names. + + label_column = find_columns('label', df_nodes.columns.tolist()) + df_nodes.set_index(label_column, inplace=True) + + else: # If no node file provided. + nodes = list(set(df[source].tolist() + df[target].tolist())) + df_nodes = pd.DataFrame( + nodes, index=range(0, len(nodes)), columns=["labels"] + ) + df_nodes.set_index("labels", inplace=True) + + # Make empty graph. + G = nx.MultiDiGraph() + # Add nodes. + G = add_nodes(G, df_nodes) + # Add edges. + G = add_edges( + G, df, source=source, target=target, chosen_columns=chosen_columns + ) + + # Turn the graph into a string. + graph_text = "\n".join([line for line in nx.generate_gexf(G)]) - if all([st.session_state["source"] != "", st.session_state["target"] != ""]): - source = st.session_state["source"] - target = st.session_state["target"] + # Download gexf-file. + gexf_file = "output.gexf" + st.download_button( + "Download gexf-file", graph_text, file_name=gexf_file + ) + st.write('Import the file to Gephi/Gephi Light, or try [Gephisto](https://jacomyma.github.io/gephisto/) to get an idea of the network.') - # Let the user chose what columns that should be included. - chosen_columns = st.multiselect( - label="Chose other columns to include.", options=columns, default=columns - ) - - if csv_nodes != None: # When a nodes file is uploaded. - df_nodes = pd.read_csv(csv_nodes, sep=st.session_state["sep"]) - df_nodes.columns = [i.lower() for i in df_nodes.columns] # Remove capital letters from column names. - - label_column = find_columns('label', df_nodes.columns.tolist()) - df_nodes.set_index(label_column, inplace=True) - - else: # If no node file provided. - nodes = list(set(df[source].tolist() + df[target].tolist())) - df_nodes = pd.DataFrame( - nodes, index=range(0, len(nodes)), columns=["labels"] - ) - df_nodes.set_index("labels", inplace=True) - - # Make empty graph. - G = nx.MultiDiGraph() - # Add nodes. - G = add_nodes(G, df_nodes) - # Add edges. - G = add_edges( - G, df, source=source, target=target, chosen_columns=chosen_columns - ) - - # Turn the graph into a string. - graph_text = "\n".join([line for line in nx.generate_gexf(G)]) - - # Download gexf-file. - gexf_file = "output.gexf" - st.download_button( - "Download gexf-file", graph_text, file_name=gexf_file - ) - st.write('Import the file to Gephi/Gephi Light, or try [Gephisto](https://jacomyma.github.io/gephisto/) to get an idea of the network.') - -except: - st.markdown(':red[Something went wrong, please try again or [write to me](https://twitter.com/lasseedfast).]') \ No newline at end of file +# except: +# st.markdown(':red[Something went wrong, please try again or [write to me](https://twitter.com/lasseedfast).]') \ No newline at end of file