sovai 0.2.72__tar.gz → 0.2.74__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.
Files changed (106) hide show
  1. {sovai-0.2.72 → sovai-0.2.74}/PKG-INFO +1 -1
  2. {sovai-0.2.72 → sovai-0.2.74}/pyproject.toml +1 -1
  3. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/signal_evaluation.py +17 -7
  4. {sovai-0.2.72 → sovai-0.2.74}/LICENSE +0 -0
  5. {sovai-0.2.72 → sovai-0.2.74}/README.md +0 -0
  6. {sovai-0.2.72 → sovai-0.2.74}/data/codes.parq +0 -0
  7. {sovai-0.2.72 → sovai-0.2.74}/data/tickers.parq +0 -0
  8. {sovai-0.2.72 → sovai-0.2.74}/sovai/.DS_Store +0 -0
  9. {sovai-0.2.72 → sovai-0.2.74}/sovai/__init__.py +0 -0
  10. {sovai-0.2.72 → sovai-0.2.74}/sovai/api_config.py +0 -0
  11. {sovai-0.2.72 → sovai-0.2.74}/sovai/assets/dropdown.css +0 -0
  12. {sovai-0.2.72 → sovai-0.2.74}/sovai/assets/features_mapping.parq +0 -0
  13. {sovai-0.2.72 → sovai-0.2.74}/sovai/assets/tickers.parq +0 -0
  14. {sovai-0.2.72 → sovai-0.2.74}/sovai/basic_auth.py +0 -0
  15. {sovai-0.2.72 → sovai-0.2.74}/sovai/computations/__init__.py +0 -0
  16. {sovai-0.2.72 → sovai-0.2.74}/sovai/computations/functions.py +0 -0
  17. {sovai-0.2.72 → sovai-0.2.74}/sovai/errors/__init__.py +0 -0
  18. {sovai-0.2.72 → sovai-0.2.74}/sovai/errors/sovai_errors.py +0 -0
  19. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/__init__.py +0 -0
  20. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/anomalies.py +0 -0
  21. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/ask_df_llm.py +0 -0
  22. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/change_point_generator copy.py +0 -0
  23. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/change_point_generator.py +0 -0
  24. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/clustering.py +0 -0
  25. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/core_kshape.py +0 -0
  26. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/cum_sum_torch.py +0 -0
  27. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/cusum.py +0 -0
  28. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/dimensionality_reduction.py +0 -0
  29. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/feature_extraction.py +0 -0
  30. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/feature_importance.py +0 -0
  31. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/feature_neutralizer.py +0 -0
  32. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/filter_df.py +0 -0
  33. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/fractional_differencing.py +0 -0
  34. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/nowcasting.py +0 -0
  35. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/pairwise.py +0 -0
  36. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/pandas_extensions.py +0 -0
  37. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/parallel_functions.py +0 -0
  38. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/pfa_feature_selector.py +0 -0
  39. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/regime_change.py +0 -0
  40. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/regime_change_pca.py +0 -0
  41. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/shapley_global_importance.py +0 -0
  42. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/shapley_importance.py +0 -0
  43. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/technical_indicators.py +0 -0
  44. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/time_decomposition.py +0 -0
  45. {sovai-0.2.72 → sovai-0.2.74}/sovai/extensions/weight_optimization.py +0 -0
  46. {sovai-0.2.72 → sovai-0.2.74}/sovai/get_compute.py +0 -0
  47. {sovai-0.2.72 → sovai-0.2.74}/sovai/get_data copy 2.py +0 -0
  48. {sovai-0.2.72 → sovai-0.2.74}/sovai/get_data copy.py +0 -0
  49. {sovai-0.2.72 → sovai-0.2.74}/sovai/get_data.py +0 -0
  50. {sovai-0.2.72 → sovai-0.2.74}/sovai/get_plots.py +0 -0
  51. {sovai-0.2.72 → sovai-0.2.74}/sovai/get_reports.py +0 -0
  52. {sovai-0.2.72 → sovai-0.2.74}/sovai/get_tools.py +0 -0
  53. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/__init__.py +0 -0
  54. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/accounting/__init__.py +0 -0
  55. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/accounting/accounting_plots.py +0 -0
  56. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/allocation/__init__.py +0 -0
  57. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/allocation/allocation_plots.py +0 -0
  58. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/bankruptcy/__init__.py +0 -0
  59. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/bankruptcy/bankruptcy_plots.py +0 -0
  60. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/breakout/__init__.py +0 -0
  61. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/breakout/breakout_plots.py +0 -0
  62. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/corp_risk/__init__.py +0 -0
  63. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/corp_risk/corp_risk_plots.py +0 -0
  64. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/earnings_surprise/__init__.py +0 -0
  65. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/earnings_surprise/earnings_surprise_plots.py +0 -0
  66. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/insider/__init__.py +0 -0
  67. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/insider/insider_plots.py +0 -0
  68. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/institutional/__init__.py +0 -0
  69. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/institutional/institutional_plots.py +0 -0
  70. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/news/__init__.py +0 -0
  71. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/news/news_plots.py +0 -0
  72. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/ratios/__init__.py +0 -0
  73. {sovai-0.2.72 → sovai-0.2.74}/sovai/plots/ratios/ratios_plots.py +0 -0
  74. {sovai-0.2.72 → sovai-0.2.74}/sovai/reports/accounting/__init__.py +0 -0
  75. {sovai-0.2.72 → sovai-0.2.74}/sovai/reports/accounting/accounting_balance_sheet.py +0 -0
  76. {sovai-0.2.72 → sovai-0.2.74}/sovai/reports/bankruptcy/__init__.py +0 -0
  77. {sovai-0.2.72 → sovai-0.2.74}/sovai/reports/bankruptcy/bankruptcy_monthly_top.py +0 -0
  78. {sovai-0.2.72 → sovai-0.2.74}/sovai/reports/general/__init__.py +0 -0
  79. {sovai-0.2.72 → sovai-0.2.74}/sovai/reports/general/general_plots.py +0 -0
  80. {sovai-0.2.72 → sovai-0.2.74}/sovai/reports/news/__inti__.py +0 -0
  81. {sovai-0.2.72 → sovai-0.2.74}/sovai/reports/news/news_econometric_analysis.py +0 -0
  82. {sovai-0.2.72 → sovai-0.2.74}/sovai/studies/nowcasting.py +0 -0
  83. {sovai-0.2.72 → sovai-0.2.74}/sovai/token_auth.py +0 -0
  84. {sovai-0.2.72 → sovai-0.2.74}/sovai/tools/authentication/__init__.py +0 -0
  85. {sovai-0.2.72 → sovai-0.2.74}/sovai/tools/authentication/authentication.py +0 -0
  86. {sovai-0.2.72 → sovai-0.2.74}/sovai/tools/sec/__init__.py +0 -0
  87. {sovai-0.2.72 → sovai-0.2.74}/sovai/tools/sec/graphs.py +0 -0
  88. {sovai-0.2.72 → sovai-0.2.74}/sovai/tools/sec/llm_code_generator.py +0 -0
  89. {sovai-0.2.72 → sovai-0.2.74}/sovai/tools/sec/sec_10_k_8_k_filings.py +0 -0
  90. {sovai-0.2.72 → sovai-0.2.74}/sovai/tools/sec/sec_edgar_search.py +0 -0
  91. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/__init__.py +0 -0
  92. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/client_side.py +0 -0
  93. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/client_side_s3.py +0 -0
  94. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/client_side_s3_part_high.py +0 -0
  95. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/converter.py +0 -0
  96. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/datetime_formats.py +0 -0
  97. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/file_management copy.py +0 -0
  98. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/file_management.py +0 -0
  99. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/get_tickers.py +0 -0
  100. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/helpers.py +0 -0
  101. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/pandas_extensions copy.py +0 -0
  102. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/plot.py +0 -0
  103. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/port_manager copy.py +0 -0
  104. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/port_manager.py +0 -0
  105. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/stream.py +0 -0
  106. {sovai-0.2.72 → sovai-0.2.74}/sovai/utils/verbose_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sovai
3
- Version: 0.2.72
3
+ Version: 0.2.74
4
4
  Summary: python for asset management
5
5
  License: Proprietary License
6
6
  License-File: LICENSE
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [project]
6
6
  name = "sovai"
7
- version = "0.2.72"
7
+ version = "0.2.74"
8
8
  description = "python for asset management"
9
9
  authors = [
10
10
  {name = "Derek Snow", email = "d.snow@outlook.com"}
@@ -666,8 +666,10 @@ def stress_plotting(portfolio_returns):
666
666
  event_avg_returns = {}
667
667
  for event, (start, end) in stress_events.items():
668
668
  returns = get_event_returns(portfolio_returns, start, end)
669
- event_returns[event] = returns
670
- event_avg_returns[event] = returns.iloc[-1] / len(returns)
669
+ # Only include events with data
670
+ if not returns.empty and len(returns) > 0:
671
+ event_returns[event] = returns
672
+ event_avg_returns[event] = returns.iloc[-1] / len(returns)
671
673
 
672
674
  # Create a color map for events
673
675
  color_map = px.colors.qualitative.Plotly
@@ -1194,6 +1196,13 @@ def draw_down_statistics(portfolio_returns):
1194
1196
  # Existing preprocessing code remains the same
1195
1197
  portfolio_returns.index = pd.to_datetime(portfolio_returns.index)
1196
1198
  portfolio_returns = portfolio_returns.sort_index()
1199
+
1200
+ # Find the first valid index (non-NaN and non-zero)
1201
+ # This filters out leading zeros/empty data that might exist in the structure
1202
+ valid_mask = (portfolio_returns.notna()) & (portfolio_returns.abs() > 1e-10)
1203
+ if valid_mask.any():
1204
+ first_valid_idx = portfolio_returns.index[valid_mask.argmax()]
1205
+ portfolio_returns = portfolio_returns.loc[first_valid_idx:]
1197
1206
 
1198
1207
  start_date = portfolio_returns.index[0]
1199
1208
  while start_date.weekday() != 4:
@@ -1460,13 +1469,14 @@ def calculate_turnover(df, mask):
1460
1469
 
1461
1470
 
1462
1471
  def turnover_plot(df_balance, rebalance_mask):
1472
+ # Find the first valid index in the input data
1473
+ first_valid_idx = _get_first_valid_index(df_balance)
1474
+ if first_valid_idx is not None:
1475
+ df_balance = df_balance.loc[first_valid_idx:]
1476
+ rebalance_mask = rebalance_mask.loc[first_valid_idx:]
1477
+
1463
1478
  # Calculate turnover percentages
1464
1479
  turnover_df = calculate_turnover(df_balance, rebalance_mask)
1465
-
1466
- # Find the first valid index instead of using hardcoded date
1467
- first_valid_idx = _get_first_valid_index(turnover_df)
1468
- if first_valid_idx is not None:
1469
- turnover_df = turnover_df.loc[first_valid_idx:]
1470
1480
 
1471
1481
  # Find the max and min values
1472
1482
  y_max = max(
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes