97 lines
3.5 KiB
Python
97 lines
3.5 KiB
Python
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:
|
||
is_male = False
|
||
if row[1] == "мужской":
|
||
males+=1
|
||
is_male = True
|
||
else:
|
||
fems+=1
|
||
for i in range(COLUMNS_TRIM, q_count):
|
||
if "все вышеперечисленное" in row[i].lower():
|
||
if i == 4:
|
||
row[i] = "семейная;социальная;профессиональная"
|
||
elif i == 13:
|
||
row[i] = "Забота о семье;Участие в общественной жизни;Достижение карьерных высот"
|
||
elif i == 15:
|
||
row[i] = "Ум и интеллект;Внешняя привлекательность;Доброта и забота;Уверенность и независимость"
|
||
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")
|