basic functionality
This commit is contained in:
parent
352c2f87c5
commit
fd0014b5dc
84
main.py
84
main.py
@ -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")
|
||||
|
17
phi_star.py
17
phi_star.py
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user