%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
Leer los datos de superficie libre registrados en el laboratorio. Fichero 0093log2.dat
datos = pd.read_csv('0093log2.dat',
delimiter=',',
names=['t', 's1', 's2', 's3', 's4', 's5',
's6', 's7', 's8', 's9', 's10'])
datos
En este archivo, la primera columna es el tiempo en el que se toma cada dato y las siguientes contienen los datos de cada uno de los sensores empleados en el ensayo experimental.
Almacenar en una variable la primera columna para obtener el vector de tiempos.
dt = datos.loc[:,'t']
dt = datos.iloc[:, 0]
dt
Comenzaremos con el análisis de un único sensor. Para ello, se debe seleccionar la columna correspondiente al sensor deseado y almacenarla en una nueva variable.
elev = datos.loc[:, 's1']
elev
Procedemos a representar los datos de superficie libre del sensor seleccionado.
# Usando pandas
elev.plot()
# Usando matplotlib
fig = plt.figure(figsize=(10, 5))
ax = plt.axes()
ax.plot(dt, elev, 'k')
ax.set_xlabel('Time (s)', fontsize=14)
ax.set_ylabel('$\eta$ (m)', fontsize=14)
plt.title('Elevations of sensor S1', fontsize=18)
ax.grid()
plt.show()
Se deben eliminar los primeros datos correspondientes al inicio del ensayo. Para ello, seleccionaremos el tramo de datos a partir de los 20 segundos:
pos = np.where(dt >= 20)
pos
dt_crop = dt.iloc[pos[0]]
print(dt_crop)
elev_crop = elev.iloc[pos[0]]
print(elev_crop)
Representamos la serie antigua junto con la nueva recortada para verificar que lo hemos hecho bien
# Usando matplotlib
fig = plt.figure(figsize=(10, 5))
ax = plt.axes()
ax.plot(dt, elev)
ax.plot(dt_crop, elev_crop)
ax.set_xlabel('Time (s)', fontsize=14)
ax.set_ylabel('$\eta$ (m)', fontsize=14)
plt.title('Elevations of sensor S1', fontsize=18)
ax.grid()
ax.legend(['original', 'crop'],fontsize=14)
plt.show()
El método de pasos ascendentes por cero consiste en buscar las líneas en las que el valor de la superficie libre del agua pasa de negativo a positivo. Almacene en una lista las posiciones de los pasos ascendentes.
num_datos = np.size(elev_crop)
pos_p_asc = []
for i in range(0, num_datos-1):
if elev_crop.iloc[i] <= 0.0 and elev_crop.iloc[i+1] > 0.0:
pos_p_asc.append(i)
print(pos_p_asc)
Representamos las posiciones
# Usando matplotlib
fig = plt.figure(figsize=(10, 5))
ax = plt.axes()
ax.plot(dt_crop, elev_crop)
ax.plot(dt_crop.iloc[pos_p_asc], elev_crop.iloc[pos_p_asc], '.y', markersize=20)
ax.set_xlabel('Time (s)', fontsize=14)
ax.set_ylabel('$\eta$ (m)', fontsize=14)
plt.title('Elevations of sensor S1', fontsize=18)
ax.grid()
ax.legend(['elevacion', 'pasos_asc'],fontsize=14)
plt.show()
Entre cada dos pasos ascendentes por cero tenemos una ola. A continuación calcular para cada ola su altura y su periodo:
num_pasos_asc=np.size(pos_p_asc)
# Create an empty DataFrame
data_ht = pd.DataFrame(np.nan, index=range(num_pasos_asc -1), columns=range(2))
for j in range(0, num_pasos_asc - 1):
#Elevacion entre pasos ascendentes
elev_crop_p_asc = elev_crop.iloc[pos_p_asc[j]: pos_p_asc[j+1]]
# Altura de ola
alt_ola = np.max(elev_crop_p_asc)-np.min(elev_crop_p_asc)
# Periodo
periodo = dt_crop.iloc[pos_p_asc[j+1]] - dt_crop.iloc[pos_p_asc[j]]
data_ht.iloc[j, 0] = alt_ola
data_ht.iloc[j, 1] = periodo
print(data_ht)
Por último, guardar los datos de H-T a un archivo para su posterior análisis.
data_ht.to_csv('HT.dat', float_format='%g', index=False, header=['H', 'T'], sep='\t')
data_ht.iloc[:, 0].plot()
data_ht.iloc[:, 1].plot()