Spaces:
Runtime error
Runtime error
File size: 8,210 Bytes
8257b79 026f2af 8257b79 0875fdf 8257b79 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 |
# -*- coding: utf-8 -*-
"""Untitled1.ipynb
Automatically generated by Colaboratory.
Original file is located at
https://colab.research.google.com/drive/1OpumpFAYHp3dJhfH9ZUWpQRDx9FqOVOd
"""
import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
def extract_question_options(url):
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
tables = soup.find_all('table', class_='menu-tbl')
question_ids = []
chosen_options = []
option_1_ids = []
option_2_ids = []
option_3_ids = []
option_4_ids = []
for table in tables:
question_id = table.find('td', string='Question ID :').find_next('td').text
chosen_option = table.find('td', string='Chosen Option :').find_next('td').text
option_1_id = table.find('td', string='Option 1 ID :').find_next('td').text
option_2_id = table.find('td', string='Option 2 ID :').find_next('td').text
option_3_id = table.find('td', string='Option 3 ID :').find_next('td').text
option_4_id = table.find('td', string='Option 4 ID :').find_next('td').text
status = table.find('td', string='Status :').find_next('td').text
if 'Not Answered' in status or 'Marked For Review' in status:
chosen_option = 'Not Attempted'
question_ids.append(question_id)
chosen_options.append(chosen_option)
option_1_ids.append(option_1_id)
option_2_ids.append(option_2_id)
option_3_ids.append(option_3_id)
option_4_ids.append(option_4_id)
data = {
'Question ID': question_ids,
'Chosen Option': chosen_options,
'Option 1 ID': option_1_ids,
'Option 2 ID': option_2_ids,
'Option 3 ID': option_3_ids,
'Option 4 ID': option_4_ids
}
df = pd.DataFrame(data)
new_data = []
for _, row in df.iterrows():
chosen_option = row['Chosen Option']
question_id = row['Question ID']
if chosen_option == 'Not Attempted':
option_id = 'Not Attempted'
else:
option_id = row[f'Option {chosen_option} ID']
new_data.append({'Question ID': question_id, 'My Options(s)': option_id})
new_df = pd.DataFrame(new_data)
return new_df
def extract_question_info(data):
lines = data.split("\n")
result = []
skip_row = False
for line in lines:
if line:
if skip_row:
skip_row = False
continue
parts = line.split("\t")
question_id = parts[2]
correct_option = ""
for option in parts[3:]:
if option != "None of These":
correct_option = option
break
result.append({"Question ID": question_id, "Correct Option(s)": correct_option})
skip_row = True
df = pd.DataFrame(result)
return df
def compare_answers(data, url):
# Call extract_question_info to get the ans_df DataFrame
ans_df = extract_question_info(data)
# Call extract_question_options to get the new_df DataFrame
new_df = extract_question_options(url)
# Merge the two DataFrames based on the 'Question ID' column
merged_df = ans_df.merge(new_df, on='Question ID', how='inner')
# Compare the Correct Option(s) and My Options(s) columns and assign marks
merged_df['Marks'] = merged_df.apply(lambda row: 4 if row['Correct Option(s)'] == row['My Options(s)']
else (-1 if row['My Options(s)'] != 'Not Attempted' else 0), axis=1)
# Calculate total marks
total_marks = len(ans_df) * 4
# Calculate number of wrong answers
wrong_answers = len(merged_df[merged_df['Marks'] == -1])
# Calculate number of right answers
right_answers = len(merged_df[merged_df['Marks'] == 4])
# Calculate number of not attempted questions
not_attempted = len(new_df[new_df['My Options(s)'] == 'Not Attempted'])
# Calculate marks obtained
marks_obtained = merged_df['Marks'].sum()
# Calculate percentage score
percentage_score = (marks_obtained / total_marks) * 100
# Create the markdown text
text = f"Total Marks: {total_marks}\n"
text += f"Number of Wrong Answers: {wrong_answers}\n"
text += f"Number of Right Answers: {right_answers}\n"
text += f"Number of Not Attempted Questions: {not_attempted}\n"
text += f"Marks Obtained: {marks_obtained}\n"
text += f"Percentage Score: {percentage_score}\n"
# Plotting the overall performance
labels = ['Right Answers', 'Wrong Answers', 'Not Attempted']
sizes = [right_answers, wrong_answers, not_attempted]
colors = ['#66BB6A', '#EF5350', '#FFA726']
plt.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90)
plt.axis('equal')
plt.title('Overall Performance')
return text, merged_df, plt
import gradio as gr
with gr.Blocks(theme='gradio/soft') as demo:
gr.Markdown("""
## FOLLOW THIS STEPS TO EXTRACT THE DATA
![Image](https://i.imgur.com/9dzYJZ1.gif)
""")
data = gr.Textbox(label="Correct Options in The Website",placeholder=
"""1 Data Science Artificial Intelligence_Eng - PART A 123456789 987654321
987654321 987654322 987654323 987654324 None of These
2 Data Science Artificial Intelligence_Eng - PART A 234567890 123456789
123456789 123456790 123456791 123456792 None of These
3 Data Science Artificial Intelligence_Eng - PART A 345678901 234567890
234567890 234567891 234567892 234567893 None of These
4 Data Science Artificial Intelligence_Eng - PART A 456789012 345678901
345678901 345678902 345678903 345678904 None of These
5 Data Science Artificial Intelligence_Eng - PART A 567890123 456789012
456789012 456789013 456789014 456789015 None of These
6 Data Science Artificial Intelligence_Eng - PART A 678901234 567890123
567890123 567890124 567890125 567890126 None of These
7 Data Science Artificial Intelligence_Eng - PART A 789012345 678901234
678901234 678901235 678901236 678901237 None of These
8 Data Science Artificial Intelligence_Eng - PART A 890123456 789012345
789012345 789012346 789012347 789012348 None of These
9 Data Science Artificial Intelligence_Eng - PART A 901234567 890123456
890123456 890123457 890123458 890123459 None of These
10 Data Science Artificial Intelligence_Eng - PART A 123456789 901234567
901234567 901234568 901234569 901234570 None of These
11 Data Science Artificial Intelligence_Eng - PART A 234567890 123456789
123456789 123456790 123456791 123456792 None of These
12 Data Science Artificial Intelligence_Eng - PART A 345678901 234567890
234567890 234567891 234567892 234567893 None of These
13 Data Science Artificial Intelligence_Eng - PART A 456789012 345678901
345678901 345678902 345678903
.
.
.
.
95 Data Science Artificial Intelligence_Eng - PART A 678901234 567890123
567890123 567890124 567890125 567890126 None of These
96 Data Science Artificial Intelligence_Eng - PART A 789012345 678901234
678901234 678901235 678901236 678901237 None of These
97 Data Science Artificial Intelligence_Eng - PART A 890123456 789012345
789012345 789012346 789012347 789012348 None of These
98 Data Science Artificial Intelligence_Eng - PART A 901234567 890123456
890123456 890123457 890123458 890123459 None of These
99 Data Science Artificial Intelligence_Eng - PART A 123456789 901234567
901234567 901234568 901234569 901234570 None of These
100 Data Science Artificial Intelligence_Eng - PART A 234567890 123456789
123456789 123456790 123456791 123456792 None of These""", lines=5)
gr.Markdown("![Image](https://i.ibb.co/FVwGm6L/Screenshot-179.png)")
url = gr.Textbox(label="Link to your Answers URL",placeholder="https://cdn3.digialm.com//per/g28/pub/XXXX/touchstone/AssessmentQPHTMLMode1//XXXXXXXX/XXXXXXXX/XXXXXXXX/XXXXXXXXXXX.html")
btn = gr.Button(value="Check Your Answer!")
out = gr.Textbox(value="", label="Output")
out1 = gr.Plot()
out2=gr.Dataframe()
btn.click(compare_answers, inputs=[data, url], outputs=[out,out2,out1])
gr.Markdown("Made with :heart: by Neelanjan Chakraborty")
if __name__ == "__main__":
demo.launch(debug= True,share=True)
|