Online inference pattern that processes test batches sequentially, updating feature dictionaries incrementally for time-series prediction APIs.
Scanned 9/12/2026
Install to Claude Code
npx -y skills add wenmin-wu/ds-skills --skill streaming-prediction-api --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Streaming Prediction Api?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/wenmin-wu-streaming-prediction-api)More formats (shields.io, HTML) on the badges page.
---
name: tabular-streaming-prediction-api
description: >
Online inference pattern that processes test batches sequentially, updating feature dictionaries incrementally for time-series prediction APIs.
---
# Streaming Prediction API
## Overview
Some competitions (and production systems) serve test data in sequential batches — you predict one batch, then receive the next with updated ground truth. Maintain in-memory feature dictionaries that update after each batch. This pattern handles the Kaggle time-series API and applies to any online learning / streaming prediction scenario.
## Quick Start
```python
from collections import defaultdict
import numpy as np
class StreamingPredictor:
def __init__(self, model, features, global_mean=0.5):
self.model = model
self.features = features
self.global_mean = global_mean
self.user_sum = defaultdict(float)
self.user_count = defaultdict(int)
self.content_mean = {} # precomputed from training
def predict_batch(self, batch_df):
"""Predict and update features for one batch."""
# Build features from current state
batch_df['user_mean'] = batch_df['user_id'].map(
lambda u: self.user_sum[u] / self.user_count[u]
if self.user_count[u] > 0 else self.global_mean
)
batch_df['user_count'] = batch_df['user_id'].map(self.user_count)
batch_df['content_mean'] = batch_df['content_id'].map(self.content_mean)
preds = self.model.predict(batch_df[self.features])
return preds
def update(self, batch_df, outcomes):
"""Update internal state with observed outcomes."""
for uid, outcome in zip(batch_df['user_id'], outcomes):
self.user_sum[uid] += outcome
self.user_count[uid] += 1
# Usage with Kaggle API
predictor = StreamingPredictor(model, feature_cols)
for test_df, sample_pred_df in env.iter_test():
preds = predictor.predict_batch(test_df)
predictor.update(test_df, preds) # or true outcomes if available
env.predict(sample_pred_df.assign(answered_correctly=preds))
```
## Workflow
1. Precompute static features from training (content difficulty, etc.)
2. Initialize user-level dictionaries from training history
3. For each test batch: build features → predict → update dictionaries
4. Handle cold-start users with global mean fallback
## Key Decisions
- **Dictionary vs DataFrame**: Dicts are O(1) lookup; DataFrames require merge — dicts are 10x faster for streaming
- **Update timing**: Update AFTER prediction (not before) to avoid leaking current batch
- **Memory**: For millions of users, use `int32` keys and `float32` values
- **Warm start**: Initialize dicts from training data for users seen during training
## References
- Riiid Answer Correctness Prediction (Kaggle)
- Source: [lgbm-with-loop-feature-engineering](https://www.kaggle.com/code/its7171/lgbm-with-loop-feature-engineering)
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!