X-Git-Url: http://www.iramuteq.org/git?a=blobdiff_plain;f=tabchi2.py;h=aa5ea7c34edf09995da0676214c9042ac7a33722;hb=refs%2Fheads%2F3.0;hp=422b44735d1facb7f79f9156cf3068cfea561c47;hpb=6919f2ef8d85c176c7be824b606c4b71142e10fd;p=iramuteq diff --git a/tabchi2.py b/tabchi2.py index 422b447..aa5ea7c 100755 --- a/tabchi2.py +++ b/tabchi2.py @@ -1,23 +1,46 @@ -#!/bin/env python # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2010 Pierre Ratinaud +#Copyright (c) 2008-2020 Pierre Ratinaud +#modification pour python 3 : Laurent Mérat, 6x7 - mai 2020 #License: GNU/GPL -import HTML +#------------------------------------ +# import des modules python +#------------------------------------ import os import string -import wx -import os import sys import tempfile -from chemins import ffr,FFF -import wx.lib.sized_controls as sc from time import sleep + +#------------------------------------ +# import des modules wx +#------------------------------------ +import wx +import wx.lib.sized_controls as sc + +#------------------------------------ +# import des fichiers du projet +#------------------------------------ +import HTML +from chemins import ffr,FFF from functions import exec_rcode, check_Rresult from dialog import ChiDialog, PrefChi from analysematrix import AnalyseMatrix - + + +chioption = { 'valobs' : True, + 'valtheo' : True, + 'resi' : False, + 'contrib' : True, + 'pourcent' : False, + 'pourcentl' : True, + 'pourcentc' : True, + 'graph' : True, + 'bw' : False, + } + + def make_res(line) : if float(line[5]) <= 0.05 and line[6] != 'warning': line.append('green') @@ -34,7 +57,7 @@ def make_table(tabs, tab_title, res) : return ['
'.join(['%s' % (res[i][-1], tab_title), HTML.table(tab)]) for i,tab in enumerate(tabs)] def make_restab(res) : - return ['
'.join(['%s'% (line[-1], u'Résultats'),HTML.table([['chi', line[3]],['p', line[5]]])]) for i,line in enumerate(res)] + return ['
'.join(['%s'% (line[-1], 'Résultats'),HTML.table([['chi', line[3]],['p', line[5]]])]) for i,line in enumerate(res)] def make_htmlgraphs(graphs) : return ['' % os.path.basename(val) for val in graphs] @@ -46,339 +69,17 @@ def make_title(res, text) : return ['
%s
retour
' % (i, val[-1], text[i], i) for i, val in enumerate(res)] -chioption = { 'valobs' : True, - 'valtheo' : True, - 'resi' : False, - 'contrib' : True, - 'pourcent' : False, - 'pourcentl' : True, - 'pourcentc' : True, - 'graph' : True, - 'bw' : False, - } - - -class MakeChi2(): - def __init__(self, parent, select1, select2, chioption, tableau): - self.tableau = tableau - self.OutFrame=tempfile.mktemp(dir=parent.TEMPDIR) - print self.OutFrame - self.parent=parent - self.encode=self.parent.encode - self.TEMPDIR=parent.TEMPDIR - self.RPath=parent.PathPath.get('PATHS','rpath') - self.TextCroise=[] - for i in select1 : - for j in select2 : - self.TextCroise.append(self.tableau.colnames[i] + ' / ' + self.tableau.colnames[j]) - rchioption = {} - for val in chioption : - if chioption[val]: - rchioption[val] = 'TRUE' - else : - rchioption[val] = 'FALSE' - txt=""" - source("%s") - """%self.parent.RscriptsPath['Rfunct'] -# if parent.tableau.: rownames=1 -# else : rownames='NULL' -# if parent.g_header : header = 'TRUE' -# else : header = 'FALSE' - txt += """ - source("%s") - """ % ffr(self.parent.RscriptsPath['Rgraph']) - txt += """ - doobs <- %s - doexp <- %s - docontrib <- %s - doresi <- %s - dopr <- %s - doprl <- %s - doprc <- %s - dograph <- %s - bw <- %s - """ % (rchioption['valobs'], rchioption['valtheo'], rchioption['contrib'], rchioption['resi'], rchioption['pourcent'], rchioption['pourcentl'], rchioption['pourcentc'], rchioption['graph'], rchioption['bw']) - txt+=""" - datadm <- read.csv2("%s", encoding="%s", header = TRUE, row.names = 1, sep='\\t', quote = '"', na.string = '') - listres<-list() - listcol<-list() - cont<-1 - """%(ffr(self.tableau.parametres['csvfile']), self.tableau.parametres['syscoding']) - if len(select1)==1: - strsel1=str(select1).replace(',','') - else: - strsel1=str(select1) - if len(select2)==1: - strsel2=str(select2).replace(',','') - else: - strsel2=str(select2) - txt+=""" - for (i in c%s) {"""%strsel1 - txt+=""" - for (j in c%s) {"""%strsel2 - txt+=""" - tab<-table(datadm[,i+1],datadm[,j+1]) - if (min(dim(tab)) != 1) { - chi<-chisq.test(tab) - CS<-colSums(tab) - RS<-rowSums(tab) - GT<-sum(tab) - chi$contrib<-(tab-chi$expected)/sqrt(chi$expected * ((1 - RS/GT) %%*%% t(1 - CS/GT))) - listres[[cont]]<-chi - listcol[[cont]]<-ncol(tab) - cont<-cont+1 - } else { - chi <- list(observed = tab, residuals = tab, contrib = tab, statistic = 0, p.value = 1, expected = tab, message = 'pas de calcul') - listres[[cont]] <- chi - listcol[[cont]]<-ncol(tab) - cont <- cont + 1 - } - } - } - maxcol<-max(unlist(listcol))+1 - if (maxcol<7) {maxcol<-7} - frameout<-matrix('*',1,maxcol) - count<-0 - for (chi in listres) { - if (min(chi$expected)<5) { - att<-"warning" - } else { - att<-"" - } - if ('message' %%in%% attributes(chi)$names) { - att <- "Ce chi2 n\'a pas été calculé" - nom_colresi<-colnames(chi$observed) - chi$prl <- chi$expected - chi$prc <- chi$expected - st <- sum(chi$observed) - } else { - nom_colresi<-colnames(chi$observed) - st <- sum(chi$observed) - sc <- colSums(chi$observed) - sr <- rowSums(chi$observed) - chi$prl <- round((chi$observed/sr)*100,2) - chi$prc <- t(round((t(chi$observed)/sc)*100,2)) - } - fileout<-paste('histo_',count,sep='') - fileout<-paste(fileout,'.png',sep='') - count<-count+1 - fileout<-file.path("%s",fileout) - if (max(nchar(colnames(chi$observed)))>15) { - leg <- 1:length(colnames(chi$observed)) - } else { - leg <- colnames(chi$observed) - } - if (dograph) { - width<-ncol(chi$observed)*100 - if (width < 350) {width <- 350} - open_file_graph(fileout,width = width, height = 300) - par(mar=c(0,0,0,0)) - layout(matrix(c(1,2),1,2, byrow=TRUE),widths=c(3,1)) - par(mar=c(2,2,1,0)) - par(cex=0.8) - if (!bw) colors <- rainbow(length(rownames(chi$observed))) - else colors <- gray.colors(length(rownames(chi$observed))) - barplot(chi$prl,names.arg = leg, beside=TRUE,border=NA, col=colors) - par(mar=c(0,0,0,0)) - par(cex=0.8) - plot(0, axes = FALSE, pch = '') - legend(x = 'center' , rownames(chi$observed), fill = colors) - dev.off() - } - chi$prl <- cbind(chi$prl, total = rowSums(chi$prl)) - chi$prc <- rbind(chi$prc, total = colSums(chi$prc)) - chi$observed<-rbind(chi$observed,total=colSums(chi$observed)) - chi$observed<-cbind(chi$observed,total=rowSums(chi$observed)) - chi$pr <- round((chi$observed/st)*100,2) - chi$expected<-rbind(chi$expected,total=colSums(chi$expected)) - chi$expected<-cbind(chi$expected,total=rowSums(chi$expected)) - chi$expected<-round(chi$expected,digits=2) - chi$residuals<-round(chi$residuals,digits=2) - chi$contrib<-round(chi$contrib, digits=2) - nom_col<-colnames(chi$observed) - - if (ncol(chi$observed)\n - \n - \n -

Test du Chi2

\n -
-
- Légende :
- p <= 0.05
- p <= 0.05 mais il y a des valeurs théoriques < 5
- p > 0.05 -


- """%self.parent.SysEncoding - - - pretxt = '
\n'.join(links)+'


\n' - txt = '


\n'.join(['

'.join([tab[i] for tab in allhtml]) for i,val in enumerate(res)]) - txt = header + pretxt + txt + '\n' - - fileout=os.path.join(self.parametres['pathout'],'resultats-chi2.html') - with open(fileout, 'w') as f : - f.write(txt) - ListFile.append(fileout) - return ListFile - class ChiSquare(AnalyseMatrix): + def doparametres(self, dlg = None): if dlg is None : return - dial = ChiDialog(self.parent, -1, u"Chi2", chioption, self.tableau, size=(400, 350), + dial = ChiDialog(self.parent, -1, "Chi2", chioption, self.tableau, size=(400, 350), style = wx.DEFAULT_DIALOG_STYLE ) dial.CenterOnParent() val = dial.ShowModal() - if val==wx.ID_OK : - dlg.Center() - self.count = 1 - keepGoing = dlg.Update(self.count) - + if val==wx.ID_OK : self.colsel1 = dial.list_box_1.GetSelections() self.colsel2 = dial.list_box_2.GetSelections() if dial.chiopt : @@ -400,26 +101,11 @@ class ChiSquare(AnalyseMatrix): dial.dial.Destroy() dial.Destroy() self.parametres = None - - def doanalyse(self): - - - #self.dlg=wx.ProgressDialog("Traitements", - # "Veuillez patienter...", - # maximum = 4, - # parent=parent, - # style = wx.PD_APP_MODAL|wx.PD_AUTO_HIDE|wx.PD_ELAPSED_TIME - # ) - - - self.count += 1 - keepGoing = self.dlg.Update(self.count,u"Analyse dans R...") - #analyse=MakeChi2(self.parent, self.colsel1, self.colsel2, self.chioption, self.tableau) - #self.tableau = tableau + def doanalyse(self): + self.count = 1 + keepGoing = self.dlg.Update(self.count,"Analyse dans R...") self.OutFrame=tempfile.mktemp(dir=self.parent.TEMPDIR) - print self.OutFrame - #self.parent=parent self.encode=self.parent.encode self.TEMPDIR=self.parent.TEMPDIR self.RPath=self.parent.PathPath.get('PATHS','rpath') @@ -435,11 +121,7 @@ class ChiSquare(AnalyseMatrix): rchioption[val] = 'FALSE' txt=""" source("%s") - """%self.parent.RscriptsPath['Rfunct'] -# if parent.tableau.: rownames=1 -# else : rownames='NULL' -# if parent.g_header : header = 'TRUE' -# else : header = 'FALSE' + """%ffr(self.parent.RscriptsPath['Rfunct']) txt += """ source("%s") """ % ffr(self.parent.RscriptsPath['Rgraph']) @@ -461,13 +143,13 @@ class ChiSquare(AnalyseMatrix): cont<-1 """%(ffr(self.tableau.parametres['csvfile']), self.tableau.parametres['syscoding']) if len(self.colsel1)==1: - strsel1=str(self.colsel1).replace(',','') + strsel1=str(tuple(self.colsel1)).replace(',','') else: - strsel1=str(self.colsel1) + strsel1=str(tuple(self.colsel1)) if len(self.colsel2)==1: - strsel2=str(self.colsel2).replace(',','') + strsel2=str(tuple(self.colsel2)).replace(',','') else: - strsel2=str(self.colsel2) + strsel2=str(tuple(self.colsel2)) txt+=""" for (i in c%s) {""" % strsel1 txt+=""" @@ -625,8 +307,8 @@ class ChiSquare(AnalyseMatrix): write.csv2(frameout,file="%s") """ % (ffr(self.parametres['pathout']),ffr(self.OutFrame)) tmpfile=tempfile.mktemp(dir=self.TEMPDIR) - print tmpfile - tmpscript=open(tmpfile,'w') + print(tmpfile) + tmpscript=open(tmpfile,'w', encoding='utf8') tmpscript.write(txt) tmpscript.close() pid = exec_rcode(self.RPath, tmpfile, wait = False) @@ -634,88 +316,72 @@ class ChiSquare(AnalyseMatrix): sleep(0.2) check_Rresult(self.parent, pid) self.count += 1 - keepGoing = self.dlg.Update(self.count,u"Ecriture des résultats") - + keepGoing = self.dlg.Update(self.count,"Ecriture des résultats") listfileout = self.dolayout(self.chioption) - #listfileout=dlg.ShowChi2(ColSel1,ColSel2) - #parent.FreqNum += 1 - #parent.DictTab[u"Chi2_%s*"%parent.FreqNum]=listfileout -# parent.newtab = wx.html.HtmlWindow(parent.nb, -1) -# if "gtk2" in wx.PlatformInfo: -# parent.newtab.SetStandardFonts() -# parent.newtab.LoadPage(listfileout[len(listfileout)-1]) -# parent.nb.AddPage(parent.newtab,u"Chi2_%s*"%parent.FreqNum) -# parent.nb.SetSelection(parent.nb.GetPageCount()-1) -# parent.ShowTab(wx.EVT_BUTTON) -# parent.DisEnSaveTabAs(True) - self.count += 1 - keepGoing = self.dlg.Update(self.count,u"Fini") + #listfileout=dlg.ShowChi2(ColSel1,ColSel2) + #parent.FreqNum += 1 + #parent.DictTab[u"Chi2_%s*"%parent.FreqNum]=listfileout + #parent.newtab = wx.html.HtmlWindow(parent.nb, -1) + #if "gtk2" in wx.PlatformInfo: + #parent.newtab.SetStandardFonts() + #parent.newtab.LoadPage(listfileout[len(listfileout)-1]) + #parent.nb.AddPage(parent.newtab,u"Chi2_%s*"%parent.FreqNum) + #parent.nb.SetSelection(parent.nb.GetPageCount()-1) + #parent.ShowTab(wx.EVT_BUTTON) + #parent.DisEnSaveTabAs(True) + #self.count += 1 + #keepGoing = self.dlg.Update(self.count,u"Fini") def dolayout(self, option): ListFile=[False] - file=open(self.OutFrame,'rU') + file=open(self.OutFrame,'r', encoding='utf8') content=file.readlines() file.close() lcont = [line.replace('"','').replace('\n','').split(';') for line in content] - lcont.pop(0) lcont.pop(0) - allcoord = [] names = [] - res = [chi for chi in lcont if chi[0]=='res'] res = [make_res(line) for line in res] coord_res = [i for i,chi in enumerate(lcont) if chi[0]=='res'] if option['valobs']: allcoord.append([i for i,chi in enumerate(lcont) if chi[1]=='*obs*']) - names.append(u'Valeurs observées') + names.append('Valeurs observées') if option['valtheo'] : allcoord.append([i for i,chi in enumerate(lcont) if chi[1]=='*exp*']) - names.append(u'Valeurs théoriques') + names.append('Valeurs théoriques') if option['resi'] : allcoord.append([i for i,chi in enumerate(lcont) if chi[1]=='*resi*']) - names.append(u'Residuals') + names.append('Residuals') if option['contrib'] : allcoord.append([i for i,chi in enumerate(lcont) if chi[1]=='*contrib*']) - names.append(u'Contributions a posteriori') + names.append('Contributions a posteriori') if option['pourcent'] : allcoord.append([i for i,chi in enumerate(lcont) if chi[1]=='*pr*']) - names.append(u'Pourcentages') + names.append('Pourcentages') if option['pourcentl'] : allcoord.append([i for i,chi in enumerate(lcont) if chi[1]=='*prl*']) - names.append(u'Pourcentages en ligne') + names.append('Pourcentages en ligne') if option['pourcentc'] : allcoord.append([i for i,chi in enumerate(lcont) if chi[1]=='*prc*']) - names.append(u'Pourcentages en colonne') - + names.append('Pourcentages en colonne') allcoord.append(coord_res) allhtml = [[clean_line(lcont[allcoord[i][j]+1:allcoord[i+1][j]]) for j, line in enumerate(allcoord[i])] for i, tab in enumerate(allcoord) if i!=len(allcoord)-1] - allhtml = [make_table(val,names[i],res) for i,val in enumerate(allhtml)] - links = make_link_list(res, self.TextCroise) - #colors = [line[-1] for line in res] - - # good = [i for i,chi in enumerate(res) if chi[-1] == 'green' or chi[-1] == 'blue'] - #select_good = [[val[i] for i in good] for val in tout] - - html_res = make_restab(res) allhtml.insert(0,html_res) - titles = make_title(res, self.TextCroise) allhtml.insert(0,titles) - if option['graph'] : graphs = [line[7] for line in res] ListFile += graphs html_graphs = make_htmlgraphs(graphs) allhtml.append(html_graphs) - - header=u""" + header=""" \n - \n + \n \n

Test du Chi2

\n
@@ -725,15 +391,12 @@ class ChiSquare(AnalyseMatrix): p <= 0.05 mais il y a des valeurs théoriques < 5
p > 0.05

- """%self.parent.SysEncoding - - + """ pretxt = '
\n'.join(links)+'


\n' txt = '


\n'.join(['

'.join([tab[i] for tab in allhtml]) for i,val in enumerate(res)]) txt = header + pretxt + txt + '\n' - fileout=os.path.join(self.parametres['pathout'],'resultats-chi2.html') - with open(fileout, 'w') as f : + with open(fileout, 'w',encoding='utf8') as f : f.write(txt) ListFile.append(fileout) - return ListFile \ No newline at end of file + return ListFile