spforge 0.8.3__tar.gz → 0.8.4__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 (113) hide show
  1. {spforge-0.8.3/spforge.egg-info → spforge-0.8.4}/PKG-INFO +1 -1
  2. {spforge-0.8.3 → spforge-0.8.4}/pyproject.toml +1 -1
  3. {spforge-0.8.3 → spforge-0.8.4}/spforge/scorer/_score.py +2 -0
  4. {spforge-0.8.3 → spforge-0.8.4/spforge.egg-info}/PKG-INFO +1 -1
  5. {spforge-0.8.3 → spforge-0.8.4}/tests/scorer/test_score.py +123 -0
  6. {spforge-0.8.3 → spforge-0.8.4}/LICENSE +0 -0
  7. {spforge-0.8.3 → spforge-0.8.4}/MANIFEST.in +0 -0
  8. {spforge-0.8.3 → spforge-0.8.4}/README.md +0 -0
  9. {spforge-0.8.3 → spforge-0.8.4}/examples/__init__.py +0 -0
  10. {spforge-0.8.3 → spforge-0.8.4}/examples/game_level_example.py +0 -0
  11. {spforge-0.8.3 → spforge-0.8.4}/examples/lol/__init__.py +0 -0
  12. {spforge-0.8.3 → spforge-0.8.4}/examples/lol/data/__init__.py +0 -0
  13. {spforge-0.8.3 → spforge-0.8.4}/examples/lol/data/subsample_lol_data.parquet +0 -0
  14. {spforge-0.8.3 → spforge-0.8.4}/examples/lol/data/utils.py +0 -0
  15. {spforge-0.8.3 → spforge-0.8.4}/examples/lol/pipeline_transformer_example.py +0 -0
  16. {spforge-0.8.3 → spforge-0.8.4}/examples/nba/__init__.py +0 -0
  17. {spforge-0.8.3 → spforge-0.8.4}/examples/nba/cross_validation_example.py +0 -0
  18. {spforge-0.8.3 → spforge-0.8.4}/examples/nba/data/__init__.py +0 -0
  19. {spforge-0.8.3 → spforge-0.8.4}/examples/nba/data/game_player_subsample.parquet +0 -0
  20. {spforge-0.8.3 → spforge-0.8.4}/examples/nba/data/utils.py +0 -0
  21. {spforge-0.8.3 → spforge-0.8.4}/examples/nba/feature_engineering_example.py +0 -0
  22. {spforge-0.8.3 → spforge-0.8.4}/examples/nba/game_winner_example.py +0 -0
  23. {spforge-0.8.3 → spforge-0.8.4}/examples/nba/predictor_transformers_example.py +0 -0
  24. {spforge-0.8.3 → spforge-0.8.4}/setup.cfg +0 -0
  25. {spforge-0.8.3 → spforge-0.8.4}/spforge/__init__.py +0 -0
  26. {spforge-0.8.3 → spforge-0.8.4}/spforge/autopipeline.py +0 -0
  27. {spforge-0.8.3 → spforge-0.8.4}/spforge/base_feature_generator.py +0 -0
  28. {spforge-0.8.3 → spforge-0.8.4}/spforge/cross_validator/__init__.py +0 -0
  29. {spforge-0.8.3 → spforge-0.8.4}/spforge/cross_validator/_base.py +0 -0
  30. {spforge-0.8.3 → spforge-0.8.4}/spforge/cross_validator/cross_validator.py +0 -0
  31. {spforge-0.8.3 → spforge-0.8.4}/spforge/data_structures.py +0 -0
  32. {spforge-0.8.3 → spforge-0.8.4}/spforge/distributions/__init__.py +0 -0
  33. {spforge-0.8.3 → spforge-0.8.4}/spforge/distributions/_negative_binomial_estimator.py +0 -0
  34. {spforge-0.8.3 → spforge-0.8.4}/spforge/distributions/_normal_distribution_predictor.py +0 -0
  35. {spforge-0.8.3 → spforge-0.8.4}/spforge/distributions/_student_t_distribution_estimator.py +0 -0
  36. {spforge-0.8.3 → spforge-0.8.4}/spforge/estimator/__init__.py +0 -0
  37. {spforge-0.8.3 → spforge-0.8.4}/spforge/estimator/_conditional_estimator.py +0 -0
  38. {spforge-0.8.3 → spforge-0.8.4}/spforge/estimator/_frequency_bucketing_classifier.py +0 -0
  39. {spforge-0.8.3 → spforge-0.8.4}/spforge/estimator/_granularity_estimator.py +0 -0
  40. {spforge-0.8.3 → spforge-0.8.4}/spforge/estimator/_group_by_estimator.py +0 -0
  41. {spforge-0.8.3 → spforge-0.8.4}/spforge/estimator/_ordinal_classifier.py +0 -0
  42. {spforge-0.8.3 → spforge-0.8.4}/spforge/estimator/_sklearn_enhancer_estimator.py +0 -0
  43. {spforge-0.8.3 → spforge-0.8.4}/spforge/feature_generator/__init__.py +0 -0
  44. {spforge-0.8.3 → spforge-0.8.4}/spforge/feature_generator/_base.py +0 -0
  45. {spforge-0.8.3 → spforge-0.8.4}/spforge/feature_generator/_lag.py +0 -0
  46. {spforge-0.8.3 → spforge-0.8.4}/spforge/feature_generator/_net_over_predicted.py +0 -0
  47. {spforge-0.8.3 → spforge-0.8.4}/spforge/feature_generator/_regressor_feature_generator.py +0 -0
  48. {spforge-0.8.3 → spforge-0.8.4}/spforge/feature_generator/_rolling_against_opponent.py +0 -0
  49. {spforge-0.8.3 → spforge-0.8.4}/spforge/feature_generator/_rolling_mean_binary.py +0 -0
  50. {spforge-0.8.3 → spforge-0.8.4}/spforge/feature_generator/_rolling_mean_days.py +0 -0
  51. {spforge-0.8.3 → spforge-0.8.4}/spforge/feature_generator/_rolling_window.py +0 -0
  52. {spforge-0.8.3 → spforge-0.8.4}/spforge/feature_generator/_utils.py +0 -0
  53. {spforge-0.8.3 → spforge-0.8.4}/spforge/features_generator_pipeline.py +0 -0
  54. {spforge-0.8.3 → spforge-0.8.4}/spforge/hyperparameter_tuning/__init__.py +0 -0
  55. {spforge-0.8.3 → spforge-0.8.4}/spforge/hyperparameter_tuning/_default_search_spaces.py +0 -0
  56. {spforge-0.8.3 → spforge-0.8.4}/spforge/hyperparameter_tuning/_tuner.py +0 -0
  57. {spforge-0.8.3 → spforge-0.8.4}/spforge/performance_transformers/__init__.py +0 -0
  58. {spforge-0.8.3 → spforge-0.8.4}/spforge/performance_transformers/_performance_manager.py +0 -0
  59. {spforge-0.8.3 → spforge-0.8.4}/spforge/performance_transformers/_performances_transformers.py +0 -0
  60. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/__init__.py +0 -0
  61. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/_base.py +0 -0
  62. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/_player_rating.py +0 -0
  63. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/_team_rating.py +0 -0
  64. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/enums.py +0 -0
  65. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/league_identifier.py +0 -0
  66. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/player_performance_predictor.py +0 -0
  67. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/start_rating_generator.py +0 -0
  68. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/team_performance_predictor.py +0 -0
  69. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/team_start_rating_generator.py +0 -0
  70. {spforge-0.8.3 → spforge-0.8.4}/spforge/ratings/utils.py +0 -0
  71. {spforge-0.8.3 → spforge-0.8.4}/spforge/scorer/__init__.py +0 -0
  72. {spforge-0.8.3 → spforge-0.8.4}/spforge/transformers/__init__.py +0 -0
  73. {spforge-0.8.3 → spforge-0.8.4}/spforge/transformers/_base.py +0 -0
  74. {spforge-0.8.3 → spforge-0.8.4}/spforge/transformers/_net_over_predicted.py +0 -0
  75. {spforge-0.8.3 → spforge-0.8.4}/spforge/transformers/_operator.py +0 -0
  76. {spforge-0.8.3 → spforge-0.8.4}/spforge/transformers/_other_transformer.py +0 -0
  77. {spforge-0.8.3 → spforge-0.8.4}/spforge/transformers/_predictor.py +0 -0
  78. {spforge-0.8.3 → spforge-0.8.4}/spforge/transformers/_simple_transformer.py +0 -0
  79. {spforge-0.8.3 → spforge-0.8.4}/spforge/transformers/_team_ratio_predictor.py +0 -0
  80. {spforge-0.8.3 → spforge-0.8.4}/spforge/utils.py +0 -0
  81. {spforge-0.8.3 → spforge-0.8.4}/spforge.egg-info/SOURCES.txt +0 -0
  82. {spforge-0.8.3 → spforge-0.8.4}/spforge.egg-info/dependency_links.txt +0 -0
  83. {spforge-0.8.3 → spforge-0.8.4}/spforge.egg-info/requires.txt +0 -0
  84. {spforge-0.8.3 → spforge-0.8.4}/spforge.egg-info/top_level.txt +0 -0
  85. {spforge-0.8.3 → spforge-0.8.4}/tests/cross_validator/test_cross_validator.py +0 -0
  86. {spforge-0.8.3 → spforge-0.8.4}/tests/distributions/test_distribution.py +0 -0
  87. {spforge-0.8.3 → spforge-0.8.4}/tests/end_to_end/test_lol_player_kills.py +0 -0
  88. {spforge-0.8.3 → spforge-0.8.4}/tests/end_to_end/test_nba_player_points.py +0 -0
  89. {spforge-0.8.3 → spforge-0.8.4}/tests/end_to_end/test_nba_player_ratings_hyperparameter_tuning.py +0 -0
  90. {spforge-0.8.3 → spforge-0.8.4}/tests/end_to_end/test_nba_prediction_consistency.py +0 -0
  91. {spforge-0.8.3 → spforge-0.8.4}/tests/estimator/test_sklearn_estimator.py +0 -0
  92. {spforge-0.8.3 → spforge-0.8.4}/tests/feature_generator/test_lag.py +0 -0
  93. {spforge-0.8.3 → spforge-0.8.4}/tests/feature_generator/test_regressor_feature_generator.py +0 -0
  94. {spforge-0.8.3 → spforge-0.8.4}/tests/feature_generator/test_rolling_against_opponent.py +0 -0
  95. {spforge-0.8.3 → spforge-0.8.4}/tests/feature_generator/test_rolling_mean_binary.py +0 -0
  96. {spforge-0.8.3 → spforge-0.8.4}/tests/feature_generator/test_rolling_mean_days.py +0 -0
  97. {spforge-0.8.3 → spforge-0.8.4}/tests/feature_generator/test_rolling_window.py +0 -0
  98. {spforge-0.8.3 → spforge-0.8.4}/tests/hyperparameter_tuning/test_rating_tuner.py +0 -0
  99. {spforge-0.8.3 → spforge-0.8.4}/tests/performance_transformers/test_performance_manager.py +0 -0
  100. {spforge-0.8.3 → spforge-0.8.4}/tests/performance_transformers/test_performances_transformers.py +0 -0
  101. {spforge-0.8.3 → spforge-0.8.4}/tests/ratings/test_player_rating_generator.py +0 -0
  102. {spforge-0.8.3 → spforge-0.8.4}/tests/ratings/test_ratings_property.py +0 -0
  103. {spforge-0.8.3 → spforge-0.8.4}/tests/ratings/test_team_rating_generator.py +0 -0
  104. {spforge-0.8.3 → spforge-0.8.4}/tests/scorer/test_score_aggregation_granularity.py +0 -0
  105. {spforge-0.8.3 → spforge-0.8.4}/tests/test_autopipeline.py +0 -0
  106. {spforge-0.8.3 → spforge-0.8.4}/tests/test_autopipeline_context.py +0 -0
  107. {spforge-0.8.3 → spforge-0.8.4}/tests/test_feature_generator_pipeline.py +0 -0
  108. {spforge-0.8.3 → spforge-0.8.4}/tests/transformers/test_estimator_transformer_context.py +0 -0
  109. {spforge-0.8.3 → spforge-0.8.4}/tests/transformers/test_net_over_predicted.py +0 -0
  110. {spforge-0.8.3 → spforge-0.8.4}/tests/transformers/test_other_transformer.py +0 -0
  111. {spforge-0.8.3 → spforge-0.8.4}/tests/transformers/test_predictor_transformer.py +0 -0
  112. {spforge-0.8.3 → spforge-0.8.4}/tests/transformers/test_simple_transformer.py +0 -0
  113. {spforge-0.8.3 → spforge-0.8.4}/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.3
3
+ Version: 0.8.4
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.3"
7
+ version = "0.8.4"
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"
@@ -1391,4 +1391,6 @@ class ThresholdEventScorer(BaseScorer):
1391
1391
  df, self.outcome_column, labels, self.naive_granularity
1392
1392
  )
1393
1393
  naive_score = self._score_with_probabilities(df, naive_list)
1394
+ if isinstance(score, dict) and isinstance(naive_score, dict):
1395
+ return {k: naive_score[k] - score[k] for k in score.keys()}
1394
1396
  return float(naive_score - score)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: spforge
3
- Version: 0.8.3
3
+ Version: 0.8.4
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
@@ -1892,6 +1892,129 @@ def test_pwmse__accepts_ndarray_predictions(df_type):
1892
1892
  assert score >= 0
1893
1893
 
1894
1894
 
1895
+ # ============================================================================
1896
+ # ThresholdEventScorer with granularity and compare_to_naive Tests
1897
+ # ============================================================================
1898
+
1899
+
1900
+ @pytest.mark.parametrize("df_type", [pl.DataFrame, pd.DataFrame])
1901
+ def test_threshold_event_scorer__granularity_with_compare_to_naive(df_type):
1902
+ """ThresholdEventScorer fails when combining compare_to_naive with granularity.
1903
+
1904
+ Bug: When granularity is set, binary_scorer.score() returns a dict, but
1905
+ the naive comparison tries to do dict - dict which fails with:
1906
+ 'unsupported operand type(s) for -: 'dict' and 'dict''
1907
+ """
1908
+ df = create_dataframe(
1909
+ df_type,
1910
+ {
1911
+ "qtr": [1, 1, 1, 2, 2, 2],
1912
+ "dist": [
1913
+ [0.1, 0.2, 0.3, 0.4],
1914
+ [0.2, 0.3, 0.3, 0.2],
1915
+ [0.3, 0.4, 0.2, 0.1],
1916
+ [0.4, 0.3, 0.2, 0.1],
1917
+ [0.1, 0.1, 0.4, 0.4],
1918
+ [0.2, 0.2, 0.3, 0.3],
1919
+ ],
1920
+ "ydstogo": [2.0, 3.0, 1.0, 2.0, 1.0, 3.0],
1921
+ "rush_yards": [3, 2, 0, 1, 2, 4],
1922
+ },
1923
+ )
1924
+
1925
+ scorer = ThresholdEventScorer(
1926
+ dist_column="dist",
1927
+ threshold_column="ydstogo",
1928
+ outcome_column="rush_yards",
1929
+ labels=[0, 1, 2, 3],
1930
+ compare_to_naive=True,
1931
+ granularity=["qtr"],
1932
+ )
1933
+
1934
+ result = scorer.score(df)
1935
+
1936
+ assert isinstance(result, dict)
1937
+ assert len(result) == 2
1938
+ assert (1,) in result
1939
+ assert (2,) in result
1940
+ assert all(isinstance(v, float) for v in result.values())
1941
+
1942
+
1943
+ @pytest.mark.parametrize("df_type", [pl.DataFrame, pd.DataFrame])
1944
+ def test_threshold_event_scorer__granularity_with_compare_to_naive_and_naive_granularity(df_type):
1945
+ """ThresholdEventScorer with both granularity and naive_granularity."""
1946
+ df = create_dataframe(
1947
+ df_type,
1948
+ {
1949
+ "qtr": [1, 1, 1, 2, 2, 2],
1950
+ "team": ["A", "A", "B", "A", "B", "B"],
1951
+ "dist": [
1952
+ [0.1, 0.2, 0.3, 0.4],
1953
+ [0.2, 0.3, 0.3, 0.2],
1954
+ [0.3, 0.4, 0.2, 0.1],
1955
+ [0.4, 0.3, 0.2, 0.1],
1956
+ [0.1, 0.1, 0.4, 0.4],
1957
+ [0.2, 0.2, 0.3, 0.3],
1958
+ ],
1959
+ "ydstogo": [2.0, 3.0, 1.0, 2.0, 1.0, 3.0],
1960
+ "rush_yards": [3, 2, 0, 1, 2, 4],
1961
+ },
1962
+ )
1963
+
1964
+ scorer = ThresholdEventScorer(
1965
+ dist_column="dist",
1966
+ threshold_column="ydstogo",
1967
+ outcome_column="rush_yards",
1968
+ labels=[0, 1, 2, 3],
1969
+ compare_to_naive=True,
1970
+ naive_granularity=["team"],
1971
+ granularity=["qtr"],
1972
+ )
1973
+
1974
+ result = scorer.score(df)
1975
+
1976
+ assert isinstance(result, dict)
1977
+ assert len(result) == 2
1978
+ assert (1,) in result
1979
+ assert (2,) in result
1980
+ assert all(isinstance(v, float) for v in result.values())
1981
+
1982
+
1983
+ @pytest.mark.parametrize("df_type", [pl.DataFrame, pd.DataFrame])
1984
+ def test_threshold_event_scorer__multi_column_granularity_with_compare_to_naive(df_type):
1985
+ """ThresholdEventScorer with multi-column granularity and compare_to_naive."""
1986
+ df = create_dataframe(
1987
+ df_type,
1988
+ {
1989
+ "qtr": [1, 1, 2, 2],
1990
+ "half": [1, 1, 2, 2],
1991
+ "dist": [
1992
+ [0.1, 0.2, 0.3, 0.4],
1993
+ [0.2, 0.3, 0.3, 0.2],
1994
+ [0.4, 0.3, 0.2, 0.1],
1995
+ [0.1, 0.1, 0.4, 0.4],
1996
+ ],
1997
+ "ydstogo": [2.0, 3.0, 2.0, 1.0],
1998
+ "rush_yards": [3, 2, 1, 2],
1999
+ },
2000
+ )
2001
+
2002
+ scorer = ThresholdEventScorer(
2003
+ dist_column="dist",
2004
+ threshold_column="ydstogo",
2005
+ outcome_column="rush_yards",
2006
+ labels=[0, 1, 2, 3],
2007
+ compare_to_naive=True,
2008
+ granularity=["qtr", "half"],
2009
+ )
2010
+
2011
+ result = scorer.score(df)
2012
+
2013
+ assert isinstance(result, dict)
2014
+ assert len(result) == 2
2015
+ assert all(isinstance(v, float) for v in result.values())
2016
+
2017
+
1895
2018
  @pytest.mark.parametrize("df_type", [pl.DataFrame, pd.DataFrame])
1896
2019
  def test_all_scorers_handle_all_nan_targets(df_type):
1897
2020
  """All scorers handle case where all targets are NaN"""
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes