basic functionality

This commit is contained in:
DIvan2000 2025-03-17 17:25:31 +04:00
parent 352c2f87c5
commit fd0014b5dc
2 changed files with 98 additions and 3 deletions

84
main.py
View File

@ -1,9 +1,89 @@
import phi_star
import csv
from docx import Document
from docx.shared import RGBColor
COLUMNS_TRIM = 3
CRIT_LOW = 1.62
CRIT_HIGH = 2.33
if __name__ == '__main__':
males = 0
fems = 0
fem_responses = []
male_responses = []
with open("responses.csv", encoding="utf-8") as file:
reader = csv.reader(file)
headers = next(reader)
q_count = len(headers)
for i in range(COLUMNS_TRIM, q_count):
fem_responses.append({})
male_responses.append({})
for row in reader:
print(row)
print(phi_star.calculate_phi_star([[1, 1], [1, 1]]))
is_male = False
if row[1] == "мужской":
males+=1
is_male = True
else:
fems+=1
for i in range(COLUMNS_TRIM, q_count):
answer_array = row[i].split(";")
for answer in answer_array:
if answer == "":
answer = "не могу дать точный ответ"
if is_male:
male_responses[i - COLUMNS_TRIM][answer] = male_responses[i - COLUMNS_TRIM].get(answer, 0) + 1
else:
fem_responses[i - COLUMNS_TRIM][answer] = fem_responses[i - COLUMNS_TRIM].get(answer, 0) + 1
doc = Document()
doc.add_heading("Гендерные стереотипы")
doc.add_paragraph("Кол-во мужчин: " + str(males) + "\nКол-во женщин: " + str(fems) + "\nВсего опрошено: " + str(males + fems))
for i in range(0, q_count - COLUMNS_TRIM):
doc.add_paragraph("\n\n"+str(headers[i+COLUMNS_TRIM]))
all_keys = set(fem_responses[i].keys()) | set(male_responses[i].keys())
doc_table = doc.add_table(len(all_keys) + 1, 4)
doc_table.style = 'Table Grid'
doc_table.cell(0, 0).text = "Ответ"
doc_table.cell(0, 1).text = "Женщины"
doc_table.cell(0, 2).text = "Мужчины"
doc_table.cell(0, 3).text = "φ*эмп"
row = 1
for answer in all_keys:
male_count = male_responses[i].get(answer, 0)
fem_count = fem_responses[i].get(answer, 0)
table = [[fem_count, fems - fem_count],
[male_count, males-male_count]]
phisher = phi_star.calculate(table)
doc_table.cell(row, 0).text = answer
doc_table.cell(row, 1).text = str(fem_count)
doc_table.cell(row, 2).text = str(male_count)
doc_table.cell(row, 3).text = str(f"{phisher:.3f}")
if phisher >= CRIT_HIGH: color = RGBColor(0, 128, 0)
elif phisher <= CRIT_LOW: color = RGBColor(255, 0, 0)
else: color = RGBColor(128, 128, 0)
for cell in doc_table.rows[row].cells: cell.paragraphs[0].runs[0].font.color.rgb = color
row+=1
doc.save("output.docx")

View File

@ -1,6 +1,6 @@
import math
def calculate_phi_star(table):
def calculate(table):
"""
Вычисляет эмпирическое значение φ* по 2x2 таблице сопряжённости.
@ -44,3 +44,18 @@ def calculate_phi_star(table):
# Вычисляем φ*
return math.sqrt(chi_squared_1 + chi_squared_2)
def validate(table):
group1_ef = table[0][0]
group1_ne = table[0][1]
group2_ef = table[1][0]
group2_ne = table[1][1]
total_group1 = group1_ef + group1_ne
total_group2 = group2_ef + group2_ne
if min(total_group1,total_group2) >= 5: return True
if min(total_group1,total_group2) == 2 and max(total_group1,total_group2)>=30: return True
if min(total_group1,total_group2) == 3 and max(total_group1,total_group2)>=7: return True
if min(total_group1,total_group2) == 4 and max(total_group1,total_group2)>=5: return True
return False