spforge 0.8.32__tar.gz → 0.8.33__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of spforge might be problematic. Click here for more details.

Files changed (120) hide show
  1. {spforge-0.8.32/spforge.egg-info → spforge-0.8.33}/PKG-INFO +1 -1
  2. {spforge-0.8.32 → spforge-0.8.33}/pyproject.toml +1 -1
  3. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/_player_rating.py +2 -2
  4. {spforge-0.8.32 → spforge-0.8.33/spforge.egg-info}/PKG-INFO +1 -1
  5. {spforge-0.8.32 → spforge-0.8.33}/tests/ratings/test_player_rating_generator.py +35 -0
  6. {spforge-0.8.32 → spforge-0.8.33}/LICENSE +0 -0
  7. {spforge-0.8.32 → spforge-0.8.33}/MANIFEST.in +0 -0
  8. {spforge-0.8.32 → spforge-0.8.33}/README.md +0 -0
  9. {spforge-0.8.32 → spforge-0.8.33}/examples/__init__.py +0 -0
  10. {spforge-0.8.32 → spforge-0.8.33}/examples/game_level_example.py +0 -0
  11. {spforge-0.8.32 → spforge-0.8.33}/examples/lol/__init__.py +0 -0
  12. {spforge-0.8.32 → spforge-0.8.33}/examples/lol/data/__init__.py +0 -0
  13. {spforge-0.8.32 → spforge-0.8.33}/examples/lol/data/subsample_lol_data.parquet +0 -0
  14. {spforge-0.8.32 → spforge-0.8.33}/examples/lol/data/utils.py +0 -0
  15. {spforge-0.8.32 → spforge-0.8.33}/examples/lol/pipeline_transformer_example.py +0 -0
  16. {spforge-0.8.32 → spforge-0.8.33}/examples/nba/__init__.py +0 -0
  17. {spforge-0.8.32 → spforge-0.8.33}/examples/nba/cross_validation_example.py +0 -0
  18. {spforge-0.8.32 → spforge-0.8.33}/examples/nba/data/__init__.py +0 -0
  19. {spforge-0.8.32 → spforge-0.8.33}/examples/nba/data/game_player_subsample.parquet +0 -0
  20. {spforge-0.8.32 → spforge-0.8.33}/examples/nba/data/utils.py +0 -0
  21. {spforge-0.8.32 → spforge-0.8.33}/examples/nba/feature_engineering_example.py +0 -0
  22. {spforge-0.8.32 → spforge-0.8.33}/examples/nba/game_winner_example.py +0 -0
  23. {spforge-0.8.32 → spforge-0.8.33}/examples/nba/predictor_transformers_example.py +0 -0
  24. {spforge-0.8.32 → spforge-0.8.33}/setup.cfg +0 -0
  25. {spforge-0.8.32 → spforge-0.8.33}/spforge/__init__.py +0 -0
  26. {spforge-0.8.32 → spforge-0.8.33}/spforge/autopipeline.py +0 -0
  27. {spforge-0.8.32 → spforge-0.8.33}/spforge/base_feature_generator.py +0 -0
  28. {spforge-0.8.32 → spforge-0.8.33}/spforge/cross_validator/__init__.py +0 -0
  29. {spforge-0.8.32 → spforge-0.8.33}/spforge/cross_validator/_base.py +0 -0
  30. {spforge-0.8.32 → spforge-0.8.33}/spforge/cross_validator/cross_validator.py +0 -0
  31. {spforge-0.8.32 → spforge-0.8.33}/spforge/data_structures.py +0 -0
  32. {spforge-0.8.32 → spforge-0.8.33}/spforge/distributions/__init__.py +0 -0
  33. {spforge-0.8.32 → spforge-0.8.33}/spforge/distributions/_negative_binomial_estimator.py +0 -0
  34. {spforge-0.8.32 → spforge-0.8.33}/spforge/distributions/_normal_distribution_predictor.py +0 -0
  35. {spforge-0.8.32 → spforge-0.8.33}/spforge/distributions/_student_t_distribution_estimator.py +0 -0
  36. {spforge-0.8.32 → spforge-0.8.33}/spforge/estimator/__init__.py +0 -0
  37. {spforge-0.8.32 → spforge-0.8.33}/spforge/estimator/_conditional_estimator.py +0 -0
  38. {spforge-0.8.32 → spforge-0.8.33}/spforge/estimator/_frequency_bucketing_classifier.py +0 -0
  39. {spforge-0.8.32 → spforge-0.8.33}/spforge/estimator/_granularity_estimator.py +0 -0
  40. {spforge-0.8.32 → spforge-0.8.33}/spforge/estimator/_group_by_estimator.py +0 -0
  41. {spforge-0.8.32 → spforge-0.8.33}/spforge/estimator/_ordinal_classifier.py +0 -0
  42. {spforge-0.8.32 → spforge-0.8.33}/spforge/estimator/_sklearn_enhancer_estimator.py +0 -0
  43. {spforge-0.8.32 → spforge-0.8.33}/spforge/feature_generator/__init__.py +0 -0
  44. {spforge-0.8.32 → spforge-0.8.33}/spforge/feature_generator/_base.py +0 -0
  45. {spforge-0.8.32 → spforge-0.8.33}/spforge/feature_generator/_lag.py +0 -0
  46. {spforge-0.8.32 → spforge-0.8.33}/spforge/feature_generator/_net_over_predicted.py +0 -0
  47. {spforge-0.8.32 → spforge-0.8.33}/spforge/feature_generator/_regressor_feature_generator.py +0 -0
  48. {spforge-0.8.32 → spforge-0.8.33}/spforge/feature_generator/_rolling_against_opponent.py +0 -0
  49. {spforge-0.8.32 → spforge-0.8.33}/spforge/feature_generator/_rolling_mean_binary.py +0 -0
  50. {spforge-0.8.32 → spforge-0.8.33}/spforge/feature_generator/_rolling_mean_days.py +0 -0
  51. {spforge-0.8.32 → spforge-0.8.33}/spforge/feature_generator/_rolling_window.py +0 -0
  52. {spforge-0.8.32 → spforge-0.8.33}/spforge/feature_generator/_utils.py +0 -0
  53. {spforge-0.8.32 → spforge-0.8.33}/spforge/features_generator_pipeline.py +0 -0
  54. {spforge-0.8.32 → spforge-0.8.33}/spforge/hyperparameter_tuning/__init__.py +0 -0
  55. {spforge-0.8.32 → spforge-0.8.33}/spforge/hyperparameter_tuning/_default_search_spaces.py +0 -0
  56. {spforge-0.8.32 → spforge-0.8.33}/spforge/hyperparameter_tuning/_tuner.py +0 -0
  57. {spforge-0.8.32 → spforge-0.8.33}/spforge/performance_transformers/__init__.py +0 -0
  58. {spforge-0.8.32 → spforge-0.8.33}/spforge/performance_transformers/_performance_manager.py +0 -0
  59. {spforge-0.8.32 → spforge-0.8.33}/spforge/performance_transformers/_performances_transformers.py +0 -0
  60. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/__init__.py +0 -0
  61. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/_base.py +0 -0
  62. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/_team_rating.py +0 -0
  63. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/enums.py +0 -0
  64. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/league_identifier.py +0 -0
  65. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/league_start_rating_optimizer.py +0 -0
  66. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/player_performance_predictor.py +0 -0
  67. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/start_rating_generator.py +0 -0
  68. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/team_performance_predictor.py +0 -0
  69. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/team_start_rating_generator.py +0 -0
  70. {spforge-0.8.32 → spforge-0.8.33}/spforge/ratings/utils.py +0 -0
  71. {spforge-0.8.32 → spforge-0.8.33}/spforge/scorer/__init__.py +0 -0
  72. {spforge-0.8.32 → spforge-0.8.33}/spforge/scorer/_score.py +0 -0
  73. {spforge-0.8.32 → spforge-0.8.33}/spforge/transformers/__init__.py +0 -0
  74. {spforge-0.8.32 → spforge-0.8.33}/spforge/transformers/_base.py +0 -0
  75. {spforge-0.8.32 → spforge-0.8.33}/spforge/transformers/_net_over_predicted.py +0 -0
  76. {spforge-0.8.32 → spforge-0.8.33}/spforge/transformers/_operator.py +0 -0
  77. {spforge-0.8.32 → spforge-0.8.33}/spforge/transformers/_other_transformer.py +0 -0
  78. {spforge-0.8.32 → spforge-0.8.33}/spforge/transformers/_predictor.py +0 -0
  79. {spforge-0.8.32 → spforge-0.8.33}/spforge/transformers/_simple_transformer.py +0 -0
  80. {spforge-0.8.32 → spforge-0.8.33}/spforge/transformers/_team_ratio_predictor.py +0 -0
  81. {spforge-0.8.32 → spforge-0.8.33}/spforge/utils.py +0 -0
  82. {spforge-0.8.32 → spforge-0.8.33}/spforge.egg-info/SOURCES.txt +0 -0
  83. {spforge-0.8.32 → spforge-0.8.33}/spforge.egg-info/dependency_links.txt +0 -0
  84. {spforge-0.8.32 → spforge-0.8.33}/spforge.egg-info/requires.txt +0 -0
  85. {spforge-0.8.32 → spforge-0.8.33}/spforge.egg-info/top_level.txt +0 -0
  86. {spforge-0.8.32 → spforge-0.8.33}/tests/cross_validator/test_cross_validator.py +0 -0
  87. {spforge-0.8.32 → spforge-0.8.33}/tests/distributions/test_distribution.py +0 -0
  88. {spforge-0.8.32 → spforge-0.8.33}/tests/end_to_end/test_estimator_hyperparameter_tuning.py +0 -0
  89. {spforge-0.8.32 → spforge-0.8.33}/tests/end_to_end/test_league_start_rating_optimizer.py +0 -0
  90. {spforge-0.8.32 → spforge-0.8.33}/tests/end_to_end/test_lol_player_kills.py +0 -0
  91. {spforge-0.8.32 → spforge-0.8.33}/tests/end_to_end/test_nba_player_points.py +0 -0
  92. {spforge-0.8.32 → spforge-0.8.33}/tests/end_to_end/test_nba_player_ratings_hyperparameter_tuning.py +0 -0
  93. {spforge-0.8.32 → spforge-0.8.33}/tests/end_to_end/test_nba_prediction_consistency.py +0 -0
  94. {spforge-0.8.32 → spforge-0.8.33}/tests/estimator/test_sklearn_estimator.py +0 -0
  95. {spforge-0.8.32 → spforge-0.8.33}/tests/feature_generator/test_lag.py +0 -0
  96. {spforge-0.8.32 → spforge-0.8.33}/tests/feature_generator/test_regressor_feature_generator.py +0 -0
  97. {spforge-0.8.32 → spforge-0.8.33}/tests/feature_generator/test_rolling_against_opponent.py +0 -0
  98. {spforge-0.8.32 → spforge-0.8.33}/tests/feature_generator/test_rolling_mean_binary.py +0 -0
  99. {spforge-0.8.32 → spforge-0.8.33}/tests/feature_generator/test_rolling_mean_days.py +0 -0
  100. {spforge-0.8.32 → spforge-0.8.33}/tests/feature_generator/test_rolling_window.py +0 -0
  101. {spforge-0.8.32 → spforge-0.8.33}/tests/hyperparameter_tuning/test_estimator_tuner.py +0 -0
  102. {spforge-0.8.32 → spforge-0.8.33}/tests/hyperparameter_tuning/test_rating_tuner.py +0 -0
  103. {spforge-0.8.32 → spforge-0.8.33}/tests/performance_transformers/test_performance_manager.py +0 -0
  104. {spforge-0.8.32 → spforge-0.8.33}/tests/performance_transformers/test_performances_transformers.py +0 -0
  105. {spforge-0.8.32 → spforge-0.8.33}/tests/ratings/test_player_rating_no_mutation.py +0 -0
  106. {spforge-0.8.32 → spforge-0.8.33}/tests/ratings/test_ratings_property.py +0 -0
  107. {spforge-0.8.32 → spforge-0.8.33}/tests/ratings/test_team_rating_generator.py +0 -0
  108. {spforge-0.8.32 → spforge-0.8.33}/tests/ratings/test_utils_scaled_weights.py +0 -0
  109. {spforge-0.8.32 → spforge-0.8.33}/tests/scorer/test_score.py +0 -0
  110. {spforge-0.8.32 → spforge-0.8.33}/tests/scorer/test_score_aggregation_granularity.py +0 -0
  111. {spforge-0.8.32 → spforge-0.8.33}/tests/scorer/test_scorer_name.py +0 -0
  112. {spforge-0.8.32 → spforge-0.8.33}/tests/test_autopipeline.py +0 -0
  113. {spforge-0.8.32 → spforge-0.8.33}/tests/test_autopipeline_context.py +0 -0
  114. {spforge-0.8.32 → spforge-0.8.33}/tests/test_feature_generator_pipeline.py +0 -0
  115. {spforge-0.8.32 → spforge-0.8.33}/tests/transformers/test_estimator_transformer_context.py +0 -0
  116. {spforge-0.8.32 → spforge-0.8.33}/tests/transformers/test_net_over_predicted.py +0 -0
  117. {spforge-0.8.32 → spforge-0.8.33}/tests/transformers/test_other_transformer.py +0 -0
  118. {spforge-0.8.32 → spforge-0.8.33}/tests/transformers/test_predictor_transformer.py +0 -0
  119. {spforge-0.8.32 → spforge-0.8.33}/tests/transformers/test_simple_transformer.py +0 -0
  120. {spforge-0.8.32 → spforge-0.8.33}/tests/transformers/test_team_ratio_predictor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spforge
3
- Version: 0.8.32
3
+ Version: 0.8.33
4
4
  Summary: A flexible framework for generating features, ratings, and building machine learning or other models for training and inference on sports data.
5
5
  Author-email: Mathias Holmstrøm <mathiasholmstom@gmail.com>
6
6
  License: See LICENSE file
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "spforge"
7
- version = "0.8.32"
7
+ version = "0.8.33"
8
8
  description = "A flexible framework for generating features, ratings, and building machine learning or other models for training and inference on sports data."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -595,7 +595,7 @@ class PlayerRatingGenerator(RatingGenerator):
595
595
  * float(pre_player.match_performance.participation_weight)
596
596
  )
597
597
 
598
- if team1_def_perf is None:
598
+ if team1_def_perf is None or (not self.use_off_def_split and perf_value is None):
599
599
  def_change = 0.0
600
600
  else:
601
601
  def_perf = float(team1_def_perf)
@@ -689,7 +689,7 @@ class PlayerRatingGenerator(RatingGenerator):
689
689
  * float(pre_player.match_performance.participation_weight)
690
690
  )
691
691
 
692
- if team2_def_perf is None:
692
+ if team2_def_perf is None or (not self.use_off_def_split and perf_value is None):
693
693
  def_change = 0.0
694
694
  else:
695
695
  def_perf = float(team2_def_perf)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spforge
3
- Version: 0.8.32
3
+ Version: 0.8.33
4
4
  Summary: A flexible framework for generating features, ratings, and building machine learning or other models for training and inference on sports data.
5
5
  Author-email: Mathias Holmstrøm <mathiasholmstom@gmail.com>
6
6
  License: See LICENSE file
@@ -2874,3 +2874,38 @@ def test_defense_participation_weight_backwards_compatibility(base_cn, library):
2874
2874
  assert result is not None
2875
2875
  assert len(gen._player_off_ratings) > 0
2876
2876
  assert len(gen._player_def_ratings) > 0
2877
+
2878
+
2879
+ def test_fit_transform_null_perf_with_use_off_def_split_false__no_crash(base_cn):
2880
+ """
2881
+ Regression test: null performance with use_off_def_split=False should not crash.
2882
+
2883
+ Bug: When use_off_def_split=False and a player has null performance:
2884
+ - Line 598 checks `if team1_def_perf is None` (team-level avg, not None if any played)
2885
+ - Line 605 does `def_perf = float(perf_value)` where perf_value is None
2886
+ - Crash: TypeError: float() argument must be a string or a number, not 'NoneType'
2887
+
2888
+ Fix: Check `if team1_def_perf is None or perf_value is None` to skip def update
2889
+ for players who didn't play (null performance means no rating update).
2890
+ """
2891
+ df = pl.DataFrame(
2892
+ {
2893
+ "pid": ["P1", "P2", "P3", "P4", "P1", "P2", "P3", "P4"],
2894
+ "tid": ["T1", "T1", "T2", "T2", "T1", "T1", "T2", "T2"],
2895
+ "mid": ["M1", "M1", "M1", "M1", "M2", "M2", "M2", "M2"],
2896
+ "dt": ["2024-01-01"] * 4 + ["2024-01-02"] * 4,
2897
+ "perf": [0.6, 0.4, 0.5, 0.5, None, 0.6, 0.5, 0.5], # P1 null in M2
2898
+ "pw": [1.0] * 8,
2899
+ }
2900
+ )
2901
+
2902
+ gen = PlayerRatingGenerator(
2903
+ performance_column="perf",
2904
+ column_names=base_cn,
2905
+ use_off_def_split=False, # This triggers the buggy code path
2906
+ )
2907
+
2908
+ # Should not crash - before fix this raises:
2909
+ # TypeError: float() argument must be a string or a number, not 'NoneType'
2910
+ result = gen.fit_transform(df)
2911
+ assert result is not None
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes