Gráfico de Thakur en Python: Mecanismos de Empuje

Presión normalizada y recuperación de aceite para interpretar el comportamiento de un yacimiento

Yacimientos
Python
Visualización
Construye el gráfico de Thakur con datos de presión y producción acumulada. Calcula P/Pi y Np/N en Python y compara la trayectoria del yacimiento con curvas guía de mecanismos de empuje.
Autor/a
Fecha de publicación

27 de septiembre de 2026

¿Qué nos dice la presión durante la producción?

Dos yacimientos pueden haber producido la misma fracción de su aceite original y conservar presiones muy diferentes. Esa diferencia ayuda a investigar qué mecanismos aportan energía durante la explotación.

El gráfico de Thakur relaciona la presión del yacimiento, expresada como porcentaje de la presión inicial, con la fracción de aceite recuperado. En este ejemplo construiremos el gráfico en Python y agregaremos cinco curvas guía para interpretar la trayectoria de un yacimiento.

Visita el canal @rigopetrodata

Tutoriales de R, Python y Excel para ingeniería petrolera

Ver canal

Las variables del gráfico

En el eje horizontal colocamos la recuperación acumulada:

\[ R\;(\%)=\frac{N_p}{N}\times100 \]

En el eje vertical colocamos la presión normalizada:

\[ P_n\;(\%)=\frac{P}{P_i}\times100 \]

Variable Significado Unidad del ejemplo
P Presión media del yacimiento en cada registro psia
Pi Presión inicial del yacimiento psia
Np Producción acumulada de aceite a condiciones de tanque STB
N Volumen original de aceite a condiciones de tanque, OOIP STB

Np y N deben estar en las mismas unidades. Para la presión usamos valores absolutos referidos al mismo datum. La presión de fondo fluyendo de un pozo no sustituye directamente a la presión media del yacimiento.

Cada punto representa el par de presión y producción acumulada de una misma etapa de explotación. Al inicio, cuando Np = 0 y P = Pi, el punto se encuentra en (0 %, 100 %).

Datos del ejemplo

Consideramos N = 13.8 MMSTB y Pi = 10,180 psia. El dataset contiene 72 registros, desde el estado inicial hasta una producción acumulada de 4,438,000 STB.

Descargar los datos del yacimiento

El archivo contiene dos columnas: Presion_psia y Np_STB. Guarda el CSV en la misma carpeta de tu cuaderno de Python. Los datos se encuentran en orden de producción acumulada y conservamos las pequeñas variaciones de presión entre registros.

1. Cargar los datos

Utilizaremos pandas y Matplotlib. Si hace falta instalarlos, ejecuta pip install pandas matplotlib en la terminal. Ejecuta los siguientes fragmentos en orden, dentro de la misma sesión.

Ver código
import pandas as pd
import matplotlib.pyplot as plt

datos = pd.read_csv("datos_yacimiento.csv")
N = 13.8e6  # STB
Pi = 10180  # psia

datos.head().round(2)
Presion_psia Np_STB
0 10180.00 0
1 10176.21 4000
2 10153.53 28000
3 10096.39 100000
4 9956.39 186000

2. Calcular la presión normalizada y la recuperación

Las dos operaciones se aplican a todas las filas. Multiplicamos por 100 porque mostraremos ambos ejes en porcentaje.

Ver código
datos["Recuperacion_pct"] = datos["Np_STB"] / N * 100
datos["Presion_pct"] = datos["Presion_psia"] / Pi * 100

datos.tail().round(2)
Presion_psia Np_STB Recuperacion_pct Presion_pct
67 6885.27 4206000 30.48 67.64
68 6860.49 4265000 30.91 67.39
69 6838.78 4324000 31.33 67.18
70 6816.36 4383000 31.76 66.96
71 6799.62 4438000 32.16 66.79

En el último registro:

\[ R=\frac{4{,}438{,}000}{13{,}800{,}000}\times100=32.16\% \]

\[ P_n=\frac{6799.62}{10180}\times100=66.79\% \]

Así, el yacimiento ha producido el 32.16 % del aceite original y conserva el 66.79 % de su presión inicial. Esta recuperación corresponde al último registro disponible, no a una estimación de la recuperación final.

3. Definir las curvas guía

Usaremos puntos de referencia para representar cinco mecanismos: empuje por agua, gas en solución, capa de gas, expansión de roca y fluidos, y drenaje gravitacional.

Las características generales de los mecanismos se describen en Integrated Petroleum Reservoir Management: A Team Approach, de Satter y Thakur (1994), cuyo gráfico se reproduce en Integrated Waterflood Asset Management, capítulo 1.

Los valores siguientes son una representación aproximada para el ejercicio, no ecuaciones universales ni fronteras de clasificación. Todas las columnas están en porcentaje: la primera contiene P/Pi × 100 y las demás, Np/N × 100 para cada mecanismo.

Ver código
guias = pd.DataFrame({
    "Presion_pct": [100, 90, 80, 70, 60, 50, 40, 20, 10],
    "Empuje por agua": [0, 0.5, 2.5, 8, 20, 46, None, None, None],
    "Gas en solución": [0, 3, 5, 6.5, 8.5, 10, 12, 17, 20],
    "Capa de gas": [0, 6.5, 12, 16, 20, 23, 25, 27, 28],
    "Expansión roca-fluidos": [0, 0.5, 1, 1.6, 2.2, 2.5, 3, 4, 5],
    "Drenaje gravitacional": [0, 6.5, 13, 19.8, 25.5, 30, 34, 46, 58]
})

Los valores None indican que la guía de empuje por agua termina en el 50 % de la presión inicial. No rellenamos esos puntos con ceros ni prolongamos la curva fuera de los datos disponibles.

🛒
Propiedades De Los Fluidos Del Yacimiento

Disponible en Mercado Libre

Ver oferta →

4. Construir el gráfico de Thakur

Graficamos cada mecanismo con una línea discontinua y superponemos los datos del yacimiento en negro. Usamos segmentos rectos entre los puntos guía para mantener el código sencillo.

Ver código
plt.figure(figsize=(9, 6))

for mecanismo in guias.columns[1:]:
    plt.plot(guias[mecanismo], guias["Presion_pct"], "--", label=mecanismo)

plt.plot(datos["Recuperacion_pct"], datos["Presion_pct"],
         "k.-", label="Yacimiento", linewidth=2)

plt.xlabel("Recuperación, Np/N (%)")
plt.ylabel("Presión normalizada, P/Pi (%)")
plt.xlim(0, 60)
plt.ylim(0, 105)
plt.grid(alpha=0.3)
plt.legend()
plt.tight_layout()
plt.show()
Figura 1: Presión normalizada frente a recuperación acumulada, con cinco curvas guía de mecanismos de empuje.

Interpretación del ejemplo

La trayectoria del yacimiento termina aproximadamente en (32.16 %, 66.79 %). En la parte final del historial se sitúa por encima de las curvas de empuje por agua y drenaje gravitacional, que son las guías que alcanzan ese intervalo de recuperación. Por ello, no corresponde asignarle un mecanismo simplemente buscando la curva más cercana.

La conservación de presión mientras aumenta Np es compatible con un aporte importante de energía, como el soporte de un acuífero. También debemos revisar si existe inyección o mantenimiento de presión. Con estos dos datos por registro no podemos distinguir esas causas ni cuantificar cuánto aporta cada mecanismo.

Para completar el diagnóstico, conviene contrastar el gráfico con la evolución de la relación gas–aceite, la producción de agua, la presión de burbuja, la presencia de una capa de gas y el historial de inyección. Un balance de materia permite evaluar las contribuciones de energía con mayor detalle.

Cómo usarlo con otro yacimiento

Reemplaza el CSV por tus pares de presión media y producción acumulada, manteniendo los nombres de las columnas. Después actualiza N y Pi y ejecuta los fragmentos en orden.

La estimación de N afecta directamente la posición horizontal de los puntos: un N mayor reduce Np/N para la misma producción. Revisa ese valor antes de interpretar la trayectoria. Las curvas guía ayudan a explorar el comportamiento, pero la conclusión debe considerar los datos de producción y las condiciones del yacimiento.

Referencia

Satter, A. y Thakur, G. C. (1994). Integrated Petroleum Reservoir Management: A Team Approach. PennWell Books. Véase la figura de mecanismos de empuje reproducida en Integrated Waterflood Asset Management, capítulo 1.