2.5terminado

parent e89cce3e
import math import matplotlib.pyplot as plt
from tkinter import messagebox
# Explora la relacion entre las visitas de pagina y la duración de sesion # Explora la relacion entre las visitas de pagina y la duración de sesion
def getRelacionVisitasDuracion(reg):
# Se obtiene el diagrama de dispersion
paginas, tiempo, tiempoMedioPagina = getPaginasVisitas(reg)
fig, ax = plt.subplots()
ax.scatter(paginas, tiempo)
# Se obtiene la ecuacion de regresión estimada según los máximos y mínimos
ecuacion = obtenerRegresion(paginas, tiempo)
x0 = min(paginas)
y0 = x0*ecuacion[0] + ecuacion[1]
x1 = max(paginas)
y1 = x1*ecuacion[0] + ecuacion[1]
plt.plot([x0, x1], [y0, y1], marker='o')
# Mostramos el gráfico y devolvemos la pendiente (ecuacion[0] con el tiempo medio de pagina)
plt.title("Diagrama de dispersión y recta de regresión (y sobre x)")
plt.ylabel("Paginas Visitadas")
plt.xlabel("Tiempo total de la Sesion")
plt.show()
datos = "Tiempo Medio de Pagina: {}. Pendiente: {}."
messagebox.showinfo(message=datos.format(tiempoMedioPagina, ecuacion[0]), title="Comparación tiempo medio con pendiente del modelo")
def getPaginasVisitas(reg):
# Obtengo paginas visitadas por sesion y su tiempo, ademas de tiempo de pagina
paginas = [1]
tiempoVisita = [0]
tiempoPagina = []
tam = len(reg)
index = 0
for i in range(tam):
r = reg[i]
if i < tam - 1:
tiempoPagina.append(reg[i+1].Marca_Tiempo - r.Marca_Tiempo)
if r.ID_Sesion == reg[i+1].ID_Sesion: # Si es la misma sesion se incrementan valores
paginas[index] += 1
tiempoVisita[index] = reg[i+1].Marca_Tiempo
else: # Si no se crea nueva
index += 1
paginas.append(1)
tiempoVisita.append(0)
tiempoMedioPag = sum(tiempoPagina)/len(tiempoPagina)
return paginas, tiempoVisita, tiempoMedioPag
# Se obtienen las dos cifras de la recta de regresion de y sobre x: y = Ax + B, ya que es simple
def obtenerRegresion(paginas, tiempo):
ecuacion = []
tam = len(paginas)
# Obtenemos medias aritmeticas
medx = sum(paginas)/tam
medy = sum(tiempo)/tam
# Obtenemos la covarianza y varianza de y
xy = 0
sqx = 0
sqy = 0
for i in range(tam):
xy += paginas[i] * tiempo[i]
sqx += paginas[i] * paginas[i]
sqy += tiempo[i] * tiempo[i]
cov = xy/tam - medx*medy
vay = sqy/tam - medy*medy
# Obtenemos la recta de regresión de Y sobre X, y = cov/vay(x - medx) + medy
Ax = cov/vay
Bc = Ax * medx + medy
ecuacion.append(Ax) # Para Ax
ecuacion.append(Bc) # Para B
return ecuacion
...@@ -4,9 +4,9 @@ from Filtros import getTiempoEnPagina ...@@ -4,9 +4,9 @@ from Filtros import getTiempoEnPagina
from Filtros import getDistintasPaginas from Filtros import getDistintasPaginas
def analisisTiempoMedioPorPagina(registros): def analisisTiempoMedioPorPagina(registros, umbral):
# Ordeno los registros por sesion # Ordeno los registros por sesion
reg = ordenaRegistros(registros, 1800) reg = ordenaRegistros(registros, umbral)
# Obtengo los id de las sesiones existentes # Obtengo los id de las sesiones existentes
idsExistentes = getDistintasSesiones(reg) idsExistentes = getDistintasSesiones(reg)
# Obtengo las distintas paginas existentes # Obtengo las distintas paginas existentes
......
from Constantes import FACTOR_UMBRAL
class Cesta: class Cesta:
def __init__(self, directorios, sesiones, tam, i): def __init__(self, directorios, sesiones, tam, i):
# Atributos # Atributos
...@@ -21,10 +18,8 @@ class Cesta: ...@@ -21,10 +18,8 @@ class Cesta:
# Se obtienen los directorios aquellos que cumplen el umbral # Se obtienen los directorios aquellos que cumplen el umbral
def obtenerDirectorios(reg): def obtenerDirectorios(reg, fumb):
global FACTOR_UMBRAL umbral = int(len(reg) * fumb / 100)
fu = FACTOR_UMBRAL
umbral = int(len(reg) * fu / 100)
directorios = [] directorios = []
contadores = [] contadores = []
...@@ -92,6 +87,8 @@ def obtenerCestaTransformada(directorios, sesiones): ...@@ -92,6 +87,8 @@ def obtenerCestaTransformada(directorios, sesiones):
else: # Si no se elimina else: # Si no se elimina
cesta.pop(i - sacadas) cesta.pop(i - sacadas)
sacadas += 1 sacadas += 1
# Agregar aquellas que la referencian también
# Se ordenan por sesion
sesionesUsadas, cesta = zip(*sorted(zip(sesionesUsadas, cesta)))
return cesta return cesta
RUTA_ARCHIVO = "" # "../access_log_Aug95_reducido"
E_SPIDERING = True
EXTENSIONES_ADMITIDAS = []
EXTENSIONES_NOADMITIDAS = []
UMBRAL_SESIONES = 1800
FACTOR_UMBRAL = 0.5
REG = []
...@@ -5,17 +5,17 @@ from Cesta import obtenerDirectorios ...@@ -5,17 +5,17 @@ from Cesta import obtenerDirectorios
class DirectoriosMasSol: class DirectoriosMasSol:
def __init__(self, reg): def __init__(self, reg, umb):
self.v = Tk() self.v = Tk()
self.v.resizable(0, 0) self.v.resizable(0, 0)
self.v.title("Directorios Mas Solicitados") self.v.title("Directorios Mas Solicitados")
self.v.geometry('600x600') self.v.geometry('600x600')
# Se obtienen los directorios con contadores y la cesta # Se obtienen los directorios con contadores y la cesta
d, cont, ses = obtenerDirectorios(reg) d, cont, ses = obtenerDirectorios(reg, umb)
num_dir = len(d) num_dir = len(d)
# Creo la tabla y relleno las cabeceras # Creo la tabla y relleno las cabeceras
self.tabla = ttk.Treeview(self.v, height=100, columns=[f"#{n}" for n in range(0, 5)]) self.tabla = ttk.Treeview(self.v, height=100, columns=[f"#{n}" for n in range(4)])
scrollbar_vertical = ttk.Scrollbar(self.v, orient='vertical', command=self.tabla.yview) scrollbar_vertical = ttk.Scrollbar(self.v, orient='vertical', command=self.tabla.yview)
scrollbar_horizontal = ttk.Scrollbar(self.v, orient='horizontal', command=self.tabla.xview) scrollbar_horizontal = ttk.Scrollbar(self.v, orient='horizontal', command=self.tabla.xview)
...@@ -29,15 +29,13 @@ class DirectoriosMasSol: ...@@ -29,15 +29,13 @@ class DirectoriosMasSol:
# Cabeceras tabla # Cabeceras tabla
self.tabla.heading('#1', text="Indice") self.tabla.heading('#1', text="Indice")
self.tabla.column('#1', width=100, anchor=CENTER) self.tabla.column('#1', width=150, anchor=CENTER)
self.tabla.heading('#2', text="Sesion") self.tabla.heading('#2', text="Directorio")
self.tabla.column('#2', width=100, anchor=CENTER) self.tabla.column('#2', width=150, anchor=CENTER)
self.tabla.heading('#3', text="Directorio") self.tabla.heading('#3', text="Cuenta")
self.tabla.column('#3', width=100, anchor=CENTER) self.tabla.column('#3', width=150, anchor=CENTER)
self.tabla.heading('#4', text="Cuenta") self.tabla.heading('#4', text="Porcentaje")
self.tabla.column('#4', width=100, anchor=CENTER) self.tabla.column('#4', width=150, anchor=CENTER)
self.tabla.heading('#5', text="Porcentaje")
self.tabla.column('#5', width=200, anchor=CENTER)
# Inserto los registros # Inserto los registros
...@@ -48,7 +46,7 @@ class DirectoriosMasSol: ...@@ -48,7 +46,7 @@ class DirectoriosMasSol:
for i in range(num_dir): for i in range(num_dir):
index += 1 index += 1
per = ("{:.2f}".format(cont[i]/len(reg) * 100) + "%") per = ("{:.2f}".format(cont[i]/len(reg) * 100) + "%")
aux = [str(index), ses[i], d[i], cont[i], per] aux = [str(index), d[i], cont[i], per]
self.tabla.insert("", 'end', values=aux) self.tabla.insert("", 'end', values=aux)
self.v.mainloop() self.v.mainloop()
UMBRAL_T = 1 # <<Parametrizar esto # Filtros para las distintas utilidades
def getFormatosFromCSV(cad): def getFormatosFromCSV(cad):
...@@ -52,7 +52,7 @@ def getTiempoEnPagina(id, pagina, registros): ...@@ -52,7 +52,7 @@ def getTiempoEnPagina(id, pagina, registros):
# Elimina las sesiones que han invertido menos de 0,5 segundos en el acceso # Elimina las sesiones que han invertido menos de 0,5 segundos en el acceso
def eliminarComportamientoAutomatico(registros): def eliminarComportamientoAutomatico(registros, umbral):
# Ordeno por sesion # Ordeno por sesion
reg = ordenarPorSesion(registros) reg = ordenarPorSesion(registros)
sesionActual = reg[0].ID_Sesion sesionActual = reg[0].ID_Sesion
...@@ -68,7 +68,7 @@ def eliminarComportamientoAutomatico(registros): ...@@ -68,7 +68,7 @@ def eliminarComportamientoAutomatico(registros):
else: else:
if iMin != iMax: # <--- Si ha visitado mas de dos paginas en la sesion miro el tiempo if iMin != iMax: # <--- Si ha visitado mas de dos paginas en la sesion miro el tiempo
tiempo = abs(reg[iMax].Marca_Tiempo - reg[iMin].Marca_Tiempo) tiempo = abs(reg[iMax].Marca_Tiempo - reg[iMin].Marca_Tiempo)
if tiempo < UMBRAL_T: if tiempo < umbral:
idSesionesNoValidas.add(sesionActual) idSesionesNoValidas.add(sesionActual)
sesionActual = reg[i].ID_Sesion sesionActual = reg[i].ID_Sesion
# Me quedo con los registros con ids validos # Me quedo con los registros con ids validos
......
...@@ -6,6 +6,7 @@ from ObtencionRegistro import obtenerRegistros ...@@ -6,6 +6,7 @@ from ObtencionRegistro import obtenerRegistros
from GuiEstadisticas import getEstadisticas from GuiEstadisticas import getEstadisticas
from GuiEstadisticas import estadisticasTMedioPag from GuiEstadisticas import estadisticasTMedioPag
from eliminarComportamientoAutomatico_GUI import FiltrarComportamientoAutomatico from eliminarComportamientoAutomatico_GUI import FiltrarComportamientoAutomatico
from ObtenerMasVisitados import ObtenerMasVisitados
from DirectoriosMasSolicitados_GUI import DirectoriosMasSol from DirectoriosMasSolicitados_GUI import DirectoriosMasSol
from AnalisisDuracionSesion import estadisticasDuracionSesiones from AnalisisDuracionSesion import estadisticasDuracionSesiones
from Dato import Dato from Dato import Dato
...@@ -14,33 +15,27 @@ from Filtros import eliminarComportamientoAutomatico ...@@ -14,33 +15,27 @@ from Filtros import eliminarComportamientoAutomatico
from VentanaAbrir import VentanaAbrir from VentanaAbrir import VentanaAbrir
from About_GUI import VentanaAbout from About_GUI import VentanaAbout
from TransfCesta import TransformarCesta from TransfCesta import TransformarCesta
from Constantes import REG from AnalisisRelacionVisitasDuracion import getRelacionVisitasDuracion
# from AnalisisRelacionVisitasDuracion import getDuracionPrimerasVisitas
def f_abrir(): def f_abrir():
global RUTA_ARCHIVO
RUTA_ARCHIVO = filedialog.askopenfilename(initialdir="/", title="Seleccione fichero", RUTA_ARCHIVO = filedialog.askopenfilename(initialdir="/", title="Seleccione fichero",
filetypes=( filetypes=(
("all files", "*.*"), ("txt files", "*.txt"), ("log files", "*.log"))) ("all files", "*.*"), ("txt files", "*.txt"), ("log files", "*.log")))
v = VentanaAbrir() v = VentanaAbrir()
global EXTENSIONES_ADMITIDAS
EXTENSIONES_ADMITIDAS = getFormatosFromCSV(v.formadmin.get()) EXTENSIONES_ADMITIDAS = getFormatosFromCSV(v.formadmin.get())
global EXTENSIONES_NOADMITIDAS
EXTENSIONES_NOADMITIDAS = getFormatosFromCSV(v.formnoadmin.get()) EXTENSIONES_NOADMITIDAS = getFormatosFromCSV(v.formnoadmin.get())
global E_SPIDERING
E_SPIDERING = v.es != 0 E_SPIDERING = v.es != 0
global UMBRAL_SESIONES global UMBRAL_SESIONES
global REG
try: try:
UMBRAL_SESIONES = int(float(v.umb.get())) UMBRAL_SESIONES = int(v.umb.get())
finally: except:
UMBRAL_SESIONES = 1800 UMBRAL_SESIONES = 1800
v.cerrarVentana() v.cerrarVentana()
global REG
REG = obtenerRegistros(RUTA_ARCHIVO, E_SPIDERING, EXTENSIONES_ADMITIDAS, EXTENSIONES_NOADMITIDAS, REG = obtenerRegistros(RUTA_ARCHIVO, E_SPIDERING, EXTENSIONES_ADMITIDAS, EXTENSIONES_NOADMITIDAS,
UMBRAL_SESIONES) UMBRAL_SESIONES)
insertaRegistros() insertaRegistros()
...@@ -49,55 +44,69 @@ def f_salir(): ...@@ -49,55 +44,69 @@ def f_salir():
def about(): def about():
v = VentanaAbout() VentanaAbout()
def fDurSes(): def fDurSes():
global REG
if len(REG) > 0: if len(REG) > 0:
histograma, maxDur, minDur, moda, media, desviacionTipica = estadisticasDuracionSesiones(REG) histograma, maxDur, minDur, moda, media, desviacionTipica = estadisticasDuracionSesiones(REG)
getEstadisticas(histograma, maxDur, minDur, moda, media, desviacionTipica) getEstadisticas(histograma, maxDur, minDur, moda, media, desviacionTipica)
def fPagVisit(): def fPagVisit():
global REG
if len(REG) > 0: if len(REG) > 0:
histograma, maxDur, minDur, moda, media, desviacionTipica = getEstadisticasPaginasVisitadas(REG) histograma, maxDur, minDur, moda, media, desviacionTipica = getEstadisticasPaginasVisitadas(REG)
getEstadisticas(histograma, maxDur, minDur, moda, media, desviacionTipica) getEstadisticas(histograma, maxDur, minDur, moda, media, desviacionTipica)
def fTmPag(): def fTmPag():
global REG
if len(REG) > 0: if len(REG) > 0:
estadisticasTMedioPag(REG) estadisticasTMedioPag(REG, UMBRAL_SESIONES)
def fElimCAuto(): def fElimCAuto():
v = FiltrarComportamientoAutomatico() v = FiltrarComportamientoAutomatico()
global UMBRAL_T
try: try:
UMBRAL_T = float(v.formadmin.get()) UMBRAL_T = float(v.formadmin.get())
finally: except:
UMBRAL_T = 0.5 UMBRAL_T = 1
v.cerrarVentana() v.cerrarVentana()
global REG
if len(REG) > 0: if len(REG) > 0:
REG = eliminarComportamientoAutomatico(REG) REG = eliminarComportamientoAutomatico(REG, UMBRAL_T)
insertaRegistros() insertaRegistros()
def fMasDSol(): def fMasDSol():
global REG v = ObtenerMasVisitados()
try:
UMBRAL_VISITAS = float(v.formadmin.get())
except:
UMBRAL_VISITAS = 0.5
v.cerrarVentana()
if len(REG) > 0: if len(REG) > 0:
v = DirectoriosMasSol(REG) DirectoriosMasSol(REG, UMBRAL_VISITAS)
def fTransCest(): def fTransCest():
global REG v = ObtenerMasVisitados()
try:
UMBRAL_VISITAS = float(v.formadmin.get())
except:
UMBRAL_VISITAS = 0.5
v.cerrarVentana()
if len(REG) > 0:
TransformarCesta(REG, UMBRAL_VISITAS)
def fRelVisDur():
if len(REG) > 0: if len(REG) > 0:
v = TransformarCesta(REG) getRelacionVisitasDuracion(REG)
def fDurVis():
if len(REG) > 0:
return #getDuracionPrimerasVisitas(REG)
def barraMenu(ventana): def barraMenu(ventana):
# DEFINIR BARRA DE MENÚ DE LA APLICACION: # DEFINIR BARRA DE MENÚ DE LA APLICACION:
barramenu = Menu(ventana) barramenu = Menu(ventana)
...@@ -122,10 +131,14 @@ def barraMenu(ventana): ...@@ -122,10 +131,14 @@ def barraMenu(ventana):
underline=0, compound=RIGHT) underline=0, compound=RIGHT)
menu2.add_command(label='Paginas visitadas', command=fPagVisit, menu2.add_command(label='Paginas visitadas', command=fPagVisit,
underline=0, compound=RIGHT) underline=0, compound=RIGHT)
menu2.add_command(label='Tiempo Medio Pagina', command=fTmPag, menu2.add_command(label='Tiempos Medios de Pagina', command=fTmPag,
underline=0, compound=RIGHT) underline=0, compound=RIGHT)
menu2.add_command(label='Eliminar comportamiento automático', command=fElimCAuto, menu2.add_command(label='Eliminar comportamiento automático', command=fElimCAuto,
underline=0, compound=RIGHT) underline=0, compound=RIGHT)
menu2.add_command(label='Relacion entre visitas y duracion', command=fRelVisDur,
underline=0, compound=RIGHT)
menu2.add_command(label='Duracion de primeras 2 visitas en cada sesion', command=fDurVis,
underline=0, compound=RIGHT)
menu3 = Menu(barramenu) menu3 = Menu(barramenu)
barramenu.add_cascade(menu=menu3, label='Cesta') barramenu.add_cascade(menu=menu3, label='Cesta')
...@@ -159,7 +172,6 @@ def getDatosRegistro(registro, atributos, contador): ...@@ -159,7 +172,6 @@ def getDatosRegistro(registro, atributos, contador):
# Inserta cada tupla de todos los registros # Inserta cada tupla de todos los registros
def insertaRegistros(): def insertaRegistros():
tabla.delete(*tabla.get_children()) tabla.delete(*tabla.get_children())
global REG
cont = 1 cont = 1
for r in REG: for r in REG:
val = getDatosRegistro(r, atributos, cont) val = getDatosRegistro(r, atributos, cont)
......
...@@ -5,11 +5,11 @@ from AnalisisTMedioPagina import analisisTiempoMedioPorPagina ...@@ -5,11 +5,11 @@ from AnalisisTMedioPagina import analisisTiempoMedioPorPagina
def getEstadisticas(histograma, max, min, moda, media, desviacionTipica): def getEstadisticas(histograma, max, min, moda, media, desviacionTipica):
l = [] la = []
for i in range(len(histograma)): for i in range(len(histograma)):
l.append(i) la.append(i)
arrayHisto = np.array(histograma) arrayHisto = np.array(histograma)
arrayY = np.array(l) arrayY = np.array(la)
plt.bar(arrayY, arrayHisto, align="center") plt.bar(arrayY, arrayHisto, align="center")
plt.title("Histograma") plt.title("Histograma")
plt.show() plt.show()
...@@ -18,8 +18,8 @@ def getEstadisticas(histograma, max, min, moda, media, desviacionTipica): ...@@ -18,8 +18,8 @@ def getEstadisticas(histograma, max, min, moda, media, desviacionTipica):
messagebox.showinfo(message=cad, title="Estadisticas") messagebox.showinfo(message=cad, title="Estadisticas")
def estadisticasTMedioPag(reg): def estadisticasTMedioPag(reg, umbral):
paginas, tiempos, histograma = analisisTiempoMedioPorPagina(reg) paginas, tiempos, histograma = analisisTiempoMedioPorPagina(reg, umbral)
fig = plt.figure("Estadisticas") fig = plt.figure("Estadisticas")
g1 = fig.add_subplot(211) g1 = fig.add_subplot(211)
g2 = fig.add_subplot(212) g2 = fig.add_subplot(212)
...@@ -30,11 +30,11 @@ def estadisticasTMedioPag(reg): ...@@ -30,11 +30,11 @@ def estadisticasTMedioPag(reg):
# g1.set_xtickslabels(paginas) # g1.set_xtickslabels(paginas)
g1.set_ylabel("Tiempo Medio") g1.set_ylabel("Tiempo Medio")
l = [] la = []
for i in range(len(histograma)): for i in range(len(histograma)):
l.append(i) la.append(i)
arrayHisto = np.array(histograma) arrayHisto = np.array(histograma)
arrayY = np.array(l) arrayY = np.array(la)
g2.bar(arrayY, arrayHisto, align="center") g2.bar(arrayY, arrayHisto, align="center")
g2.set_ylabel("Histograma") g2.set_ylabel("Histograma")
plt.show() plt.show()
...@@ -9,7 +9,6 @@ def obtenerRegistros(ruta, espidering, extensionesAdmitidas, extensionesNoAdmiti ...@@ -9,7 +9,6 @@ def obtenerRegistros(ruta, espidering, extensionesAdmitidas, extensionesNoAdmiti
# Compruebo si hay que hacer el e-Spidering # Compruebo si hay que hacer el e-Spidering
if espidering: if espidering:
ret = eSpidering(ret) ret = eSpidering(ret)
print("Procesados ", len(ret), "registros")
return identificaciones(ret, umbral) return identificaciones(ret, umbral)
...@@ -24,7 +23,7 @@ def leerLog(ruta, extensionesAdmitidas, extensionesNoAdmitidas): ...@@ -24,7 +23,7 @@ def leerLog(ruta, extensionesAdmitidas, extensionesNoAdmitidas):
aux = Dato(linea) aux = Dato(linea)
if not aux.isPerdido(): # Si no es un valor perdido lo incluimos en los registros if not aux.isPerdido(): # Si no es un valor perdido lo incluimos en los registros
ret = obtenerDato(ret, extensionesAdmitidas, extensionesNoAdmitidas, aux) ret = obtenerDato(ret, extensionesAdmitidas, extensionesNoAdmitidas, aux)
finally: except:
continue continue
f.close() f.close()
......
import tkinter as ttk
from tkinter import *
class ObtenerMasVisitados:
def __init__(self):
self.app = Tk()
self.app.title("Obtenecion Directorios más visitados o Cesta")
self.app.geometry('650x100')
lb1 = ttk.Label(self.app, text="Considerar directorio suficientemente visitado en (%): ")
lb1.place(x=40, y=30)
self.formadmin = ttk.Entry(self.app)
self.formadmin.place(x=500, y=30)
self.boton = ttk.Button(self.app, text="Aceptar", command=self.app.quit)
self.boton.place(x=40, y=60)
self.app.mainloop()
def cerrarVentana(self):
self.app.destroy()
\ No newline at end of file
...@@ -2,16 +2,14 @@ from tkinter import ttk ...@@ -2,16 +2,14 @@ from tkinter import ttk
from tkinter import * from tkinter import *
from Cesta import obtenerDirectorios from Cesta import obtenerDirectorios
from Cesta import obtenerCestaTransformada from Cesta import obtenerCestaTransformada
from Constantes import FACTOR_UMBRAL
class TransformarCesta: class TransformarCesta:
def __init__(self, reg): def __init__(self, reg, fumb):
# Se obtienen los directorios con contadores y la cesta # Se obtienen los directorios con contadores y la cesta
global FACTOR_UMBRAL umbral = int(len(reg) * fumb / 100)
umbral = int(len(reg) * FACTOR_UMBRAL / 100) d, cont, ses = obtenerDirectorios(reg, fumb)
d, cont, ses = obtenerDirectorios(reg)
num_dir = len(d) num_dir = len(d)
# Obtiene cesta transformada y la muestra # Obtiene cesta transformada y la muestra
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment