import streamlit as st import json from io import BytesIO import pandas as pd import matplotlib.pyplot as plt from wordcloud import WordCloud import os def save_feedback_og(feedback): feedback_file = 'feedback_data.json' if os.path.exists(feedback_file): with open(feedback_file, 'r') as f: feedback_data = json.load(f) else: feedback_data = [] # tpl = { # 'question' : question, # 'answer' : answer, # 'context' : context, # 'options' : options, # 'rating' : rating, # } # feedback_data[question] = rating feedback_data.append(feedback) print(feedback_data) with open(feedback_file, 'w') as f: json.dump(feedback_data, f) st.session_state.feedback_data.append(feedback) return feedback_file def collect_feedback(i,question, answer, context, options): st.write("Please provide feedback for this question:") edited_question = st.text_input("Enter improved question",value=question,key=f'fdx1{i}') clarity = st.slider("Clarity", 1, 5, 3, help="1 = Very unclear, 5 = Very clear",key=f'fdx2{i}') difficulty = st.slider("Difficulty", 1, 5, 3, help="1 = Very easy, 5 = Very difficult",key=f'fdx3{i}') relevance = st.slider("Relevance", 1, 5, 3, help="1 = Not relevant, 5 = Highly relevant",key=f'fdx4{i}') option_quality = st.slider("Quality of Options", 1, 5, 3, help="1 = Poor options, 5 = Excellent options",key=f'fdx5{i}') overall_rating = st.slider("Overall Rating", 1, 5, 3, help="1 = Poor, 5 = Excellent",key=f'fdx6{i}') comments = st.text_input("Additional Comments", "",key=f'fdx7{i}') if st.button("Submit Feedback",key=f'fdx8{i}'): feedback = { "context": context, "question": question, 'edited_question':edited_question, "answer": answer, "options": options, "clarity": clarity, "difficulty": difficulty, "relevance": relevance, "option_quality": option_quality, "overall_rating": overall_rating, "comments": comments } # save_feedback(feedback) save_feedback_og(feedback) st.success("Thank you for your feedback!") def analyze_feedback(): if not st.session_state.feedback_data: st.warning("No feedback data available yet.") return df = pd.DataFrame(st.session_state.feedback_data) st.write("Feedback Analysis") st.write(f"Total feedback collected: {len(df)}") metrics = ['clarity', 'difficulty', 'relevance', 'option_quality', 'overall_rating'] for metric in metrics: fig, ax = plt.subplots() df[metric].value_counts().sort_index().plot(kind='bar', ax=ax) plt.title(f"Distribution of {metric.capitalize()} Ratings") plt.xlabel("Rating") plt.ylabel("Count") st.pyplot(fig) st.write("Average Ratings:") st.write(df[metrics].mean()) # Word cloud of comments comments = " ".join(df['comments']) if len(comments) > 1: wordcloud = WordCloud(width=800, height=400, background_color='white').generate(comments) fig, ax = plt.subplots() plt.imshow(wordcloud, interpolation='bilinear') plt.axis("off") st.pyplot(fig) def export_feedback_data(): if not st.session_state.feedback_data: st.warning("No feedback data available.") return None # Convert feedback data to JSON json_data = json.dumps(st.session_state.feedback_data, indent=2) # Create a BytesIO object buffer = BytesIO() buffer.write(json_data.encode()) buffer.seek(0) return buffer