# importamos librerias
import io
import asyncio
import pandas as pd
import matplotlib.pyplot as plt
from js import document, FileReader
from pyodide.ffi import create_proxy
################################### las funciones que se llaman aparte cada una tras cargar los datos pulsando botones
def media_aritm():
val = int(document.getElementById("tentacles").value) -1; # restamos unidad para interpretarlo según normativas python
manual_div = Element("dato") # indicamos donde lo vamos a representar
media = df.iloc[:,val].mean()
manual_div.element.innerText = "media de variable " + str(df.columns[int(val)])+ " es " + str(media.round(4));
def varianza_aritm():
val = document.getElementById("tentacles").value
manual_div = Element("dato")
varianza = df.iloc[:,int(val)-1].var()
manual_div.element.innerText = "varianza de variable " + str(df.columns[int(val)-1])+ " es " + str(varianza.round(4));
def graficadora():
manual_div = Element("mpl2")
manual_div2 = Element("inforecta1")
manual_div3 = Element("inforecta2")
manual_div.element.innerText = " ";
manual_div2.element.innerText = " ";
manual_div3.element.innerText = " ";
fig, ax = plt.subplots()
val1 = int(document.getElementById("tentacles_graf1").value) -1;
val2 = int(document.getElementById("tentacles_graf2").value) - 1;
var_x = list(df.iloc[:,val1])
var_y = list(df.iloc[:,val2])
# creamos dataframe particular a partir de uno dado y sacamos los datos de recta regresión
global dfnew;
dfnew = pd.DataFrame()
dfnew[str(df.columns[val1])] = var_x
dfnew[str(df.columns[val2])] = var_y
matr_cov = dfnew.cov()
global b0;
global b1;
b1 = matr_cov.iloc[0,1]/matr_cov.iloc[0,0]
b0 = dfnew.iloc[:,1].mean() - b1*(dfnew.iloc[:,0].mean())
# creamos dos listas para representar la recta
var_x_recta = [min(var_x), max(var_x)]
var_y_recta = [min(var_x)*b1+b0, max(var_x)*b1+b0]
manual_div2.element.innerText = "COV " + str(matr_cov.iloc[0,1].round(4));
manual_div3.element.innerText = "RECTA: " + "Y = " + str(b1.round(4)) + "·X" + " + " + str(b0.round(4))
plt.plot(var_x, var_y, marker='.', linestyle='', color='blue', markersize = 5, label=' ')
plt.plot(var_x_recta, var_y_recta, linewidth=1, color ="red")
plt.xlabel(str(df.columns[val1]))
plt.ylabel(str(df.columns[val2]))
plt.title(' ')
plt.legend(loc='lower right')
fig.set_size_inches(5.5, 5.5)
display(fig, target="mpl2")
graficaerror(dfnew, b0, b1)
def graficaerror(dataframe, b0, b1):
manual_div = Element("graficaerror")
manual_div.element.innerText = " ";
manual_div2= Element("ecm")
manual_div2.element.innerText = " ";
fig, ax = plt.subplots()
var_x = list(dataframe.iloc[:,0])
var_y = list(dataframe.iloc[:,1])
# creamos dos listas para representar la recta
var_x_recta = [min(var_x), max(var_x)]
var_y_recta = [0, 0]
# conjunto de errores
global error;
error = [];
for i in range(len(var_x)):
e = var_y[i]- var_x[i]*b1-b0;
error.append(e)
ecm = 0;
for e in error:
ecm = ecm + e**2
ecm = ecm/len(error)
manual_div2.element.innerText = "ECM: " + str(ecm.round(4))
# esperanza de error para cada xi
esp_error = [];
numeros_unicos = list(set(var_x))
for i in range(len(numeros_unicos)):
e = 0
k = 0;
for j in range(len(var_x)):
if var_x[j] == numeros_unicos[i]:
e = e + error[j]
k = k +1;
esp_error.append(e/k)
# varianza de error para cada xi (Homoscedasticidad) la varianza debe ser constante
var_error_indice = [];
var_error_valor = []
for x in numeros_unicos:
xi = [indice for indice, dato in enumerate(var_x) if dato == x]
vi = []
for y in xi:
vi.append(error[y])
var_error_indice.append(vi)
for i in range(len(var_error_indice)):
df_new = pd.DataFrame(var_error_indice[i])
var_error_valor.append((df_new.iloc[:,0]).var())
plt.plot(var_x, error, marker='.', linestyle='', color='grey', markersize = 3, label='error')
plt.plot(var_x_recta, var_y_recta, linewidth=1, color ="red")
plt.plot(numeros_unicos, esp_error, marker='.', linestyle='', color='green', markersize = 5, label='esperanza del error')
plt.plot(numeros_unicos, var_error_valor, marker='.', linestyle='', color='blue', markersize = 5, label='varianza del error')
plt.xlabel(str(df.columns[0]))
plt.ylabel("error")
plt.title(' ')
plt.legend(loc='lower right')
fig.set_size_inches(5.5, 3)
display(fig, target="graficaerror")
# borrar todas las gráficas
def borrar():
manual_div = Element("mpl2")
manual_div.element.innerText = " "; # limpiar cada vez despues de representar nueva gráfica
manual_div2 = Element("inforecta1")
manual_div2.element.innerText = " ";
manual_div3 = Element("ecm")
manual_div3.element.innerText = " ";
manual_div4 = Element("graficaerror")
manual_div4.element.innerText = " ";
manual_div5 = Element("inforecta2")
manual_div5.element.innerText = " ";
### ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
### ///////////////////////////// el código de abajo carga el archivo desde boton (1), define variables a partir de este (3),
### además representa parte de archivo en div content y define variables globales (4),
### el resto de código (superior) funciona ya correctamente con estas variables
### 2. procesado de archivo
async def process_file(event):
fileList = event.target.files.to_py()
### 4. esta función se ejecuta automáticamente al cargar el archivo (en boocle de abajo)
### solo representa por pantalla rsumen del archivo
### y define variables globales para el resto del código
def representar(dataframe):
nombres_1 = dataframe.columns.values
nombres_2 = str(nombres_1)
document.getElementById("content").innerHTML = nombres_2 # también puede usarse innerHTML o innerText
# ahora de una vez se guarda esta variable global para poder usarla en todo el script
global df;
df = dataframe;
global tamanio;
tamanio = len(dataframe)
minimal = min(tamanio,4) # para decidir lineas máximo a representar
# se imrime en ventana principal (capa 1)
for x in range(minimal):
document.getElementById("content" + str(x)).innerHTML = list(dataframe.iloc[x])
document.getElementById("content5").innerHTML = "... ... tamaño total: " + str(tamanio)
### 3. definimos variable df (no global de momento) a partir del texto
### y llamamos función para representar (que también define variables flobales)
for f in fileList:
data = await f.text()
# read_csv recibe como parámetro archivo de texto pero en este caso le pasamos simple contenido del archivo
# para que read_csv pueda recibir este formato hay que añadir io.stringIO función creada para esto
df_0 = pd.read_csv(io.StringIO(data))
# representar parte de archivo en un div
representar(df_0)
### 1. inicia aquí. Se carga desde el botón "myfile"
def main():
# Create a Python proxy for the callback function
# process_file() is your function to process events from FileReader
file_event = create_proxy(process_file)
# Set the listener to the callback
e = document.getElementById("myfile")
e.addEventListener("change", file_event, False)
main()