field-analyzer
A domain-specific tool for analyzing Gulf of Mexico deepwater field performance and metrics.
Install
mkdir -p .claude/skills/field-analyzer && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/12316" && unzip -o skill.zip -d .claude/skills/field-analyzer && rm skill.zipInstalls to .claude/skills/field-analyzer
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Field Analyzer (user)Key capabilities
- →Analyze specific deepwater fields in GOM
- →Aggregate production by field across multiple wells/leases
- →Compare field performance and economics
- →Build field-level type curves
- →Track development history and milestones
- →Add custom field definitions
How it works
The skill analyzes GOM deepwater fields by aggregating well-level data, comparing production across multiple fields, and calculating field statistics. It supports predefined fields and allows adding custom field definitions.
Inputs & outputs
When to use field-analyzer
- →Analyzing field production
- →Building type curves
- →Tracking development milestones
- →Comparing field performance
About this skill
Field Analyzer Skill
Deepwater field-specific analysis for major GOM developments
When to Use This Skill
Use this skill when you need to:
- Analyze specific deepwater fields (Anchor, Julia, Jack, St. Malo)
- Aggregate production by field across multiple wells/leases
- Compare field performance and economics
- Build field-level type curves
- Track development history and milestones
Core Pattern
"""
ABOUTME: Field-level analysis for major GOM deepwater developments
ABOUTME: Aggregates wells by field and provides field-specific analytics
"""
from dataclasses import dataclass, field
from typing import List, Dict, Optional
import pandas as pd
@dataclass
class FieldDefinition:
"""Definition of a GOM field."""
name: str
operator: str
development_type: str # FPSO, TLP, SPAR, SUBSEA
water_depth_ft: float
first_production: str # YYYY-MM
api_numbers: List[str] = field(default_factory=list)
lease_numbers: List[str] = field(default_factory=list)
blocks: List[str] = field(default_factory=list)
# Known Lower Tertiary fields
LOWER_TERTIARY_FIELDS = {
"ANCHOR": FieldDefinition(
name="Anchor",
operator="Chevron",
development_type="FPSO",
water_depth_ft=5200,
first_production="2024-08",
blocks=["GC 807", "GC 808"]
),
"JACK": FieldDefinition(
name="Jack",
operator="Chevron",
development_type="SPAR",
water_depth_ft=7000,
first_production="2014-12",
blocks=["WR 759"]
),
"ST_MALO": FieldDefinition(
name="St. Malo",
operator="Chevron",
development_type="SPAR",
water_depth_ft=7000,
first_production="2014-11",
blocks=["WR 678"]
),
"JULIA": FieldDefinition(
name="Julia",
operator="ExxonMobil",
development_type="SUBSEA",
water_depth_ft=7000,
first_production="2016-10",
blocks=["WR 627"]
),
"KASKIDA": FieldDefinition(
name="Kaskida",
operator="BP",
development_type="TBD",
water_depth_ft=5800,
first_production="TBD",
blocks=["KC 292"]
)
}
class FieldAnalyzer:
"""
Analyze GOM fields by aggregating well-level data.
Supports predefined fields and custom field definitions.
"""
def __init__(self):
self.field_definitions = LOWER_TERTIARY_FIELDS.copy()
def add_field(self, definition: FieldDefinition) -> None:
"""Add custom field definition."""
self.field_definitions[definition.name.upper()] = definition
def get_field_wells(self, field_name: str) -> List[str]:
"""Get API numbers for wells in a field."""
field_def = self.field_definitions.get(field_name.upper())
if not field_def:
raise ValueError(f"Unknown field: {field_name}")
# Query BSEE for wells in field blocks
from worldenergydata.bsee.data import query_wells_by_block
all_apis = []
for block in field_def.blocks:
apis = query_wells_by_block(block)
all_apis.extend(apis)
return list(set(all_apis))
def aggregate_field_production(
self,
field_name: str,
start_date: str = None,
end_date: str = None
) -> pd.DataFrame:
"""
Aggregate production across all wells in a field.
Returns monthly field-level production totals.
"""
from worldenergydata.bsee.data import get_production_data
field_def = self.field_definitions.get(field_name.upper())
if not field_def:
raise ValueError(f"Unknown field: {field_name}")
# Get production for each well
well_dfs = []
for api in self.get_field_wells(field_name):
try:
df = get_production_data(api_number=api)
df["api_number"] = api
well_dfs.append(df)
except Exception:
continue
if not well_dfs:
return pd.DataFrame()
# Combine and aggregate
combined = pd.concat(well_dfs, ignore_index=True)
# Group by month
combined["year_month"] = combined["date"].dt.to_period("M")
field_production = combined.groupby("year_month").agg({
"oil_bbl": "sum",
"gas_mcf": "sum",
"water_bbl": "sum",
"api_number": "nunique"
}).rename(columns={"api_number": "active_wells"})
field_production["field_name"] = field_name
field_production = field_production.reset_index()
field_production["date"] = field_production["year_month"].dt.to_timestamp()
return field_production
def compare_fields(
self,
field_names: List[str],
metric: str = "oil_bbl"
) -> pd.DataFrame:
"""
Compare production across multiple fields.
Aligns by months on production for fair comparison.
"""
field_dfs = []
for name in field_names:
df = self.aggregate_field_production(name)
if not df.empty:
# Add months on production
df = df.sort_values("date")
df["months_on_prod"] = range(len(df))
df = df[["months_on_prod", metric, "field_name"]]
field_dfs.append(df)
if not field_dfs:
return pd.DataFrame()
# Pivot for comparison
combined = pd.concat(field_dfs)
comparison = combined.pivot(
index="months_on_prod",
columns="field_name",
values=metric
)
return comparison
def field_economics_summary(self, field_name: str) -> Dict:
"""
Generate economics summary for a field.
Returns key metrics and KPIs.
"""
field_def = self.field_definitions.get(field_name.upper())
production = self.aggregate_field_production(field_name)
if production.empty:
return {}
total_oil = production["oil_bbl"].sum()
total_gas = production["gas_mcf"].sum()
peak_oil = production["oil_bbl"].max()
months_producing = len(production)
return {
"field_name": field_name,
"operator": field_def.operator,
"development_type": field_def.development_type,
"water_depth_ft": field_def.water_depth_ft,
"first_production": field_def.first_production,
"cumulative_oil_mmbbl": total_oil / 1_000_000,
"cumulative_gas_bcf": total_gas / 1_000_000,
"peak_oil_bopd": peak_oil / 30,
"months_producing": months_producing,
"active_wells": production["active_wells"].iloc[-1] if len(production) > 0 else 0
}
YAML Configuration Template
# config/input/field-analysis.yaml
metadata:
feature_name: "field-analysis"
created: "2025-01-15"
# Fields to analyze
fields:
- name: "ANCHOR"
include_forecast: true
- name: "JACK"
include_forecast: true
- name: "ST_MALO"
include_forecast: true
# Analysis options
analysis:
aggregate_by: "month"
calculate_type_curve: true
compare_vs_plan: false
# Custom field definitions (optional)
custom_fields:
- name: "MY_FIELD"
operator: "Operator Name"
development_type: "SUBSEA"
water_depth_ft: 6000
blocks: ["GC 100", "GC 101"]
output:
format: "html"
path: "reports/fields/"
include_comparison_chart: true
CLI Usage
# Analyze single field
python -m worldenergydata.field_analyzer \
--field ANCHOR \
--output reports/anchor_analysis.html
# Compare multiple fields
python -m worldenergydata.field_analyzer \
--compare JACK ST_MALO JULIA \
--metric oil_bbl \
--output reports/lt_comparison.html
Best Practices
- Use official BSEE block designations for field definitions
- Validate well assignments periodically as new wells come online
- Exclude wells with anomalous data (testing, workovers)
- Align comparison by months on production, not calendar date
When not to use it
- →When analyzing fields outside of major GOM deepwater developments
Limitations
- →Limited to specific deepwater fields (Anchor, Julia, Jack, St. Malo)
- →Requires official BSEE block designations for field definitions
- →Requires validation of well assignments periodically
How it compares
This skill provides specialized analysis for GOM deepwater fields, aggregating and comparing data at a field level, which is more specific than general well-level production analysis.
Compared to similar skills
field-analyzer side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| field-analyzer (this skill) | 0 | 4mo | Review | Intermediate |
| quant-analyst | 103 | 2mo | No flags | Advanced |
| stock-analyzer | 71 | 2mo | Review | Beginner |
| pair-trade-screener | 11 | 1mo | Review | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by vamseeachanta
View all by vamseeachanta →You might also like
quant-analyst
zenobi-us
Expert quantitative analyst specializing in financial modeling, algorithmic trading, and risk analytics. Masters statistical methods, derivatives pricing, and high-frequency trading with focus on mathematical rigor, performance optimization, and profitable strategy development.
stock-analyzer
FrancyJGLisboa
Provides comprehensive technical analysis for stocks and ETFs using RSI, MACD, Bollinger Bands, and other indicators. Activates when user requests stock analysis, technical indicators, trading signals, or market data for specific ticker symbols.
pair-trade-screener
tradermonty
Statistical arbitrage tool for identifying and analyzing pair trading opportunities. Detects cointegrated stock pairs within sectors, analyzes spread behavior, calculates z-scores, and provides entry/exit recommendations for market-neutral strategies. Use when user requests pair trading opportunities, statistical arbitrage screening, mean-reversion strategies, or market-neutral portfolio construction. Supports correlation analysis, cointegration testing, and spread backtesting.
risk-metrics-calculation
wshobson
Calculate portfolio risk metrics including VaR, CVaR, Sharpe, Sortino, and drawdown analysis. Use when measuring portfolio risk, implementing risk limits, or building risk monitoring systems.
backtesting-trading-strategies
jeremylongshore
Backtest crypto and traditional trading strategies against historical data. Calculates performance metrics (Sharpe, Sortino, max drawdown), generates equity curves, and optimizes strategy parameters. Use when user wants to test a trading strategy, validate signals, or compare approaches. Trigger with phrases like "backtest strategy", "test trading strategy", "historical performance", "simulate trades", "optimize parameters", or "validate signals".
model-usage
openclaw
Use CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.