Setting Up The Highlander Pipeline At NJIT
The Highlander Pipeline is a data processing framework designed to move energy sector datasets through cleaning, transformation, and model ingestion stages with minimal manual intervention. It was built primarily around the infrastructure needs at NJIT, where researchers and students needed a repeatable way to handle large-scale energy datasets without rebuilding ETL logic from scratch every semester. I started using it about three years ago when a project required processing SCADA data from multiple pipeline operators simultaneously. The standard approach of writing individual scripts for each source was burning through lab hours, so I looked for something that could abstract that pain away. The basic architecture breaks into three layers: an ingestion layer that pulls from APIs, flat files, and database connections, a transformation layer that applies schema normalization and unit conversions, and a model layer that packages everything into formats consumable by forecasting and optimization tools. What makes it useful is that the transformation layer alone handles roughly forty different energy data formats out of the box, including PNode pricing data, pipeline tariff structures, and commodity flow rates. You do not need to write custom parsers for most common energy dataset types.
The Highlander Pipeline Njit And The Future Of Energy
Getting it running on a local machine takes about twenty minutes if you already have Python 3.10 or later and Docker installed. Clone the repository from the NJIT GitHub organization, run the dependency installer script, and point it at your data directory. The configuration file is YAML-based and straightforward. Here is the default structure you will see: ingestion.source tells the pipeline where to pull data from. transformation.rules contains the normalization logic. model.output defines where cleaned datasets get written. I ran into a specific issue early on that nobody documented anywhere. When the pipeline processes hourly timestamps across multiple time zones simultaneously, the UTC conversion logic creates duplicate records for datasets that span daylight saving time boundaries. I was working with Eastern and Central zone pipeline flow data, and the output had roughly 8 percent duplicate rows in the transition windows. The workaround is to add a deduplication step using the composite key of timestamp plus origin_zone, then sort by ingestion_order before the final write. It took me an afternoon to identify and patch because the duplicate rows do not trigger any error conditions, they just silently inflate downstream model accuracy metrics in a way that looks correct until you inspect the raw counts. I submitted a patch to the main repo after that, and it got merged into version 2.4.1.
One thing that surprised me about the framework is how well it handles missing data interpolation for energy time series. Most pipelines either forward-fill or drop gaps, but Highlander includes a seasonal decomposition option that models the missing values based on year-over-year patterns before injecting them back. This matters more than you might think when you are training demand forecasting models. If you drop gaps randomly, your model learns artifacts from incomplete windows. The seasonal interpolation produces noticeably better MAE scores on test sets, typically improving forecast accuracy by 3 to 5 percent on monthly pipeline throughput predictions. I verified this across three separate semester projects at NJIT, and the results were consistent. There are real limitations though. The pipeline assumes you have at least 16 GB of RAM for datasets larger than 50 GB, and it does not parallelize efficiently below that threshold. I tried running it on a 8 GB machine during a field deployment and hit swap thrashing on the transformation stage, which increased processing time from about twelve minutes to over forty-five. If you are working with constrained hardware, the simpler alternative is to chunk your ingestion layer by month and process sequentially. It is slower but stable. Another caveat is that the model output layer only supports a limited set of serialization formats. Parquet, CSV, and JSON are available. If your downstream toolchain requires Arrow or HDF5, you will need to write a custom exporter module or convert after the fact. The framework does not block you from doing this, but it adds an extra step that some teams overlook during planning.
Get the Full Details

For long-term use, the documentation team at NJIT has been adding connectors for newer energy data standards, including updates for FERC e-Grid boundary definitions and the latest API releases from the EIA. Keeping your pipeline version current matters because older releases lack support for these newer schemas, and the conversion libraries they depend on have moved on. Version 2.3 and earlier will fail silently on certain EIA API responses, returning empty dataframes instead of raising errors. Upgrading to 2.4.x resolves this, but you should always run a validation check against a known-good dataset after updating. Training new team members on the framework typically takes two days if they already understand basic Python and data pipeline concepts. The first day covers configuration and ingestion setup. The second day goes into transformation rule customization and debugging common failure modes. After that, they are generally productive on their own. I have mentored six students through this process, and the learning curve flattens quickly once they hit the deduplication issue and learn to check for it proactively. The Highlander Pipeline is not a silver bullet for every energy data problem, but for teams that need to move from raw SCADA and market data to model-ready datasets on a regular basis, it cuts the average preparation time from two hours down to roughly fifteen minutes per dataset batch. That kind of efficiency gain compounds fast when you are juggling multiple projects simultaneously.