Manual de Python
Manual de Python
Introducción
El Manual de Python aplicado a la Geología ha sido creado con la finalidad de facilitar el aprendizaje en Python para estudiantes y
profesionales en el campo de la Geología.
Nota: Este documento es un archivo de formato .ipynb y solo puedes interactuar con este notebook siguiendo
alguna de estas opciones:
Índice
Los datos son unidades de información, recogidas a través de la observación de un objeto o proceso.
En Python, existen diferentes formas de representar datos (tanto numéricos como no numéricos).\ Por ejemplo, si queremos representar el
número de muestras analizadas en un laboratorio, usaremos un integer:
Nota: para ejecutar un bloque con código (como el que está debajo), presiona shift + Enter .
In [1]: 25
25
Out[1]:
¿Qué es un integer? \ Un integer es un objeto en Python que representa a los números enteros.
Si queremos asignar este número a una variable, usaremos un identificador llamado muestras .\ El símbolo = se usa para indicar la
acción de asignarle nombre a un objeto:
In [2]: muestras = 25
Un identificador es un nombre usado para identificar un objeto dentro de Python.\ Nota: Los identificadores deben empezar con una
letra (de la A hasta la Z) o con un guión abajo _ .
In [3]: muestras
25
Out[3]:
Ahora, ¿cómo representamos la concentración elemental de oro (Au) en una muestra?\ Para este caso, usaremos un float y lo asignaremos
a una variable llamada ley_au .\ Nota: Ten en cuenta que ley_au guarda el número mas no indica el tipo de unidad (que para este
caso, serían partes por millón o ppm).
¿Qué es un float? \ Un float es un objeto en Python que representa números con fracción decimal.
Ahora ya sabemos como crear valores numéricos dentro de Python usando integers y floats.
¿Y qué pasa si queremos guardar un dato no numérico como por ejemplo, el nombre de una roca?, ¿qué tipo de dato debemos usar?\ En
ese caso, usaremos un string y lo asignaremos a una variable llamada roca :
¿Qué es un string? \ Un string es un objeto en Python que representa todo tipo de caracteres.\ Para crear un string
debemos encasillarlo usando comillas dobles ("") o simples ('').\
In [7]: frase
¿Qué es un dato lógico? \ Es un objeto en Python usado para representar el valor de verdad en una expresión.\ Los datos
lógicos pueden ser True (verdadero) o False (falso).
In [8]: 12 > 5
True
Out[8]:
En conclusión, tenemos 4 tipos de datos fundamentales en Python: integer, float, string y lógico.
2. Matemáticas en Python
La lógica matemática es uno de los componentes principales detrás del funcionamiento de todo algoritmo.
Una mina de cobre produjo durante 4 semanas las siguientes toneladas de concentrado: 910, 825, 1070, 940.\ Calcularemos el total
producido en un mes sumando las 4 cantidades y asignándolas a la variable total :
3745
Out[9]:
También calcularemos el promedio de concentrado producido por la mina cada semana y la asignaremos a la variable llamada promedio :
936.25
Out[10]:
Ahora, calcularemos la ganancia producida por la mina teniendo en cuenta que el precio de concentrado por tonelada es de 5 dólares y el
costo de operación en ese mes fue de 10 000 dólares. Usaremos la siguiente fórmula:
In [11]: precio_concentrado = 5
costo_operacion = 10000
La ganancia será asignada a la variable ganancia y también usaremos la variable total calculada anteriormente:
8725
Out[12]:
2
∑(x−x̄)
2
s =
n−1
Donde:
s
2
: varianza\ x̄ : promedio\ x : dato\ n : número de datos
Recordemos que la producción semanal en la mina fue de 910, 825, 1070 y 940 toneladas. Por lo tanto n será igual a 4.
In [13]: n = 4
Calcularemos la diferencia entre la producción obtenida cada semana y el promedio semanal, y lo elevaremos al cuadrado:
In [15]: sumatoria = x1 + x2 + x3 + x4
10322.916666666666
Out[16]:
Podemos comparar las edades y obtener como resultado un dato de tipo lógico (True o False).\ Por ejemplo, evaluaremos si la muestra A
es más antigua que B:
False
Out[18]:
Vemos que el resultado es falso, por lo tanto, la muestra A es más reciente que B:
True
Out[19]:
También evaluaremos si la muestra B tiene una edad menor a 500 millones de años:
True
Out[20]:
False
Out[21]:
Nuevamente obtenemos un resultado falso, es decir, las muestras tienen edades diferentes:
True
Out[22]:
Por último, evaluaremos el valor de verdad de la siguiente frase: "La edad de la muestra A es mayor a 50 Ma y la edad de la muestra B
es menor a 200 Ma".\ Para eso, uniremos las comparaciones:
False
Out[23]:
In [24]: (muestra_A == 50) or (muestra_B > muestra_A) and (muestra_A + 50 > muestra_B)
False
Out[24]:
In [25]: 20 % 3
2
Out[25]:
In [26]: 12 % 2
0
Out[26]:
In [27]: abs(-7.5)
7.5
Out[27]:
Usaremos la función input para ingresar información dentro del sistema.\ Los datos ingresados usando esta función serán representados
como un string.
'andesita'
Out[30]:
Por otro lado, tenemos la función print , que nos muestra información dentro del sistema.
In [32]: print(roca)
andesita
La función print es comúnmente usada para establecer puntos de control en un algoritmo o para mostrarnos el resultado de alguna
tarea.
Por ejemplo, calcularemos el RQD de un tramo de testigo de perforación y usaremos print() para que nos muestre el valor del RQD.\ La
longitud de cada fragmento de testigo (en cm) es: 8, 12, 15, 9, 25, 19, 11, 4.
In [33]: total = 8 + 12 + 15 + 9 + 25 + 19 + 11 + 4
mayor_10 = 12 + 15 + 25 + 19 + 11
Ahora que ya tenemos calculado el RQD, lo uniremos a un string para formar una frase:
In [35]: resultado = "El RQD del tramo es de " + str(rqd) + " %"
In [36]: print(resultado)
Como podemos ver, la función print devuelve un resultado en formato de lectura.\ Sin embargo, podemos mejorar un detalle adicional:
el número de decimales en el RQD. Para esto, tenemos dos opciones:
La función round usa 2 parámetros: el valor a redondear y el número de decimales que quedarán luego del redondeo.
Redondeando el RQD:
In [38]: resultado = "El RQD del tramo es de " + str(rqd_redondeado) + " %"
print(resultado)
Opción 2: Usar un f-string (string con formato literal), que contiene espacio reemplazable por variables:
Se debe agregar una f antes de empezar a escribir el string entre comillas.\ La variable se debe agregar dentro de un espacio
separado por llaves {} .\ Editaremos el formato del valor de la variable usando dos puntos : seguido del tipo de formato
(en este caso es .1f ).
Juntando la información:
Mostramos el resultado:
In [40]: print(resultado)
4. Condicionales
Para evaluar el camino que seguirá un algoritmo, estableceremos una condición que devolverá un valor lógico (True o False).\ El algoritmo
continuará por el camino que devuelva True .\ Las palabras reservadas usadas en una condicional son:
if [condición]: \ [bloque de código] \ elif [condición]: \ [bloque de código] \ else: \ [bloque de código]
Por ejemplo, crearemos una condicional que evalúe si una roca es ígnea (y si se trata específicamente, de una andesita):
if roca == "andesita":
print("La andesita es una roca ígnea.")
El algoritmo devuelve la frase "La andesita es una roca ígnea" solo cuando la variable asignada a roca es "andesita".
Podemos agregar una opción adicional, en caso de que la roca no se trate de una andesita:
if roca == "andesita":
print("La andesita es una roca ígnea.")
else:
print("La roca no es una andesita.")
Cuando la condición establecida no se cumple, el algoritmo devuelve la frase "La roca no es una andesita".
También podemos agregar otras opciones con los nombres de otras rocas ígneas:
if roca == "andesita":
print("La andesita es una roca ígnea.")
elif roca == "basalto":
print("El basalto es una roca ígnea.")
elif roca == "granito":
print("El granito es una roca ígnea.")
else:
print("La roca no es andesita, basalto o granito.")
La roca es ígnea.
5. Listas
Las listas son colecciones de datos modificables que se caracterizan por estar encerrados entre corchetes [] .
Por ejemplo, si tenemos una colección con los siguientes minerales: pirita, cuarzo, galena y calcopirita.\ Podemos agrupar los minerales en una lista
llamada minerales :
In [46]: print(minerales)
Si en la colección también tuvieramos esfalerita, ¿cómo la agregamos dentro de la lista?\ Para eso usaremos el método .append :
In [47]: [Link]("esfalerita")
print(minerales)
¿Cómo agregaríamos los siguientes minerales en la lista: acantita y molibdenita?\ Para eso usaremos el método .extend :
print(minerales)
¿Cuántos tipos de minerales tengo en la colección?\ Para saber esto usaremos la función len :
In [49]: len(minerales)
7
Out[49]:
¿Cómo hago para seleccionar partes de la lista de minerales?\ A través de un método en Python conocido como slicing:
Para realizar slicing se sigue el siguiente formato: lista[inicio:final:paso] \ El orden número en Python empieza
desde 0, 1, 2, 3...
In [50]: print(minerales[:])
El primer elemento:
In [51]: print(minerales[0])
pirita
In [52]: print(minerales[:3])
El último elemento:
In [53]: print(minerales[-1])
molibdenita
In [54]: print(minerales[-3:])
In [55]: print(minerales[::2])
Imaginemos que ahora en la colección solo queda cuarzo, pirita, esfalerita y calcopirita. ¿Cómo removemos los otros minerales de la lista?\
Los removeremos usando el método .remove :
In [56]: [Link]("galena")
[Link]("acantita")
[Link]("molibdenita")
print(minerales)
Como siguiente ejemplo, tenemos las concentraciones de Au (en ppm) de varias muestras agrupadas en una lista:
In [57]: au_ppm = [10.1, 2.0, 0.4, 11.7, 6.3, 1.3, 0.1, 2.6, 8.1, 7.0]
Si queremos obtener el promedio de concentración de las muestras, dividiremos la suma de los elementos entre el total:
La suma de los elementos en una lista se puede calcular con la función sum .
4.96
Out[58]:
Ahora calcularemos los valores máximos y mínimos usando las funciones max y min :
In [60]: sorted(au_ppm)
[0.1, 0.4, 1.3, 2.0, 2.6, 6.3, 7.0, 8.1, 10.1, 11.7]
Out[60]:
[11.7, 10.1, 8.1, 7.0, 6.3, 2.6, 2.0, 1.3, 0.4, 0.1]
Out[61]:
6. Tuplas
Las tuplas son colecciones de datos no modificables que se caracterizan por estar encerrados entre paréntesis () .
Calcularemos la distancia del punto a las coordenadas (5, 15, 4).\ Primero, asignaremos las coordenadas por separado:
In [63]: x, y, z = punto
7. Diccionarios
Los diccionarios son colecciones de datos modificables que se caracterizan por estar encerrados entre llaves {} .\ Además, cada elemento
en un diccionario está compuesto por una llave (key) y un valor (value).
Por ejemplo, crearemos un diccionario que contenga la composición mineralógica de una muestra:
In [65]: muestra = {"cuarzo": 35, "feldespato": 20, "plagioclasas": 30, "micas": 10}
Como podemos ver, cada elemento de la muestra está compuesto por una llave (nombre del mineral) y un valor (porcentaje en la
muestra):
In [66]: print(muestra)
In [67]: muestra["cuarzo"]
35
Out[67]:
In [68]: muestra["cuarzo"] = 40
print(muestra)
Podemos obtener el porcentaje de un mineral incluso si no ha sido indicado previamente (por ejemplo, pirita).\ Para esto, usaremos la
función get e incluiremos un valor de porcentaje por defecto:
In [69]: [Link]("pirita", 0)
0
Out[69]:
In [70]: muestra["pirita"] = 0
print(muestra)
In [71]: [Link]()
In [72]: [Link]()
In [73]: [Link]()
dict_items([('cuarzo', 40), ('feldespato', 20), ('plagioclasas', 30), ('micas', 10), ('pirita', 0)])
Out[73]:
7.1. Sets
Los sets o conjuntos son colecciones de datos desordenados que no pueden tener valores repetidos. Se encasillan entre llaves {} .
In [75]: minerales
8. Bucles
Usaremos bucles si queremos realizar una tarea de manera repetitiva, iterativa, o cíclica.\ Existen dos tipos de bucles: definidos e
indefinidos.
Es importante indentar el bloque de código que seguirá luego de la primera línea del bucle.
Por ejemplo, crearemos un bucle que muestre los elementos de la función range :
0
1
2
3
4
Si tengo una lista de minerales, podemos mostrar cada elemento de la lista usando un bucle:
cuarzo
biotita
ortoclasa
muscovita
La función enumerate devuelve los elementos usando tuplas que contienen el número de orden de cada elemento.
(0, 'cuarzo')
(1, 'biotita')
(2, 'ortoclasa')
(3, 'muscovita')
Por último, podemos usar la función zip para agrupar conjuntos de elementos en grupos de tuplas:
('pirita', 6)
('galena', 2)
('cuarzo', 7)
8.2. Bucles indefinidos
Este tipo de bucle permanece activo hasta que la condición principal deja de ser verdadera (True), por lo cual puede ser ejecutada de
manera indefinida.\ Para detener un bucle indefinido, debemos establecer una medida que termine con la ejecución del bucle.\ Las
palabras reservadas usadas en un bucle indefinido son:
Por ejemplo, usaremos un bucle indefinido para crear un algoritmo que nos pida el nombre de una roca y solo termine de ejecutarse
cuando el nombre pertenezca a la lista indicada:
while True:
roca = input("Ingrese el nombre de la roca:")
if roca in rocas:
break
else:
print("El nombre ingresado no pertenece a la lista, intente denuevo.")
9. Funciones
Una función es una pieza de código que puede ser reutilizada en diferentes algoritmos. Para usar una función debemos llamarla por su
nombre.\ Para crear una función en Python debemos usar las siguientes palabras reservadas:
Es importante tener en cuenta que la estructura de la función debe ir indentada luego de la primera línea.
Por ejemplo, crearemos una función llamada frase que devolverá un comentario:
Nota: En este primer ejemplo, usaremos print en vez de return para devolver el resultado.
In [83]: frase()
Un parámetro puede tener diferentes valores, representa una variable dentro de la función:
In [86]: tipo_roca("metamórfica")
In [87]: tipo_roca(tipo="ígnea")
In [91]: sumatoria(20)
210.0
Out[91]:
Para crear una lista con aquellas concentraciones de Au mayores a 10 ppm, usaremos la función filter :
Ahora, clasificaremos la lista de acuerdo a sus valores, "bajo" si es menor o igual a 10 ppm y "alto" si es mayor.\ Para esto, usaremos
la función map y asignaremos la nueva lista a una variable llamada valores :
In [95]: print(valores)
['bajo', 'bajo', 'bajo', 'bajo', 'bajo', 'alto', 'alto', 'bajo', 'bajo', 'alto', 'bajo', 'bajo', 'bajo', 'alt
o', 'alto', 'bajo', 'bajo']
Por último, para obtener el número de valores altos y bajos, usaremos el método .count .
In [96]: [Link]("bajo")
12
Out[96]:
In [97]: [Link]("alto")
5
Out[97]:
Python es un lenguaje de programación orientado a objetos. \ Un objeto es una colección de datos y funciones que representan a una
entidad de la vida real. Cada objeto pertenece a una clase.\ Todo dentro de Python es tratado como un objeto: variables, funciones, listas,
tuplas, diccionarios, etc.\ La palabra reservada usada para crear una clase es class .
Nota: por convención, el nombre de una clase debe empezar con mayúscula.
La función __init__ representa el estado inicial del objeto, se ejecuta al mismo tiempo que el objeto es creado.\ El parámetro self es
una referencia del mismo objeto y se usa para establecer los métodos y atributos de la clase creada.
Un método es una función específica creada dentro de una clase.\ Un atributo es un valor específico almacenado dentro de
una clase.
In [102… [Link]
'andesita'
Out[102…
In [103… [Link]
'afanítica'
Out[103…
Por último, crearemos un método llamado resumen que resuma los atributos de la roca en una frase:
In [106… [Link]()
11. Numpy
Usaremos esta librería para operar información en forma de vectores y matrices (álgebra lineal).
Usaremos np como una referencia abreviada de la librería.\ Para usar una función de Numpy, debemos anteponer su
referencia (ejemplo: [Link] para calcular el logaritmo de un número).\ Para saber más sobre la importación de librerías,
revisar el Anexo 2.
11.1. Vectores
Usaremos la función array y una lista para crear un vector:
In [109… print(vector)
[1 2 3 4 5 6]
Este vector contiene el mismo tipo de información en cada posición. Lo verificamos usando el atributo .dtype :
In [110… [Link]
dtype('int32')
Out[110…
Para transformar los valores del vector de integer a float, usaremos la función astype :
In [111… [Link](float)
De manera similar a una lista o tupla, podemos seleccionar partes del vector haciendo slicing:
In [112… vector[0]
1
Out[112…
In [113… vector[2:5]
array([3, 4, 5])
Out[113…
In [114… vector[-1] = 10
In [115… vector
array([ 1, 2, 3, 4, 5, 10])
Out[115…
In [118… copia[0] = 0
In [119… print(vector)
print(copia)
[ 1 2 3 4 5 10]
[ 0 2 3 4 5 10]
11.2. Matrices
Usaremos la función array y una lista de listas para crear una matriz:
In [121… print(matriz)
[[1 2 3]
[4 5 6]
[7 8 9]]
In [122… [Link]
(3, 3)
Out[122…
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
Out[123…
In [124… print(matriz.T)
[[1 4 7]
[2 5 8]
[3 6 9]]
Para el siguiente ejemplo, tenemos dos matrices de 2 x 2, llamadas A y B:
In [126… print(A)
[[1 1]
[1 1]]
In [127… print(B)
[[-1 0]
[ 0 -1]]
Podemos agrupar las matrices horizontalmente usando la función hstack :
array([[ 1, 1],
Out[129…
[ 1, 1],
[-1, 0],
[ 0, -1]])
También podemos usar la función concatenate para agruparlos de acuerdo a un eje (0 para vertical y 1 para horizontal).
array([[ 1, 1],
Out[130…
[ 1, 1],
[-1, 0],
[ 0, -1]])
[ 6 8 10 12]
[-4 -4 -4 -4]
Multiplicar y dividirlos:
[ 5 12 21 32]
70
Out[137…
También podemos calcular la suma de componentes, máximo, mínimo, media, varianza y desviación estándar de cada vector:
In [138… print(v1)
[1 2 3 4]
Suma
In [139… [Link]()
10
Out[139…
Máximo
In [140… [Link]()
4
Out[140…
Mínimo
In [141… [Link]()
1
Out[141…
Media
In [142… [Link]()
2.5
Out[142…
Varianza
In [143… [Link]()
1.25
Out[143…
Desviación estándar
In [144… [Link]()
1.118033988749895
Out[144…
Espacios lineales
Podemos crear espacios lineales usando la función arange :
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
Out[145…
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
Out[146…
También podemos obtener números aleatorios usando el módulo random .\ El resultado puede ser un número, vector o matriz,
dependiendo de la forma dentro del paréntesis:
In [147… [Link]()
0.46075161087317984
Out[147…
In [148… [Link](0, 5)
2.4711934365589894
Out[148…
Una matriz de 2 × 2 compuesta por números aleatorios de una distribución normal de media 0 y varianza 1
In [149… [Link](2, 2)
array([[-0.82086821, -0.67252129],
Out[149…
[ 0.30502665, -2.80741372]])
Por último, podemos establecer condiciones y devolver resultados en base a estos usando la función where .\ Por ejemplo,
reemplazaremos los valores de v mayores a 2 por el valor de 0 y los menores por el valor de 1:
1
array([1, 1, 0, 0])
Out[150…
12. Matplotlib
Usaremos plt como una referencia abreviada del módulo librería.\ También importaremos numpy .
subplots : crea el espacio para una o varias figuras ordenadas en filas y columnas.
scatter : crea un diagrama de dispersión de puntos.
plot : crea una figura de líneas.
bar : crea un diagrama de barras.
hist : crea un histograma.
boxplot y violinplot : crean figuras que nos ayudan a visualizar la distribución de los datos.
Matplotlib es una librería fuertemente orientada a objetos, por lo tanto, usaremos identificadores.\ Para identificar las figuras, usaremos los
siguientes nombres:
[Link](fontsize=16)
[Link]()
12.4. Histograma
In [155… x = [Link](10000,)
12.5. Boxplot
In [156… x = [Link](10000,)
y = 2*x + 1
z = 2 - x
12.6. Violinplot
In [157… x = [Link](10000,)
y = 2*x + 1
z = 2 - x
13. Pandas
Esta librería es fundamental para el análisis, tratamiento y manipulación de datos estructurados (i.e. en filas y columnas).
Usaremos pd como una referencia abreviada de la librería.\ También usaremos Numpy para generar información.
13.1. Series
Empezaremos creando un objeto llamado Series , que es similar a un array de Numpy, excepto que llevan un índice (index):
In [159… [Link]([Link]((4,)))
0 0.135418
Out[159…
1 0.357604
2 0.813607
3 0.227746
dtype: float64
In [160… rocas = [Link]({"A": "andesita", "B": "basalto", "C": "diorita", "D": "granito"})
In [161… rocas
A andesita
Out[161…
B basalto
C diorita
D granito
dtype: object
In [163… [Link]
A andesita
Out[164…
B basalto
C diorita
D andesita
dtype: object
Por último, seleccionaremos el tercer elemento de la serie. Podemos hacer esto de dos formas:\ Usando el método iloc para ubicarlo a
partir del número de posición en el índice:
In [165… [Link][2]
'diorita'
Out[165…
O podemos usar el método loc para ubicarlo a partir del nombre asignado al índice:
In [166… [Link]["C"]
'diorita'
Out[166…
13.2. DataFrame
El otro tipo de objeto usado en Pandas es el DataFrame , que agrupa objetos de tipo Series en una tabla de filas y columnas.\ Cada fila
y columna del DataFrame puede llevar un nombre específico.
Como ejemplo, crearemos un DataFrame de 2 filas y 3 columnas usando un array y una lista de columnas A, B y C:
Out[167… A B C
Out[168… A B C
Out[169… A B C D
14. Ejercicios
Mes Au (onzas)
Enero 80
Febrero 105
Marzo 45
Abril 80
Mayo 75
Junio 125
In [172… print(f"Durante el semestre, la mina produjo {total} onzas de Au con una ganancia total de {ganancia} dólares")
Durante el semestre, la mina produjo 510 onzas de Au con una ganancia total de 270000 dólares
1 t
p = 1 − (1 − )
T
Donde:
p : probabilidad de excedencia
t : vida útil de la estructura
T : período de retorno
In [173… t = 100
T = 500
p = 1 - (1 - (1/T))**t
In [174… print(p)
0.18143319531157232
In [175… muestra = {"cuarzo": 0.48, "plagioclasas": 0.27, "feldespato": 0.11, "biotita": 0.08, "pirita": 0.06}
In [176… muestra
{'cuarzo': 0.48,
Out[176…
'plagioclasas': 0.27,
'feldespato': 0.11,
'biotita': 0.08,
'pirita': 0.06}
Nota: usar la función print para mostrar los resultados de cada mineral.
suma = cz + plg + fp
cz /= suma
plg /= suma
fp /= suma
In [179… streckeisen(muestra)
{'cuarzo': 0.5581395348837209,
Out[179…
'plagioclasas': 0.313953488372093,
'feldespato': 0.12790697674418605}
Nota: en caso la función no evalúe la muestra de forma correcta o indique error, se deberá modificar la función hasta que
pueda resolverla.
In [180… muestra2 = {"cuarzo": 0.41, "plagioclasas": 0.25, "anfíboles": 0.17, "biotita": 0.12, "pirita": 0.05}
In [181… streckeisen(muestra2)
{'cuarzo': 0.6212121212121212,
Out[181…
'plagioclasas': 0.37878787878787884,
'feldespato': 0.0}
tan(ϕaparente )
ϕreal = arctan( )
cos(β)
Donde:
In [182… dip_aparente = 33
beta = abs(180 - 150)
Ahora, importaremos la librería math para poder usar las funciones tangente, seno y arcotangente.\ Primero usaremos la función
[Link]() para transformar los ángulos de grados sexagesimales a radianes.
Ahora, usaremos [Link]() , [Link]() y [Link]() para calcular el buzamiento real en radianes:
0.6434187340999458
Out[185…
In [186… [Link](dip_real)
36.865177923577036
Out[186…