X-Git-Url: http://www.iramuteq.org/git?a=blobdiff_plain;f=tabchi2.py;h=aa5ea7c34edf09995da0676214c9042ac7a33722;hb=refs%2Fheads%2F3.0;hp=6a8cf550460d44717147356c65b3f72c52978625;hpb=22cd27b2bbe9ab1ffa7ef06fa764b5147ae17dad;p=iramuteq diff --git a/tabchi2.py b/tabchi2.py index 6a8cf55..aa5ea7c 100755 --- a/tabchi2.py +++ b/tabchi2.py @@ -1,22 +1,46 @@ -#!/bin/env python # -*- coding: utf-8 -*- #Author: Pierre Ratinaud -#Copyright (c) 2010 Pierre Ratinaud -#Lisense: GNU/GPL +#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') @@ -33,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] @@ -45,34 +69,59 @@ def make_title(res, text) : return ['
%s
retour
' % (i, val[-1], text[i], i) for i, val in enumerate(res)] +class ChiSquare(AnalyseMatrix): + def doparametres(self, dlg = None): + if dlg is None : + return + 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 : + self.colsel1 = dial.list_box_1.GetSelections() + self.colsel2 = dial.list_box_2.GetSelections() + if dial.chiopt : + chioption['valobs'] = dial.dial.check1.GetValue() + chioption['valtheo'] = dial.dial.check2.GetValue() + chioption['resi'] = dial.dial.check3.GetValue() + chioption['contrib'] = dial.dial.check4.GetValue() + chioption['pourcent'] = dial.dial.check5.GetValue() + chioption['pourcentl'] = dial.dial.check6.GetValue() + chioption['pourcentc'] = dial.dial.check7.GetValue() + chioption['graph'] = dial.dial.check8.GetValue() + chioption['bw'] = dial.dial.checkbw.GetValue() + dial.dial.Destroy() + dial.Destroy() + self.parametres.update(chioption) + self.chioption = chioption + else : + if dial.chiopt : + dial.dial.Destroy() + dial.Destroy() + self.parametres = None - -class MakeChi2(): - def __init__(self, parent, select1, select2, chioption): - self.OutFrame=tempfile.mktemp(dir=parent.TEMPDIR) - print self.OutFrame - self.parent=parent + def doanalyse(self): + self.count = 1 + keepGoing = self.dlg.Update(self.count,"Analyse dans R...") + self.OutFrame=tempfile.mktemp(dir=self.parent.TEMPDIR) self.encode=self.parent.encode - self.TEMPDIR=parent.TEMPDIR - self.RPath=parent.PathPath.get('PATHS','rpath') + self.TEMPDIR=self.parent.TEMPDIR + self.RPath=self.parent.PathPath.get('PATHS','rpath') self.TextCroise=[] - for i in select1 : - for j in select2 : - self.TextCroise.append(parent.tableau.colnames[i] + ' / ' + parent.tableau.colnames[j]) + for i in self.colsel1 : + for j in self.colsel2 : + self.TextCroise.append(self.tableau.colnames[i] + ' / ' + self.tableau.colnames[j]) rchioption = {} - for val in chioption : - if chioption[val]: + for val in self.chioption : + if self.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' + """%ffr(self.parent.RscriptsPath['Rfunct']) txt += """ source("%s") """ % ffr(self.parent.RscriptsPath['Rgraph']) @@ -88,23 +137,23 @@ class MakeChi2(): bw <- %s """ % (rchioption['valobs'], rchioption['valtheo'], rchioption['contrib'], rchioption['resi'], rchioption['pourcent'], rchioption['pourcentl'], rchioption['pourcentc'], rchioption['graph'], rchioption['bw']) txt+=""" - datadm <- ReadData("%s", encoding="%s", header = TRUE, sep = "%s",quote = '%s', na.strings = "%s",rownames= 1) + datadm <- read.csv2("%s", encoding="%s", header = TRUE, row.names = 1, sep='\\t', quote = '"', na.string = '') listres<-list() listcol<-list() cont<-1 - """%(ffr(parent.tableau.parametre['csvfile']),self.parent.encode, parent.tableau.parametre['colsep'], parent.tableau.parametre['txtsep'], self.parent.nastrings) - if len(select1)==1: - strsel1=str(select1).replace(',','') + """%(ffr(self.tableau.parametres['csvfile']), self.tableau.parametres['syscoding']) + if len(self.colsel1)==1: + strsel1=str(tuple(self.colsel1)).replace(',','') else: - strsel1=str(select1) - if len(select2)==1: - strsel2=str(select2).replace(',','') + strsel1=str(tuple(self.colsel1)) + if len(self.colsel2)==1: + strsel2=str(tuple(self.colsel2)).replace(',','') else: - strsel2=str(select2) + strsel2=str(tuple(self.colsel2)) txt+=""" - for (i in c%s) {"""%strsel1 + for (i in c%s) {""" % strsel1 txt+=""" - for (j in c%s) {"""%strsel2 + for (j in c%s) {""" % strsel2 txt+=""" tab<-table(datadm[,i+1],datadm[,j+1]) if (min(dim(tab)) != 1) { @@ -148,9 +197,7 @@ class MakeChi2(): chi$prl <- round((chi$observed/sr)*100,2) chi$prc <- t(round((t(chi$observed)/sc)*100,2)) } - fileout<-paste('histo',%i,sep='') - fileout<-paste(fileout,'_',sep='') - fileout<-paste(fileout,count,sep='') + fileout<-paste('histo_',count,sep='') fileout<-paste(fileout,'.png',sep='') count<-count+1 fileout<-file.path("%s",fileout) @@ -258,82 +305,83 @@ class MakeChi2(): li<-matrix('fin_analyse',1,maxcol) frameout<-rbind(frameout,li) write.csv2(frameout,file="%s") - """%(parent.FreqNum,ffr(parent.TEMPDIR),ffr(self.OutFrame)) + """ % (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) while pid.poll() == None : sleep(0.2) - check_Rresult(self.parent, pid) + check_Rresult(self.parent, pid) + self.count += 1 + 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") 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
@@ -343,84 +391,12 @@ class MakeChi2(): 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.TEMPDIR,'resultats-chi2_%s.html'%str(self.parent.FreqNum)) - file=open(fileout,'w') - file.write(txt) - file.close() + fileout=os.path.join(self.parametres['pathout'],'resultats-chi2.html') + with open(fileout, 'w',encoding='utf8') as f : + f.write(txt) ListFile.append(fileout) return ListFile - -class ChiSquare(): - def __init__(self,parent): - chioption = { 'valobs' : True, - 'valtheo' : True, - 'resi' : False, - 'contrib' : True, - 'pourcent' : False, - 'pourcentl' : True, - 'pourcentc' : True, - 'graph' : True, - 'bw' : False, - } - dlg = ChiDialog(parent, -1, u"Chi2", chioption, size=(400, 350), - style = wx.DEFAULT_DIALOG_STYLE - ) - dlg.CenterOnParent() - val = dlg.ShowModal() - if val==wx.ID_OK : - 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.dlg.Center() - self.count = 1 - keepGoing = self.dlg.Update(self.count) - - ColSel1 = dlg.list_box_1.GetSelections() - ColSel2 = dlg.list_box_2.GetSelections() - if dlg.chiopt : - chioption['valobs'] = dlg.dial.check1.GetValue() - chioption['valtheo'] = dlg.dial.check2.GetValue() - chioption['resi'] = dlg.dial.check3.GetValue() - chioption['contrib'] = dlg.dial.check4.GetValue() - chioption['pourcent'] = dlg.dial.check5.GetValue() - chioption['pourcentl'] = dlg.dial.check6.GetValue() - chioption['pourcentc'] = dlg.dial.check7.GetValue() - chioption['graph'] = dlg.dial.check8.GetValue() - chioption['bw'] = dlg.dial.checkbw.GetValue() - dlg.dial.Destroy() - - self.count += 1 - keepGoing = self.dlg.Update(self.count,u"Analyse dans R...") - analyse=MakeChi2(parent,ColSel1,ColSel2, chioption) - - self.count += 1 - keepGoing = self.dlg.Update(self.count,u"Ecriture des résultats") - - listfileout = analyse.dolayout(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") - else : - if dlg.chiopt : - dlg.dial.Destroy() - dlg.Destroy()