selimfirat/pysad - Open Source PR Review Scorecard

Streaming anomaly detection in Python: 16 online detectors (xStream, LODA, RS-Hash, Half-Space Trees, RRCF…) plus calibration and prequential evaluation for real-time data.

C-Rank Grade: B (Solid) - 53/100

External PR Merge Rate: 25%

Response Time: 1d

First Timer Success: 100%

Frequently Asked Questions

Is selimfirat/pysad welcoming to first-time open-source contributors?

selimfirat/pysad has a recorded first-timer success rate of 100.0%. Repositories ranked B typically provide actionable feedback during code reviews and actively nurture new community contributors.

How fast can I expect code review feedback on my pull request?

Maintainers in selimfirat/pysad respond to incoming external pull requests in approximately 36.0 hours on average. Keeping PRs focused on single tasks and ensuring tests pass helps maintainers review faster.

What does the 53.2 C-Rank™ score (B Tier) represent?

The C-Rank™ system evaluates GitHub projects on a 0–100 scale using real data: PR merge rates, review turnaround time, active maintainer presence, and first-time contributor success. A score of 53.2 places selimfirat/pysad in the B tier.

What is the external contributor pull request merge rate for selimfirat/pysad?

The external contributor pull request merge rate for selimfirat/pysad is 25.0%, based on public PR activity from non-core contributors.

Are there Good First Issues available in selimfirat/pysad?

selimfirat/pysad currently has 1 active issue(s) tagged with beginner-friendly labels like "good first issue", "beginner", or "up-for-grabs".

selimfirat
selimfirat/pysadB•Solid294
GitHub
Back to Explorer
selimfirat

selimfirat/pysad

294
Active (30d)B•Solid(53/100)Low Sample (<20 PRs)Python

Streaming anomaly detection in Python: 16 online detectors (xStream, LODA, RS-Hash, Half-Space Trees, RRCF…) plus calibration and prequential evaluation for real-time data.

GitHub
Compare••
Jump to:

AI Maintainer Review Guidelines

Review Persona

Empathetic Technical Mentor

Warmth Score
7.6/10
Patience Score
8.2/10
Nitpick Rate
25%

Collaborative maintainer environment in selimfirat/pysad. Reviews community pull requests with focus on project quality.

What Contributors Actually Say

Discussions in selimfirat/pysad focus heavily on practical implementation feedback, code formatting standards, and issue reproduction details.

Hidden Friction Signals

Unlinked PRs without issue context and changes that fail automated test suites face the highest review friction.

Unwritten Rules

  • •1) Keep PR scope strictly aligned with the linked issue.
  • •2) Ensure local linters pass before opening a review.
  • •3) Maintain full test coverage for modified logic.

Top PR Submission Do's

  • •Add or update tests for changed behavior before requesting review
  • •Update docs or README when behavior changes
  • •Link the issue and include reproduction context in the PR

Top PR Friction Pitfalls (Don'ts)

  • •Do not leave requested test coverage unresolved
  • •Do not ship user-facing changes without matching docs
  • •Do not open context-free PRs
Response Velocity
1 days+
Standard maintainer review cycle

Average Response Latency

Tracks hours until a maintainer leaves a review, comment, or PR response.

Merge Efficiency
25.0%
Selective PR acceptance rate

External Acceptance Rate

Percentage of community pull requests successfully merged into main.

First-Timer Success
100.0%
Strong first-timer PR acceptance rate

First PR Conversion

Rate at which developers submitting their first repository PR succeed.

Active Maintainers
2 core
Small core review team
Diagnostic Health HUD
25.0%
Merge Gauge
100.0%
1st-Timer
Community Vibe43/100

Embed C-Rank Badge

Show contributors that your repository actively reviews and merges external pull requests.

GetMerged C-Rank badge for selimfirat/pysad
[![GetMerged C-Rank](https://getmerged.abhishekco.de/api/badge/selimfirat/pysad)](https://getmerged.abhishekco.de/selimfirat/pysad?utm_source=github&utm_medium=badge)

Active Good First Issues (5)

View on GitHub

IForestASD (iforest_asd.py) is a thin subclass of ReferenceWindowModel with sliding_size == window_size, so it retrains a fresh IForest on every window, unconditionally. The docstring says concept drift "is not implemented since it is a part of the simulation" and there is a # TODO: implement concept drift method on line 14. But the drift check is the part of the paper that makes iForestASD different from plain reference windowing. In Algorithm 2 of Ding and Fei (2013, ding2013anomaly in refs.bib), the current forest scores the instances of the newest window, the anomaly rate u of that window is compared against a threshold, and the forest is rebuilt from the new window only if u exceeds the threshold. Otherwise the existing forest is kept and the window is discarded. Proposal: Add drift_threshold: float | None = None to IForestASD.__init__. With None the model behaves exactly as today (retrain on every window), so nothing changes for existing users. With a value in [0, 1], on each fu

📅 Opened Sep 28, 2026💬 0 comments
Quality: 90/100Contribute

Following #72 and #106, pysad/utils is another good module for type hints. It's small (array_streamer.py, pandas_streamer.py, window.py, data.py and the helpers in __init__.py), and it's the part of the API that almost every user calls first. It would be useful to add type hints to the utils module so editors and type checkers can help users. Done when: Every public function and method in pysad/utils/*.py and pysad/core/base_streamer.py has argument and return annotations (e.g. get_minmax_array(X: np.ndarray) -> tuple[np.ndarray, np.ndarray], and Iterator[...] for the streamers' iter) PandasStreamer annotates its arguments as pd.DataFrame without importing pandas at runtime, since pandas is optional (use from __future__ import annotations with if TYPE_CHECKING:) Only built-in syntax supported on Python 3.10+ is used, with no new dependencies Docstrings stay as they are, and pytest tests/utils tests/test_utils.py passes Optional: mypy pysad/utils reports no errors in these files

📅 Opened Sep 27, 2026💬 0 comments
Quality: 90/100Contribute

tests/models/test_standard_absolute_deviation.py checks that StandardAbsoluteDeviation returns one score per instance and rejects bad arguments, but never checks the scores themselves. It would be useful to pin down what the model returns on a small stream, so a regression in the formula is caught. Done when: On a small fixed univariate stream (for example [3, 1, 4, 1, 5, 9, 2, 6] as a column), fit_score with the default substracted_statistic="mean" is checked against |x_t - mean(x_1..x_t)| / std(x_1..x_t), with the population standard deviation (np.std, ddof=0) The same is checked for substracted_statistic="median", subtracting the running median instead absolute=False is checked to keep the sign, so it's negative for values below the mean The first score (a single value, so zero variance) is asserted explicitly, whatever it is today pytest tests/models/test_standard_absolute_deviation.py passes The model is in pysad/models/standard_absolute_deviation.py. Tests only: please don

📅 Opened Sep 27, 2026💬 0 comments
Quality: 90/100Contribute

Windowed components accept a window_size of 0 or less without complaint and then fail later, far from the mistake: from pysad.statistics import AverageMeter, RunningStatistic from pysad.transform.postprocessing import RunningAveragePostprocessor from pysad.transform.probability_calibration import ConformalProbabilityCalibrator from pysad.utils import Window RunningStatistic(AverageMeter, window_size=0).update(1.0).get() # ZeroDivisionError: float division by zero RunningAveragePostprocessor(window_size=0).fit_transform_partial(1.0) # ZeroDivisionError: float division by zero ConformalProbabilityCalibrator(window_size=0).fit_transform_partial(1.0) # returns nan, with a RuntimeWarning window = Window(0) window.update(1.0) window.get() # [], because the window silently keeps nothing It would be useful to reject these values when the object is created, with a clear message. Done when: RunningStatistic, Window a

📅 Opened Sep 27, 2026💬 0 comments
Quality: 90/100Contribute

tests/transform/postprocessing/test_postprocessors.py runs all eight score postprocessors on random scores, but it only checks the output shape. A regression that returned the wrong statistic, or the wrong window, would still pass. It would be useful to check the actual values the postprocessors return, as #68 did for the ensemblers. Done when: On a small fixed list of scores (for example [3, 1, 4, 1, 5, 9, 2, 6]), AveragePostprocessor, MaxPostprocessor and MedianPostprocessor are checked against np.mean, np.max and np.median of all the scores seen so far, including the current one RunningAveragePostprocessor, RunningMaxPostprocessor and RunningMedianPostprocessor with a small window_size (for example 3) are checked against the same functions over the last window_size scores ZScorePostprocessor and RunningZScorePostprocessor are checked against (score - mean) / std with the population standard deviation (np.std, ddof=0). The first output is nan because a single score has zero varia

📅 Opened Sep 27, 2026💬 0 comments
Quality: 90/100Contribute
Looking for more Python beginner tasks?Explore Python GFI

Contributor Community Vibe Feedback

Rate what actually matters after opening a pull request here.

Have you contributed to this repo?

Rate your first-hand PR experience (review speed, maintainer responsiveness, and onboarding ease) to help other contributors.

3 ratings required
Maintainer helpfulness
Review speed
Beginner friendliness

Contributor Compatibility & Review Speed Analysis for selimfirat/pysad

When evaluating whether to contribute to selimfirat/pysad, response velocity and maintainer engagement are crucial. GetMerged continuously tracks pull request trajectories, first-comment latency, and code review rounds to help developers avoid submitting pull requests to backlogged repositories.

Currently, maintainers of selimfirat/pysad acknowledge new external contributions in approximately 1 days+. Out of all submitted pull requests from non-core authors in the last 180-day window, 25.0% were successfully merged into the primary branch.

Frequently Asked Questions - Contributing to selimfirat/pysad

01

Is selimfirat/pysad welcoming to first-time open-source contributors?

selimfirat/pysad has a recorded first-timer success rate of 100.0%. Repositories ranked Solid typically provide actionable feedback during code reviews and actively nurture new community contributors.

02

How fast can I expect code review feedback on my pull request?

The initial maintainer response time averages ~1 days+. Keeping PRs scoped to single concerns and ensuring CI checks succeed will optimize review turnaround.

03

What does the 53.2 C-Rank™ score represent?

The C-Rank™ index scores repositories on a 0 to 100 scale using an objective formula: external PR merge rates, initial response speed, active maintainer count, and first-time contributor retention. A score of 53.2 places selimfirat/pysad in the Solid tier.

04

What is the external contributor pull request merge rate for selimfirat/pysad?

The external pull request merge rate is 25.0%. GetMerged isolates non-core community contributions so external developers get an accurate benchmark of PR acceptance probability.

05

Are there beginner Good First Issues open in selimfirat/pysad?

Yes, selimfirat/pysad currently has 1 active issue(s) tagged with beginner-friendly labels. You can inspect these directly from the repository issues tab.

GetMerged C-Rank™ Indexing Standard

All metrics displayed for selimfirat/pysad are automatically retrieved via the public GitHub API and recalculated daily. Insider pull requests submitted by repository owners or organization members are excluded from merge rate calculations to preserve objective external contributor statistics.