5.2 Optica – Rayo reflejado en plano inclinado con Python

Propagación multitrayecto o multicamino en plano inclinado

Referencia: Sears-Zemansky Cap33.2 Vol2 Ed.12 p1123, Optica – Rayo reflejado en plano horizontal

El plano de reflexión puede estar inclinado respecto al eje de las x. Para el caso dado, se puede considerar igualar las pendientes del rayo incidente y reflejado referenciadas con la pendiente del plano inclinado.

rayo reflejado en plano inclinado

la pendiente del plano inclinado se obtiene como:

m_s = \frac{\Delta suelo } {\Delta x_{intervalo}} = \frac{s_b-s_a}{x_b-x_a}

Respecto al plano, los ángulos de rayo incidente y reflejado son iguales por lo que secorrige con la pendiente del plano. Las pendientes del rayo izquierdo y rayo derecho con la influencia de la pendiente del suelo se igualan:

-(m_z-m_s) = m_r-m_s -m_z = m_r - 2 m_s

Para obtener sc como un punto en el plano, requiere función de suelo(x) evaluada en sc , para usar todo en función de xc :

m_s = \frac{\Delta s}{\Delta x} = \frac{s_b-s_a}{x_b-x_a} s(x) = m_s x_a +b_s b_s = s_a-m_s x_a s_c = s(c) = m_s x_c +b_s

Lo anterior permite actualizar el planteamiento de la pendientes, y despejar el valor de la incógnita xc

-m_z = m_r - 2 m_s - \frac{s_c-y_a}{x_c-x_a} = \frac{y_b-s_c}{x_b-x_c}-2m_s - \frac{s_c-y_a}{x_c-x_a} = \frac{y_b-s_c-2m_s(x_b-x_c)}{x_b-x_c}

primero se busca agrupar sc

-(x_b-x_c)(s_c-y_a) = (x_c-x_a)(y_b-s_c-2m_s(x_b-x_c))
-s_c(x_b-x_c)+y_a(x_b-x_c) = y_b(x_c-x_a)-s_c(x_c-x_a)-2m_s(x_b-x_c)(x_c-x_a)
-s_c(x_b-x_c) + s_c(x_c-x_a) = -y_a(x_b-x_c) + y_b(x_c-x_a) - 2m_s(x_b-x_c)(x_c-x_a)
s_c(-x_b+x_c+x_c-x_a) = -x_b y_a+x_c y_a + y_b x_c - x_a y_b -2m_s(x_b(x_c-x_a)-x_c(x_c-x_a))

sutituyendo sc con la expresión del plano con pendiente evaluada en el punto xc , lo que se expresa como:

(m_s x_c +b_s)(2 x_c-(x_a+x_b)) = x_c (y_a + y_b)-(x_a y_b -x_b y_a)-2m_s(x_b x_c- x_a x_b - x_c^2 + x_a x_c))

teniendo ahora como objetivo encontrar una expresión para xc

m_s x_c (2 x_c-(x_a+x_b))+b_s(2 x_c-(x_a+x_b)) = x_c (y_a + y_b)-(x_a y_b +x_b y_a)-2m_s(- x_c^2 + x_c(x_b + x_a) - x_a x_b)
2m_s x_c^2 - m_s x_c(x_a+x_b)+2 b_s x_c-b_s(x_a+x_b) = x_c (y_a + y_b)-(x_a y_b +x_b y_a)+ 2m_s x_c^2 - 2m_s x_c (x_b + x_a) + 2m_s x_a x_b
x_c(- m_s (x_a+x_b)+2 b_s)-b_s(x_a+x_b) = x_c (y_a + y_b- 2m_s (x_b + x_a))-(x_a y_b +x_b y_a) + 2m_s x_a x_b
x_c(- m_s (x_a+x_b)+2 b_s) -x_c (y_a + y_b- 2m_s (x_b + x_a)) = b_s(x_a+x_b) -(x_a y_b +x_b y_a) + 2m_s x_a x_b
x_c(2 b_s - (y_a + y_b) - m_s (x_a+x_b) + 2m_s (x_b + x_a)) = b_s(x_a+x_b) -(x_a y_b +x_b y_a) + 2m_s x_a x_b
x_c(2 b_s - (y_a + y_b) + m_s(x_a+x_b) = b_s(x_a+x_b) -(x_a y_b +x_b y_a) + 2m_s x_a x_b
x_c(2 b_s - (y_a + y_b) + m_s (x_a+x_b)) = b_s(x_a+x_b) -(x_a y_b +x_b y_a) + 2m_s x_a x_b
x_c = \frac{b_s(x_a+x_b) -(x_a y_b +x_b y_a) + 2m_s x_a x_b}{2 b_s - (y_a + y_b) + m_s (x_a+x_b)}

Con el valor de xc se pudede obtener la altura del punto sc. a partir de la ecuación que describe el plano s(x).

Algoritmo en Python

A partir del algoritmo del rayo reflejado en plano horizontal , se añaden las instrucciones para calcular ms, bs, xc, sc.

obteniendo ahora el resultado:

punto reflejado: [ 7.666666666666665 , 1.3333333333333335 ]

con la gráfica

rayo reflejado en plano inclinado grafica

Instrucciones en Python

# rayo incidente y reflejado
# en plano inclinado
# blog.espol.edu.ec/ccpg1001
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
# posición de antenas
xa = 1  # Izquierda
ya = 4
xb = 11 # Derecha
yb = 2

# plano el suelo
sa = 2
sb = 1

# muestras en grafica
muestras = 21

# PROCEDIMIENTO
# pendiente de suelo
ms = (sb-sa)/(xb-xa)
bs = sa-ms*xa
# punto de reflejo
numerador   = bs*(xa+xb)-(xa*yb+xb*ya)+2*ms*xa*xb
denominador = 2*bs-(ya+yb)+ms*(xa+xb)
xc = numerador/denominador

sc = ms*xc+bs

# SALIDA
print('punto reflejado: [',xc,',',sc,']')

# GRAFICA
#puntos en el plano
plt.scatter([xa,xc,xb],[ya,sc,yb])
plt.scatter([xc],[sc],label='punto reflejo')
# lineas de rayos
plt.plot([xa,xc],[ya,sc],label='incidende')
plt.plot([xc,xb],[sc,yb],label='reflejado')
plt.plot([xa,xb],[sa,sb],label='suelo')

# etiquetas anotadas
plt.annotate(' reflejo',[xc,sc])

# etiquetas
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('reflexión de rayos en plano inclinado')
plt.grid()

plt.show()

Tarea: Consiere que el suelo está compuesto de al menos dos segmentos con inclinaciones diferentes. Podría darse mas de una reflexión al punto de recepción o ninguna

Una aplicación relacionada de análisis multitrayecto en Girni: Coordenadas – Rayo reflejado en perfil por tramos

5.1 Optica – Rayo reflejado en plano horizontal con Python

Referencia: Sears-Zemansky Cap33.2 Vol2 Ed.12 p1123

El modelo de luz basado en rayos permite describir la propagación por: reflexión y refracción.

Un rayo de onda luminosa que incide en una material liso que separa dos materiales transparentes (como el aire y el vidrio o el agua y el vidrio), el rayo es reflejado parcialmente y también refractado parcialmente hacia el segundo material.

Los rayos incidente, reflejado y refractado en una interfaz lisa entre dos materiales ópticos forman ángulos θarb respecto a la normal (perpendicular) a la superficie en el punto de incidencia se ilustra en la figura. Si la superficie es rugosa, tanto la luz transmitida como la reflejada se dispersan en varias direcciones y no hay un ángulo único de transmisión o reflexión.

La reflexión con un ángulo definido desde una superficie muy lisa se llama reflexión especular ( latin de “espejo”). La reflexión dispersa a partir de una superficie áspera se llama reflexión difusa.

Propagación multitrayecto o multicamino en plano horizontal

Referencia: Propagación multicamino

En telecomunicaciones, la propagación de ondas de radio presentan un comportamiento semejante al de la luz para reflexión conocido como propagación multicamino o multitrayecto.

El fenómeno se da cuando las señales de radio llegan a la antena receptora por dos o más caminos y en diferentes tiempos.

La propagación mutitrayecto puede causar problemas en la recepción de la señal, debido a la interacción entre las señales recibidas. A fines prácticos, la señal obtenida en recepción difiere de la original y causa efectos que se han de compensar.

Ejercicio con gráfica

Realizar la gráfica de los rayos incidente, reflejado y directo entre el transmisor y receptor con antenas a diferentes alturas, semejante a la gráfica anterior.

Desarrollo

Si los ángulos incidente y reflejado son iguales, la pendiente rayo incidente debe ser igual en magnitud a la pendiente del rayo reflejado. Las pendientes tienen signo opuesto, el rayo izquierdo tiene pendiente negativa.

- \frac{\Delta y_{izquierda}} {\Delta x_{izquierda}} = \frac{\Delta y_{derecha}}{\Delta x_{derecha}} - \frac{s_c-y_a}{x_c-x_a} = \frac{y_b-s_c}{x_b-x_c}

Por facilidad de la ecuación, se supondrá que el suelo es paralelo al eje x, a una altura sc del eje de referencia.

Se debe obtener el valor de xc  de la ecuación anterior, que realizando un poco de trabajo se obtiene que:

- (x_b-x_c)(s_c-y_a) = (x_c-x_a)(y_b-s_c) - x_b(s_c-y_a) + x_c (s_c-y_a) = x_c (y_b-s_c)-x_a (y_b-s_c) x_c (s_c-y_a) - x_c (y_b-s_c)= -x_a (y_b-s_c) + x_b(s_c-y_a) x_c (2s_c-y_a-y_b)= -x_a (y_b-s_c) + x_b(s_c-y_a) x_c = \frac{x_b(s_c-y_a)-x_a(y_b-s_c)}{2s_c-y_a-y_b}

Obtenido el punto xc  y dado que el plano es horizontal, la altura  sc  es constante.

Con el algoritmo se puede obtener el punto de reflexión para varias alturas de antena y varias alturas del plano.

resultado con datos muestra:

punto reflejado: [ 8.5 , 1 ]

Instrucciones en Python

# rayo incidente y reflejado
# blog.espol.edu.ec/ccpg1001
import numpy as np
import matplotlib.pyplot as plt

# INGRESO
# posición de antenas
xa = 1  # Izquierda
ya = 4
xb = 11 # Derecha
yb = 2

# plano el suelo
sc = 1  # altura

# muestras en grafica
muestras = 21

# PROCEDIMIENTO
numerador   = xb*(sc-ya)-xa*(yb-sc)
denominador = 2*sc-ya-yb
xc = numerador/denominador

# SALIDA
print('punto reflejado: [',xc,',',sc,']')

# GRAFICA
#puntos en el plano
plt.scatter([xa,xc,xb],[ya,sc,yb])
plt.scatter([xc],[sc],label='punto reflejo')
# lineas de rayos
plt.plot([xa,xc],[ya,sc],label='incidende')
plt.plot([xc,xb],[sc,yb],label='reflejado')
plt.plot([xa,xb],[sc,sc],label='suelo')

# etiquetas anotadas
plt.annotate(' reflejo',[xc,sc])

# etiquetas
plt.legend()
plt.xlabel('x')
plt.ylabel('y')
plt.title('reflexión de rayos en plano')
plt.grid()

plt.show()

Tarea:

a) Añadir la trayectoria directa del rayo entre el transmisor y receptor

b) Considerar que el plano puede estar inclinado respecto al eje de las x,por lo que para igualar las pendientes del rayo incidente y reflejado se referencian con la pendiente del plano.

m_s = \frac{\Delta suelo } {\Delta x_{intervalo}} = \frac{s_b-s_a}{x_b-x_a} -(m_z-m_s) = m_r-m_s -m_z = m_r - 2 m_s

Unidades

Unidades acorde al programa de estudio del curso, usando principalmente Python. El enfoque es práctico usando ejercicios de evaluaciones anteriores.

8.5 Archivos.wav de audio con Python – Abrir, extraer una porción

Los conceptos de arreglos como vectores y matrices son suficientes para manejar archivos.wav. con la librería Scipy-Python.

1. Leer o Abrir archivo.wav de audio

Para procesar un archivo de audio en formato .wav, la instrucción waves.read(archivo) usa el archivo con ‘nombre.wav’ y obtiene dos variables que representan:
muestreo: frecuencia de muestreo del sonido en PCM y
sonido: que es un arreglo con las muestras del sonido.

El archivo de audio debe encontrarse en el mismo directorio que el archivo.py de instrucciones, por ejemplo, dado el archivo ‘Alarm01.wav’ , se puede procesar con las instrucciones mostradas:

Alarm01.wav

# Abrir un archivo de audio .wav
import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as waves

# INGRESO 
archivo = 'Alarm01.wav'
muestreo, sonido = waves.read(archivo)

con lo que se obtiene:

>>> muestreo
22050
>>> sonido
array([[0, 0],
       [0, 0],
       [0, 0],
       ..., 
       [0, 0],
       [0, 0],
       [0, 0]], dtype=int16)
>>> np.shape(sonido)
(122868, 2)

En el ejemplo, la frecuencia de muestreo es de 22050 Hz. El sonido es estéreo al tener dos columnas que corresponden a los canales izquierdo y derecho.
Para usar un solo canal, se copian los datos a un nuevo arreglo. Para separar el canal izquierdo por ejemplo, se usan las instrucciones:

>>> izquierdo=sonido[:,0].copy()
>>> izquierdo
array([0, 0, 0, ..., 0, 0, 0], dtype=int16

Con lo que se tienen los datos listos para ser procesados.

1.1 Otro ejemplo de archivo.wav de audio

Con los datos se pueden graficar las ondas de sonido como la mostrada en la imagen.

muestra_Invernal01.wav

El formato .wav es el más simple de manejar pues contiene directamente los datos de las muestras de sonido similar a la mostrada en la figura.

El primer parámetro a obtener es la frecuencia de muestreo en Hz, o cuántas muestras por segundo se realizan, y luego los datos del sonido.

# Abrir un archivo de audio .wav
import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as waves

# INGRESO 
# archivo = input('archivo de sonido:' )
archivo = 'muestra_Invernal01.wav'
muestreo, sonido = waves.read(archivo)

# PROCEDIMIENTO
tamano=np.shape(sonido)
canales=len(tamano)
tipo = 'estéreo'
if (canales<2):
    tipo = 'monofónico'
duracion = len(sonido) /muestreo

# SALIDA
print('muestreo (Hz) : ',muestreo)
print('canales: ' + str(canales) + ' tipo ' + tipo )
print('duración (s): ',duracion)
print('tamaño de matriz: ', tamano)
print(sonido)
plt.plot(sonido)
plt.show()

Con lo que obtiene la gráfica mostrada al inicio y los siguientes resultados:

muestreo (Hz) :  44100
canales: 2 tipo estéreo
duración (s):  15.0
tamaño de matriz:  (661500, 2)
[[-4355 -4561]
 [-4353 -4572]
 [-4347 -4578]
 ..., 
 [  120  1008]
 [  124   993]
 [  100   935]]

Referencias:
https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.io.wavfile.read.html

1.2 Librerías para tratamiento de audio

la librería de funciones scipy (scientific python), dispone de funciones para el tratamiento de señales, estadísticas, audio, entre otras.

El orden de las instrucciones es el que aparece en los post del blog.

instrucciones
import scipy.io.wavfile as waves librerias de audio en formato wav para lectura y escritura de archivos.
muestreo, sonido = waves.read(archivo) lectura de datos de un archivo de audio en formato wav. Se obtiene la frecuencia de muestreo y los datos en sonido
import scipy.integrate as integrate importar metodos de integración de scipy
integrate.simps(valrores, ejex) integral de muestras de señal usando el método de Simpson.
. .
. .

2. Extraer una Porción del audio y guardar archivo.wav

Para extraer una porción de un archivo de audio se requiere: abrir el archivo, seleccionar la porción de interés y guardar el resultado un archivo de salida.

archivo origen: muestra_Invernal01.wav

archivo resultado: muestra_Invernal02.wav

La porción puede ser indicada en unidades de tiempo que luego deben ser convertidas a índices de muestras para extraer la porción requerida.

El procesamiento del archivo simplificado en Python es:

# Extrae porción de un archivo de audio .wav
import numpy as np
import matplotlib.pyplot as plt
import scipy.io.wavfile as waves

# INGRESO 
# archivo = input('archivo de sonido:' )
archivo = 'muestra_Invernal01.wav'
archivosalida = 'muestra_Invernal02.wav'
# tiempo en segundos
desde = 7.5
hasta = 10.2

muestreo, sonido = waves.read(archivo)

# PROCEDIMIENTO
# indices de muestras
idesde = int(desde*muestreo)
ihasta = int(hasta*muestreo)
porcion = sonido[idesde:ihasta,:]
duracion = len(porcion)/muestreo

# SALIDA
waves.write(archivosalida, muestreo, porcion)
print('archivo creado: ', archivosalida)

2.1 Guardar un archivo de audio .wav

Luego de procesar los datos de audio, y guardar el resultado en un archivo con ‘nombre.wav’ se usa la instruccion waves.write() de la libreria scipy, que requiere:
archivo: el nombre del archivo resultante, con extension.wav
fsonido: la frecuencia de muestreo del sonido (entero)
sonido: el arreglo de la señal de audio como entero de 16 bits (dtype=’int16′).

Recuerde haber realizado el llamado a las librerias numpy y scipy que se presentan como referencia en el script.

# PROCEDIMIENTO
# Arreglos para datos con k muestras
sonidofinal = np.zeros(k, dtype='int16')

# SALIDA
archivo = 'audiofinal.wav'
waves.write(archivo, int(fsonido),sonidofinal)

El archivo de audio resultante se escucharà usando un programa como «windows media player»

Notas:
Se puede añadir al nombre la ruta de ubicación del archivo en el disco duro. Ejemplo para windows: ‘C:\Users\mis documentos\archivo.wav

3. Gráfica de un canal de audio

Para mostrar en un gráfico un canal de audio se usa la libreria matplotlib. Para muestra, usando los datos del ejemplo anterior:

izquierdo = sonido[:,0].copy()

# SALIDA grafica
plt.plot(izquierdo)
plt.show()

con lo que se obtiene la siguiente gráfica:

Con lo que se puede revisar la forma de la señal de audio

Ejercicio

Si el archivo de origen es estéreo, extraer un solo canal y convertirlo a monofónico.


El manejo de archivo de audio en formato wav permite analizar varios conceptos como , en los cursos de Señales y Sistemas y Procesos estocásticos:

Modulación Delta Sigma

Señales de energía y potencia

Señales Analógicas y Digitales

Correlación(señal01,señal02)

Morse – Generador de Tonos


Referencia: https://docs.scipy.org/doc/scipy-0.19.1/reference/generated/scipy.io.wavfile.write.html

8.4 Archivos.json con Pandas-Python

Algunas estructuras de datos que se encuentran en formato tipo «diccionario» se pueden guardar y leer usando librerias Pandas.

Para el ejemplo se usa el diccionario:

tabla = {'Maria': {'primera': 55,
                   'segunda': 70,
                   'tercera': 0,
                   'final': '62,5'},
         'Pedro': {'primera': 30,
                   'segunda': 60,
                   'tercera': 70,
                   'final': '65'},
         'Juan': {'primera': 80,
                  'segunda': 65,
                  'tercera': 65,
                  'final': '72,5'}
         }

Para almacenar estos datos se realiza la conversión del diccionario a DataFrame con el objetivo de usar la instrucción de Pandas para guardar archivos.json.

tabla.to_json(unarchivo)

Instrucciones en Python

import pandas as pd

# INGRESO
#archivos de salida T: Transpuesta
unarchivo  = 'ejemplonotas01.json'
unarchivoT = 'ejemplonotasT01.json'

# datos como diccionario de datos
tabla = {'Maria': {'primera': 55,
                   'segunda': 70,
                   'tercera': 0,
                   'final': '62,5'},
         'Pedro': {'primera': 30,
                   'segunda': 60,
                   'tercera': 70,
                   'final': '65'},
         'Juan': {'primera': 80,
                  'segunda': 65,
                  'tercera': 65,
                  'final': '72,5'}
         }

# PROCEDIMIENTO
# conversión a DataFrame de pandas
tabla = pd.DataFrame(tabla)
tablaT = tabla.transpose()

# SALIDA
print(tabla)
print('transponer: ')
print(tablaT)

# almacena en archivo.json
tabla.to_json(unarchivo)
tablaT.to_json(unarchivoT)

los archivos resultantes son:

ejemplonotas01.json

ejemplonotasT01.json

Referencia:
https://pandas.pydata.org/docs/reference/api/pandas.io.json.read_json.html

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_json.html

 

8.3.1 Archivos.csv con Python – Ejercicio con gráfica de temperatura y Humedad

De una estación meteorológica se obtiene un archivo.csv con los datos de los sensores disponibles durante una semana.

2021_10_EstMeteorologica.csv

1. Lectura de archivo.csv y gráfica de datos


a. Realice la lectura de los datos desde el archivo.csv en una tabla de Pandas, muestre los nombres de las columnas

b. Añada una columna de fecha-hora con tipo de dato datetime unificando las columnas «Date» y «Time»

c. Realice la gráfica de los datos obtenidos para la variable temperatura «TEMP» vs «fecha«.

Referencia: Basic Time Series Plotting. Unidata. https://unidata.github.io/python-training/workshop/Time_Series/basic-time-series-plotting/

1.1 Solución propuesta

literal a

Para leer el archivo.csv con pandas y realizar la gráfica se usarán las librerias «pandas» y «matplotlib». La lectura del archivo usa los parámetros de separador de datos ';' y separador decimal ','. El nombre del archivo es parte del bloque de ingreso.

tabla = pd.read_csv(narchivo, sep=';',decimal=',')

literal b

Para manejar las fechas, se concatenan los valores de las columnas 'Date' y 'Time' conformando una cadena de caracteres en cada casilla de la columna 'fecha'.
Para manejar los datos y operaciones con fechas se usan el tipo de datos datetime. El formato de lectura se indica como"%d/%m/%Y %H:%M:%S" dado por una cadena de caracteres

fechaformato = "%d/%m/%Y %H:%M:%S"
tabla['fecha'] = pd.to_datetime(tabla['fecha'],
                                format=fechaformato)

literal c

La gráfica se realiza usando los datos de las columnas de fecha y temperatura.

Instrucciones Python

# lecturas archivo.csv de estación meteorológica
import pandas as pd
import matplotlib.pyplot as plt

# INGRESO
narchivo = "2021_10_EstMeteorologica.csv"

# PROCEDIMIENTO
tabla = pd.read_csv(narchivo, sep=';',decimal=',')
n = len(tabla)

# fechas concatenando columnas de texto
tabla['fecha'] = tabla['Date']+' '+tabla['Time']

# convierte a datetime
fechaformato = "%d/%m/%Y %H:%M:%S"
tabla['fecha'] = pd.to_datetime(tabla['fecha'],
                                format=fechaformato)
# SALIDA
print('columnas: ', list(tabla.keys()))

# grafica
x_horas = tabla['fecha']
y_temp  = tabla['TEMP']
plt.plot(x_horas,y_temp,'*')
plt.title('Temperatura')
plt.grid()
plt.show()

2. Separar datos por días y graficar

d. Para realizar un análisis por día y comparar entre varios días, se requiere encontrar los intervalos de inicio y fin de día.

e. Realizar la gráfica comparativa de los días.

2.1 Solución propuesta

literal d

Los intervalos se pueden entregar como una lista de los índices de las filas donde cambia el día.

literal d

Para que las gráficas se superpongan en las mismas horas, sin cambiar de día, se realiza una operación de desplazamiento pd.Timedelta(days=j) a las fechas antes de hacer cada línea de gráfica.

Las etiquetas en el eje x se cambia al formato '%H:%M' mediante la libreria matplotlib.dates y la instrucción DateFormatter.

La gráfica para 7 dias se presenta muchos datos, por lo que para análisis es preferible algo más simplificado, como comparar dos dias para simplificar visualmente.

Instrucciones Python

# lecturas archivo.csv de estación meteorológica
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter, DayLocator

# INGRESO
narchivo = "2021OctubreEstMetorologica.csv"

# PROCEDIMIENTO
tabla = pd.read_csv(narchivo, sep=';',decimal=',')
n = len(tabla)

# fechas concatenando columnas de texto
tabla['fecha'] = tabla['Date']+' '+tabla['Time']

# convierte a datetime
fechaformato = "%d/%m/%Y %H:%M:%S"
tabla['fecha'] = pd.to_datetime(tabla['fecha'],
                                format=fechaformato)

# serie por días
diaIndice = [0] # indice inicial
for i in range(1,n-1,1):
    i0_fecha = tabla['fecha'][i-1]
    i1_fecha = tabla['fecha'][i]
    if i0_fecha.day != i1_fecha.day:
        diaIndice.append(i)
diaIndice.append(len(tabla)-1) # indice final
m = len(diaIndice)

# SALIDA
print('columnas: ', list(tabla.keys()))
print('SerieDia: ',diaIndice)
print('días en serie: ', len(diaIndice))

# grafica
figura, grafica = plt.subplots()
marcador = ['.','o','v','^','<','>','1']
for j in range(0,7,1):
    i0 = diaIndice[j]
    i1 = diaIndice[j+1]
    x_horas = tabla['fecha'][i0:i1]-pd.Timedelta(days=j)
    y_temp  = tabla['TEMP'][i0:i1]
    etiqueta = str(tabla['fecha'][i0].month)+'-'
    etiqueta = etiqueta + str(tabla['fecha'][i0].day)
    
    grafica.scatter(x_horas,y_temp,
                    marker = marcador[j%7],
                    label=etiqueta)
    
# formato de eje
grafica.xaxis.set_major_formatter(DateFormatter('%H:%M'))
plt.legend()
plt.title('Temperatura')
plt.grid()
plt.show()

Otros temas de desarrollo

Regresión polinomial de grado m – Ejercicio Temperatura para un día

8.3 Archivos.csv con Pandas-Python

Algunas tablas de datos se pueden recibir como archivos.csv, que son datos separados por ';' , debiendo indicar el separador de decimales ','.

Ejemplo de archivo: ejemplonotas01.csv

nombre;primera;segunda;tercera;final
Maria;55;70;0;62,5
Pedro;30;60;70;65
Juan;80;65;65;72,5

puede ser leido y procesado usando la libreria pandas

import pandas as pd

# INGRESO
# archivo de entrada
unarchivo = 'ejemplonotas01.csv'


# PROCEDIMIENTO
tabla = pd.read_csv(unarchivo,
                    sep=';',
                    na_values=',')

# SALIDA
print(tabla)

con lo que se obtiene:

  nombre  primera  segunda  tercera final
0  Maria       55       70        0  62,5
1  Pedro       30       60       70    65
2   Juan       80       65       65  72,5
>>> 

Tamaño de la tabla:

>>> tabla.shape
(3, 5)
>>> tabla.columns
Index(['nombre', 'primera', 'segunda', 'tercera', 'final'], dtype='object')
>>> tabla['nombre']
0    Maria
1    Pedro
2     Juan
Name: nombre, dtype: object

Seleccionando solo un grupo de datos:

>>> soloprimera = tabla['primera']
>>> soloprimera
0    55
1    30
2    80
Name: primera, dtype: int64

>>> media = soloprimera.mean()
>>> media
55.0

Referencia:
https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html

8.2 Gráficas de funciones matemáticas

Las gráficas básicas para funciones matemáticas, datos, en 2D y 3D usan la librería matplotlib.pyplot con el alias plt.

import matplotlib.pyplot as plt

En caso de necesitar instalar: Matplotlib – Gráficas. Instalación simple con pip

Ejemplos de gráficas en 2D

Las gráficas son un recurso muy versatil en el área de la matemática e ingeniería.

En el curso de Métodos Numéricos se presenta una introducción de gráficas en 2D y se usan y desarrollan en todas las unidades como parte del análisis de los problemas.

Gráficas 2D de línea

Graficas 3D puntos dispersos-scatter

Graficas 3D wireframe

En el curso de Señales y Sistemas, se las usa ampliamente desde la unidad 1 Señales, para mostrar los diferentes tipos y formas, y luego en el análisis de las respuestas de los sistemas ante las señales. Como tema de instroducción, revise algúnas de las definiciones básicas de señales para observar la aplicación de gráficas.

1. Señales Contínuas

2. Señales Discretas

3. Señales Analógicas y Digitales

4. Señales Periódicas y No periódicas

5. Señales de Energía y Potencia

6. Señales Pares e Impares

7. Señales μ(t) y δ(t)

8. Señales Compuestas

9. Señales Exponencial compleja

10. Señales operaciones en tiempo

También se usan para el análisis de resultados e algun experimento, como los que se pueden observar en el grupo de investigación GIRNI

Rssi vs Distancia. Linealiza POR intervalos

Se pueden usar algunos tipos de gráficas, como de línea, dispersión, flechas,  usando las coordenadas en vectores x, y

plt.plot(x,y)
plt.scatter(x,y)
plt.arrow(xinicio, yinicio, deltax,deltay)
plt.quiver(xinicio, yinicio, componentex, componentey)

Las instrucciones para las gráficas se realizan en el bloque de salida usando un solo bloque de instrucciones, para finalmente mostrar el resultado plt.show().