sovai 0.2.67__tar.gz → 0.2.68__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.
- {sovai-0.2.67 → sovai-0.2.68}/PKG-INFO +1 -1
- {sovai-0.2.67 → sovai-0.2.68}/pyproject.toml +1 -1
- {sovai-0.2.67 → sovai-0.2.68}/sovai/__init__.py +1 -1
- {sovai-0.2.67 → sovai-0.2.68}/sovai/get_data.py +1 -0
- sovai-0.2.68/sovai/utils/file_management.py +58 -0
- {sovai-0.2.67 → sovai-0.2.68}/LICENSE +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/README.md +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/data/codes.parq +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/data/tickers.parq +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/.DS_Store +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/api_config.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/assets/dropdown.css +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/assets/features_mapping.parq +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/assets/tickers.parq +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/basic_auth.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/computations/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/computations/functions.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/errors/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/errors/sovai_errors.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/anomalies.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/ask_df_llm.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/change_point_generator copy.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/change_point_generator.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/clustering.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/core_kshape.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/cum_sum_torch.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/cusum.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/dimensionality_reduction.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/feature_extraction.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/feature_importance.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/feature_neutralizer.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/filter_df.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/fractional_differencing.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/nowcasting.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/pairwise.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/pandas_extensions.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/parallel_functions.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/pfa_feature_selector.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/regime_change.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/regime_change_pca.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/shapley_global_importance.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/shapley_importance.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/signal_evaluation.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/technical_indicators.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/time_decomposition.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/extensions/weight_optimization.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/get_compute.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/get_data copy 2.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/get_data copy.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/get_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/get_reports.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/get_tools.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/accounting/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/accounting/accounting_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/allocation/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/allocation/allocation_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/bankruptcy/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/bankruptcy/bankruptcy_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/breakout/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/breakout/breakout_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/corp_risk/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/corp_risk/corp_risk_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/earnings_surprise/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/earnings_surprise/earnings_surprise_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/insider/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/insider/insider_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/institutional/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/institutional/institutional_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/news/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/news/news_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/ratios/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/plots/ratios/ratios_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/reports/accounting/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/reports/accounting/accounting_balance_sheet.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/reports/bankruptcy/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/reports/bankruptcy/bankruptcy_monthly_top.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/reports/general/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/reports/general/general_plots.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/reports/news/__inti__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/reports/news/news_econometric_analysis.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/studies/nowcasting.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/token_auth.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/tools/authentication/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/tools/authentication/authentication.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/tools/sec/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/tools/sec/graphs.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/tools/sec/llm_code_generator.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/tools/sec/sec_10_k_8_k_filings.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/tools/sec/sec_edgar_search.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/__init__.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/client_side.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/client_side_s3.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/client_side_s3_part_high.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/converter.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/datetime_formats.py +0 -0
- /sovai-0.2.67/sovai/utils/file_management.py → /sovai-0.2.68/sovai/utils/file_management copy.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/get_tickers.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/helpers.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/pandas_extensions copy.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/plot.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/port_manager copy.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/port_manager.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/stream.py +0 -0
- {sovai-0.2.67 → sovai-0.2.68}/sovai/utils/verbose_utils.py +0 -0
|
@@ -993,6 +993,7 @@ def _get_ticker_codes_df():
|
|
|
993
993
|
return pd.read_parquet("data/codes.parq")
|
|
994
994
|
except Exception as e:
|
|
995
995
|
logger.error(f"Failed to load ticker mapping data (data/codes.parq): {e}")
|
|
996
|
+
|
|
996
997
|
# Consider if this should raise a more specific error or if ValueError is appropriate
|
|
997
998
|
raise ValueError(f"Cannot perform ticker mapping due to data loading failure: {e}")
|
|
998
999
|
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import os
|
|
3
|
+
import time
|
|
4
|
+
from datetime import timedelta
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
|
|
7
|
+
# Cache configuration
|
|
8
|
+
CACHE_DIR = Path("data")
|
|
9
|
+
CACHE_TTL_SECONDS = timedelta(days=7).total_seconds()
|
|
10
|
+
|
|
11
|
+
def _get_file_age_seconds(file_path: Path) -> float | None:
|
|
12
|
+
"""Return file age in seconds, or None if it doesn't exist."""
|
|
13
|
+
try:
|
|
14
|
+
return time.time() - file_path.stat().st_mtime
|
|
15
|
+
except (FileNotFoundError, OSError):
|
|
16
|
+
return None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _cached_parquet(url: str, filename: str) -> pd.DataFrame:
|
|
20
|
+
"""
|
|
21
|
+
Fetch a Parquet file from a URL into a local cache directory if missing or expired,
|
|
22
|
+
then load and return it as a pandas DataFrame.
|
|
23
|
+
"""
|
|
24
|
+
CACHE_DIR.mkdir(parents=True, exist_ok=True)
|
|
25
|
+
path = CACHE_DIR / filename
|
|
26
|
+
age = _get_file_age_seconds(path)
|
|
27
|
+
if age is None or age > CACHE_TTL_SECONDS:
|
|
28
|
+
print(f"Downloading {url} to {path}")
|
|
29
|
+
df = pd.read_parquet(url)
|
|
30
|
+
df.to_parquet(path)
|
|
31
|
+
else:
|
|
32
|
+
print(f"Loading from cache: {path}")
|
|
33
|
+
df = pd.read_parquet(path)
|
|
34
|
+
return df
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def get_ticker_meta() -> pd.DataFrame:
|
|
38
|
+
"""Return the tickers metadata, cached for 7 days."""
|
|
39
|
+
return _cached_parquet(
|
|
40
|
+
url="https://storage.googleapis.com/sovai-public/accounting/tickers_transformed.parq",
|
|
41
|
+
filename="tickers.parq"
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def get_codes_meta() -> pd.DataFrame:
|
|
46
|
+
"""Return the codes metadata, cached for 7 days."""
|
|
47
|
+
return _cached_parquet(
|
|
48
|
+
url="https://storage.googleapis.com/sovai-public/sovai-master/output/df_codes.parquet",
|
|
49
|
+
filename="codes.parq"
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def update_data_files():
|
|
54
|
+
"""
|
|
55
|
+
Manually pre-warm both ticker and code caches.
|
|
56
|
+
"""
|
|
57
|
+
get_ticker_meta()
|
|
58
|
+
get_codes_meta()
|
|
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
|
|
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
|
|
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
|
|
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
|
/sovai-0.2.67/sovai/utils/file_management.py → /sovai-0.2.68/sovai/utils/file_management copy.py
RENAMED
|
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
|