[ Foro de Python ]

Coeficiente de correlacion y fourier

07-Apr-2023 21:17
Invitado (Canon)
0 Respuestas

Tengo el siguiente codigo:
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import pearsonr
#Bien
def plot_data(data):
plt.plot(data)
plt.show()

def plot_wave(freq, ampl, func):
x = np.linspace(0, 1, 500)
y = ampl * func(2 * np.pi * freq * x)
plt.plot(x, y)
plt.show()
return y

def get_wave_func():
while True:
func_type = input("¿Qué tipo de onda desea crear? (seno/coseno): ")
if func_type.lower() == 'seno':
return np.sin
elif func_type.lower() == 'coseno':
return np.cos
else:
print("Por favor ingrese una opción válida.")

def main():
#bien
data = []
for i in range(5):
data.append(float(input("Ingrese el dato número {}: ".format(i+1))))
plot_data(data)

freq = float(input("Ingrese la frecuencia de la onda: "))
ampl = float(input("Ingrese la amplitud de la onda: "))
wave_func = get_wave_func()

correlation = 0
count = 0
while correlation <= 0.8:
wave = plot_wave(freq, ampl, wave_func)
corr, _ = pearsonr(data, wave)
print("El coeficiente de correlación es:", corr)
if corr <= 0.8:
count += 1
correlation = ((count-1) * correlation + corr) / count

print("La media del coeficiente de correlación es:", correlation)

if __name__ == '__main__':
main()

Basicamente lo que quiero que haga es lo siguiente:
Un proyecto en phyton que haga lo siguiente en orden:
1- Pedir al usuario 5 datos
2- Que la gráfica se muestre en pantalla
3- Generar una nueva onda, la cual tendrá forma de seno o coseno, para determinarlo, el programa le preguntará al usuario que tipo de señal desea
4- Que la gráfica de la nueva señal se muestre en pantalla, JUNTO CON LA PRIMERA
5- Esta nueva onda (la senosoidal o cosenosoidal) tendrán una frecuencia y una amplitud seleccionada por el usuario
6- Mediante coeficiente de corelacion, comparar la grafica de los 5 datos, con la generada mediante seno o coseno
7- Si se parece menos de 0.80, regresar a la pregunta de seno, coseno y amplitud y frecuencia, no salir de ese ciclo hasta que sea igual o mayor a 0.80
8- La primera señal que se pedirá será la unica que se promediará por si sola, apartir de la segunda petición, se promediarán las señales (excepto la de los 5 datos) y se promediarán con la original (la de los 5 datos).


Pero me arroja el siguiente error:
Traceback (most recent call last):
File "e:\Escritorio\BRUT\pROY.py", line 50, in <module>
main()
File "e:\Escritorio\BRUT\pROY.py", line 41, in main
corr, _ = pearsonr(data, wave)
^^^^^^^^^^^^^^^^^^^^
File "C:\Users\elpoj\AppData\Local\Programs\Python\Python311\Lib\site-packages\scipy\stats\_stats_py.py", line 4408, in pearsonr
raise ValueError('x and y must have the same length.')
ValueError: x and y must have the same length.

Soy bastante nuevo en python, por lo que no logro encontrar mi error




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)