Skip to article frontmatterSkip to article content

Fundamentos de Programación Científica con Python

Fundamentos de Programación Científica con Python

1. Introducción


Este cuaderno forma parte del libro interactivo Ciencia de Datos Hidrometeorológicos con Python, y está diseñado como una guía práctica para comenzar a programar con Python usando la plataforma JupyterLab. No necesitas experiencia previa en programación—solo curiosidad y ganas de experimentar.

Aprenderás los fundamentos de la programación, estructuras de datos básicas, lógica condicional, funciones y una primera introducción al uso de librerías científicas en Python.

📚 Descripción general

  • Qué es Python y por qué es tan usado en ciencia de datos

  • Los principales tipos de datos en Python

  • Operadores y estructuras básicas de control

  • Cómo escribir funciones propias

  • Una introducción práctica a las clases y objetos

  • Cómo importar librerías científicas populares

✅ Requisitos previos

Conceptos

Importancia

Notas

Introducción a Python

Útil

Información complementaria

⏱️ Tiempo estimado de aprendizaje: 30–45 minutos
✍️ Formato: interactivo, ejecuta y modifica el código a medida que avanzas

2. ¿Qué es Python?


Python es un lenguaje de programación de alto nivel, interpretado y de código abierto. Se caracteriza por su sintaxis clara, su gran comunidad y su amplia adopción en áreas como análisis de datos, inteligencia artificial, climatología y muchas más.

📌 En este libro lo usaremos como base para hacer ciencia de datos con datos hidrometeorológicos reales.

🧠 ¿Qué significa que es de “alto nivel”?

Un lenguaje de alto nivel como Python está diseñado para que las personas lo entiendan y escriban fácilmente. A diferencia de otros lenguajes como C o Fortran, con Python podemos hacer más con menos líneas de código.

# Tu primer programa en Python
print("Hola, mundo")
Hola, mundo

3. Tipos de datos en Python


🔢 Números enteros (int) y decimales (float)

Los enteros (int) representan números sin parte decimal, mientras que los decimales (float) permiten representar números reales.

# Entero
a = 10
print("a:", a, "| tipo:", type(a))
a: 10 | tipo: <class 'int'>
# Decimal
pi = 3.1416
print("pi:", pi, "| tipo:", type(pi))
pi: 3.1416 | tipo: <class 'float'>

🔤 Cadenas de texto (str)

Las cadenas (str) son secuencias de caracteres encerradas entre comillas simples o dobles. Se usan para representar palabras, frases u otros textos.

mensaje = "Hola, mundo"
nombre = 'Python'

print(mensaje)
print("Nombre:", nombre)
print("Tipo:", type(nombre))
Hola, mundo
Nombre: Python
Tipo: <class 'str'>

🔘 Booleanos (bool)

Los booleanos son valores lógicos que solo pueden ser True (verdadero) o False (falso). Se utilizan para hacer comparaciones y estructuras de control.

es_mayor = 5 > 3
es_igual = (10 == 20)

print("5 > 3:", es_mayor)
print("10 == 20:", es_igual)
print("Tipo de es_mayor:", type(es_mayor))
5 > 3: True
10 == 20: False
Tipo de es_mayor: <class 'bool'>

📦 Listas (list)

Las listas son colecciones ordenadas y modificables. Se definen con corchetes y pueden contener distintos tipos de datos.

mi_lista = [1, "texto", 3.14, True]

print("Lista:", mi_lista)
print("Primer elemento:", mi_lista[0])
print("Tipo:", type(mi_lista))

# Modificar un valor
mi_lista[1] = "nuevo texto"
print("Lista modificada:", mi_lista)
Lista: [1, 'texto', 3.14, True]
Primer elemento: 1
Tipo: <class 'list'>
Lista modificada: [1, 'nuevo texto', 3.14, True]

🗂️ Diccionarios (dict)

Un diccionario es una colección no ordenada de pares clave: valor. Se define con llaves {} y permite acceder a cada valor por su clave.

info_persona = {
    "nombre": "Alfonso",
    "edad": 35,
    "ciudad": "Bogotá"
}

print("Nombre:", info_persona["nombre"])
print("Edad:", info_persona["edad"])
print("Diccionario completo:", info_persona)
print("Tipo:", type(info_persona))

# Agregar una nueva clave
info_persona["profesion"] = "Científico de datos"
print("Actualizado:", info_persona)
Nombre: Alfonso
Edad: 35
Diccionario completo: {'nombre': 'Alfonso', 'edad': 35, 'ciudad': 'Bogotá'}
Tipo: <class 'dict'>
Actualizado: {'nombre': 'Alfonso', 'edad': 35, 'ciudad': 'Bogotá', 'profesion': 'Científico de datos'}

🧱 Tuplas (tuple)

Las tuplas son similares a las listas, pero no se pueden modificar. Se definen con paréntesis () y son útiles para almacenar datos fijos.

coordenadas = (4.61, -74.07)

print("Tupla:", coordenadas)
print("Latitud:", coordenadas[0])
print("Longitud:", coordenadas[1])
print("Tipo:", type(coordenadas))

# Intentar modificar una tupla (esto generará un error)
try:
    coordenadas[0] = 0
except TypeError as e:
    print("Error:", e)
Tupla: (4.61, -74.07)
Latitud: 4.61
Longitud: -74.07
Tipo: <class 'tuple'>
Error: 'tuple' object does not support item assignment

🔘 Conjuntos (set)

Los conjuntos son colecciones no ordenadas que no permiten elementos duplicados. Se definen con set() o llaves {}.

valores = [1, 2, 2, 3, 4, 4, 5]
conjunto = set(valores)

print("Original:", valores)
print("Set sin duplicados:", conjunto)
print("Tipo:", type(conjunto))

# Agregar un nuevo elemento
conjunto.add(6)
print("Actualizado:", conjunto)
Original: [1, 2, 2, 3, 4, 4, 5]
Set sin duplicados: {1, 2, 3, 4, 5}
Tipo: <class 'set'>
Actualizado: {1, 2, 3, 4, 5, 6}

✏️ Práctica: Crea una lista con los nombres de tres ciudades colombianas y muestra la segunda ciudad usando indexación (mi_lista[1]).

4. ➕ Operadores básicos


Los operadores nos permiten realizar cálculos y comparaciones con datos. Python proporciona operadores aritméticos para matemáticas, operadores de comparación para evaluar condiciones, y más.

Operadores aritméticos

Python permite usar operadores matemáticos básicos:

# Operadores aritméticos básicos
print("Suma: 1 + 2 =", 1 + 2)
print("Resta: 5 - 3 =", 5 - 3)
print("Multiplicación: 4 * 3 =", 4 * 3)
print("División: 10 / 2 =", 10 / 2)
print("División entera: 10 // 3 =", 10 // 3)
print("Potenciación: 2 ** 4 =", 2 ** 4)
print("Módulo (resto): 10 % 3 =", 10 % 3)
Suma: 1 + 2 = 3
Resta: 5 - 3 = 2
Multiplicación: 4 * 3 = 12
División: 10 / 2 = 5.0
División entera: 10 // 3 = 3
Potenciación: 2 ** 4 = 16
Módulo (resto): 10 % 3 = 1

5. 🔀 Estructuras de control


Ahora que conoces los operadores, aprendamos cómo tomar decisiones y repetir acciones en nuestro código. Las estructuras de control permiten que los programas sean dinámicos y respondan a diferentes condiciones.

🤔 Condicionales if, elif, else

Las estructuras condicionales permiten ejecutar bloques de código solo si se cumple una condición.

x = 10

if x > 0:
    print("x es positivo")
elif x == 0:
    print("x es cero")
else:
    print("x es negativo")
x es positivo

También podemos usarlas para comparar tipos o valores:

valor = True

if type(valor) == str:
    print("Es una cadena de texto")
elif type(valor) == int:
    print("Es un número entero")
elif type(valor) == float:
    print("Es un número decimal")
elif type(valor) == bool:
    print("Es un valor booleano")
Es un valor booleano

🔁 Bucle while

El bucle while repite un bloque de código mientras se cumpla una condición.

contador = 0

while contador < 3:
    print("Contador:", contador)
    contador += 1
Contador: 0
Contador: 1
Contador: 2

🔁 Bucle for

El bucle for se usa para recorrer elementos de una secuencia (como una lista o rango).

for i in range(5):
    print("Valor de i:", i)
Valor de i: 0
Valor de i: 1
Valor de i: 2
Valor de i: 3
Valor de i: 4

También se puede usar con listas directamente:

nombres = ["Alfonso", "Nicole", "Max"]

for nombre in nombres:
    print("Hola,", nombre)
Hola, Alfonso
Hola, Nicole
Hola, Max

✏️ Desafío: Escribe un bucle for que imprima los números del 1 al 10, pero solo los números pares. Pista: usa el operador módulo % para verificar si un número es par.

6. Funciones en Python


Las funciones son bloques de código reutilizables que se definen una vez y se pueden ejecutar múltiples veces. Son ideales para automatizar tareas repetitivas y organizar mejor tu código.

🔧 ¿Qué es una función?

Una función se define usando la palabra clave def, seguida del nombre de la función, paréntesis con los argumentos, y dos puntos :. El cuerpo de la función va indentado.

# Esta función imprime un saludo
def saludar():
    print("Hola, te damos la bienvenida al curso")

# Llamamos la función
saludar()
Hola, te damos la bienvenida al curso

🧪 Funciones con argumentos

Puedes definir funciones que acepten uno o más parámetros para hacerlas más flexibles.

def saludar_persona(nombre):
    print(f"Hola, {nombre}!")

saludar_persona("Alfonso")
saludar_persona("Nicole")
Hola, Alfonso!
Hola, Nicole!

➕ Funciones con múltiples argumentos

Las funciones pueden aceptar varios argumentos, por ejemplo, para realizar operaciones matemáticas:

def sumar(a, b):
    resultado = a + b
    print("Resultado:", resultado)

sumar(3, 5)
sumar(10, -2)
Resultado: 8
Resultado: 8

🔁 Funciones que devuelven resultados (return)

Usamos return cuando queremos que la función nos entregue un valor para usarlo más adelante.

def area_triangulo(base, altura):
    return (base * altura) / 2
area = area_triangulo(3, 5)
print("Área del triángulo:", area)
Área del triángulo: 7.5

✏️ Ejercicio: Crea una función llamada celsius_a_fahrenheit(celsius) que convierta temperaturas de Celsius a Fahrenheit. Fórmula: F = C × 9/5 + 32. Prueba tu función con 25°C.

7. Clases y objetos en Python


En Python, una clase es como un molde o plantilla para crear objetos. Cada objeto puede tener sus propios atributos (datos) y métodos (funciones asociadas).

Este enfoque se conoce como Programación Orientada a Objetos (POO) y es muy útil para organizar código complejo en estructuras lógicas.

🧱 ¿Qué es una clase?

Vamos a crear una clase llamada Figura que describe un objeto geométrico.

class Figura:
    def __init__(self, nombre, lados, color):
        self.nombre = nombre
        self.lados = lados
        self.color = color

🧪 Crear una clase y usar objetos

Ahora instanciamos un objeto de tipo Figura:

Si queremos representar un cuadrado podemos definirlo de la siguiente manera:

cuadrado = Figura(nombre="Cuadrado", lados=4, color="Rojo")

print("Nombre:", cuadrado.nombre)
print("Lados:", cuadrado.lados)
print("Color:", cuadrado.color)
Nombre:
 Cuadrado
Lados: 4
Color: Rojo

Cada objeto tiene su propio conjunto de atributos.

🛠️ Métodos dentro de una clase

También podemos definir funciones dentro de una clase que realicen acciones con los datos del objeto. A esto se les llama métodos.

class Figura:
    def __init__(self, nombre, lados, color):
        self.nombre = nombre
        self.lados = lados
        self.color = color

    def describir(self):
        print(f"{self.nombre} tiene {self.lados} lados y es de color {self.color}")

Usamos el método:

triangulo = Figura("Triángulo", 3, "Azul")
triangulo.describir()
Triángulo tiene 3 lados y es de color Azul

Esto imprimirá una descripción usando los datos del objeto.

8. Importar librerías en Python


Una librería (o módulo) es una colección de funciones y clases ya escritas que puedes reutilizar en tu código. Usarlas ahorra tiempo y permite hacer cosas complejas fácilmente.

Por ejemplo, existen librerías para matemáticas (numpy), el manejo de datos (pandas), procesamiento de datos climáticos (xarray), visualización (matplotlib), y muchas más.

📦 ¿Cómo se importa una librería?

Usamos la palabra clave import para traer una librería a nuestro entorno de trabajo.

Ahora podemos usar cualquier función dentro de numpy, como:

import numpy as np
import pandas as pd
import xarray as xr
numeros = np.array([1, 2, 3])
print(numeros)
[1 2 3]

🧩 Usar alias con as

Como algunas librerías tienen nombres largos, se suele usar un alias con la palabra clave as:

Esto nos permite escribir:

a = np.array([1, 2, 3])
print(a * 10)
[10 20 30]

🧪 Librerías comunes en ciencia de datos

A continuación, presentamos algunas de las librerías más utilizadas en análisis científico y de datos climáticos:

  • numpy → Permite realizar cálculos numéricos y operaciones con arrays de manera eficiente.

  • pandas → Ofrece estructuras de datos tipo tabla (DataFrames) ideales para manipular datos tabulados.

  • xarray → Diseñada para trabajar con datos multidimensionales, como series de tiempo o datos climáticos en grillas.

Estas librerías están optimizadas para el trabajo científico y forman la base de muchas herramientas modernas para la ciencia abierta y la climatología computacional.

import numpy as np
import pandas as pd
import xarray as xr

# Crear un array con numpy
arr = np.arange(5)
print("Array con numpy:", arr)

# Crear una tabla (DataFrame) con pandas
df = pd.DataFrame({
    "nombre": ["Ana", "Luis", "Camila"],
    "edad": [23, 34, 29]
})
print("\nTabla con pandas:")
print(df)

# Crear un dataset con xarray
ds = xr.Dataset({
    "temperatura": (("x",), [15.1, 17.3, 16.8])
})
print("\nDataset con xarray:")
print(ds)
Array con numpy: [0 1 2 3 4]

Tabla con pandas:
   nombre  edad
0     Ana    23
1    Luis    34
2  Camila    29

Dataset con xarray:
<xarray.Dataset> Size: 24B
Dimensions:      (x: 3)
Dimensions without coordinates: x
Data variables:
    temperatura  (x) float64 24B 15.1 17.3 16.8

✅ Conclusiones finales

En este capítulo aprendiste los fundamentos esenciales de la programación científica con Python:

  • Los principales tipos de datos (enteros, flotantes, texto, listas, diccionarios, etc.)

  • Cómo utilizar estructuras de control como condicionales y bucles

  • Cómo crear y reutilizar funciones y clases

  • Cómo importar y utilizar librerías externas en tus notebooks

Estas herramientas forman la base para trabajar con datos reales, desarrollar scripts reproducibles y automatizar análisis en ciencia de datos.

🎓 Programar es una habilidad que se fortalece con la práctica. No te preocupes por memorizar todo ahora, ¡vuelve a este capítulo cuando lo necesites!


👉 ¿Qué sigue?

En el próximo cuadernillo exploraremos en mayor profundidad tres de las librerías más utilizadas en ciencia climática:

  • numpy para trabajar con arreglos y álgebra lineal

  • pandas para manipular datos tabulares

  • xarray para manejar datos multidimensionales como los de satélites, modelos climáticos y observaciones atmosféricas

Prepárate para trabajar con datos reales y aprender nuevas herramientas prácticas. ¡Nos vemos allá! 🌎📊

Fuentes y referencias

References
  1. Rose, B., Kent, J., Tyle, K., Clyne, Banihirwe, A., Camron, D., Ford, R., Morley, J., Grover, M., Eroglu, O., Paul, K., May, R., Lkailynncar, Irving, D., Uieda, L., Ojaybee, Blain, P., & Moon, Z. (2023). ProjectPythia/pythia-foundations: v2023.05.01. Zenodo. 10.5281/ZENODO.7884572