dfm-python 0.5.3__tar.gz → 0.5.52__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.
- {dfm_python-0.5.3 → dfm_python-0.5.52}/MANIFEST.in +4 -4
- {dfm_python-0.5.3 → dfm_python-0.5.52}/PKG-INFO +97 -3
- {dfm_python-0.5.3 → dfm_python-0.5.52}/README.md +96 -1
- {dfm_python-0.5.3 → dfm_python-0.5.52}/pyproject.toml +11 -1
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/__init__.py +11 -8
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/config/adapter.py +34 -56
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/config/schema.py +222 -379
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/data/utils.py +10 -12
- dfm_python-0.5.52/src/dfm_python/decoder/__init__.py +14 -0
- dfm_python-0.5.52/src/dfm_python/decoder/linear.py +68 -0
- dfm_python-0.5.52/src/dfm_python/decoder/mlp.py +130 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/encoder/__init__.py +7 -6
- dfm_python-0.5.3/src/dfm_python/encoder/vae.py → dfm_python-0.5.52/src/dfm_python/encoder/autoencoder.py +32 -182
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/lightning/__init__.py +6 -6
- dfm_python-0.5.52/src/dfm_python/lightning/ddfm_dm.py +417 -0
- dfm_python-0.5.52/src/dfm_python/lightning/dfm_dm.py +379 -0
- dfm_python-0.5.52/src/dfm_python/lightning/utils.py +516 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/models/__init__.py +3 -4
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/models/base.py +73 -8
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/models/ddfm.py +391 -231
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/models/dfm.py +77 -29
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/trainer/__init__.py +2 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/trainer/ddfm.py +2 -2
- dfm_python-0.5.3/src/dfm_python/models/mcmc.py → dfm_python-0.5.52/src/dfm_python/trainer/denoising.py +50 -52
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/utils/__init__.py +3 -3
- dfm_python-0.5.52/src/test/test_datamodule.py +554 -0
- dfm_python-0.5.52/src/test/test_decoder.py +372 -0
- dfm_python-0.5.52/src/test/test_encoder.py +461 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/tutorial/tutorial_finance_ddfm.py +41 -34
- {dfm_python-0.5.3 → dfm_python-0.5.52}/tutorial/tutorial_finance_dfm.py +10 -4
- {dfm_python-0.5.3 → dfm_python-0.5.52}/tutorial/tutorial_macro_ddfm.py +92 -101
- {dfm_python-0.5.3 → dfm_python-0.5.52}/tutorial/tutorial_macro_dfm.py +49 -31
- {dfm_python-0.5.3 → dfm_python-0.5.52}/uv.lock +15 -7
- dfm_python-0.5.3/lightning_logs/ddfm/version_0/checkpoints/ddfm-epoch=00-train_loss=0.7892.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_0/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_1/checkpoints/ddfm-epoch=00-train_loss=0.6617.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_1/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_10/checkpoints/ddfm-epoch=00-train_loss=0.7841.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_10/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_11/checkpoints/ddfm-epoch=00-train_loss=0.8447.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_11/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_12/checkpoints/ddfm-epoch=00-train_loss=0.8701.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_12/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_2/checkpoints/ddfm-epoch=00-train_loss=0.7447.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_2/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_3/checkpoints/ddfm-epoch=00-train_loss=0.7343.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_3/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_4/checkpoints/ddfm-epoch=00-train_loss=0.9361.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_4/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_5/checkpoints/ddfm-epoch=00-train_loss=0.6573.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_5/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_6/checkpoints/ddfm-epoch=00-train_loss=0.8632.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_6/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_7/checkpoints/ddfm-epoch=00-train_loss=0.9101.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_7/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_8/checkpoints/ddfm-epoch=00-train_loss=0.6250.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_8/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/ddfm/version_9/checkpoints/ddfm-epoch=00-train_loss=0.6293.ckpt +0 -0
- dfm_python-0.5.3/lightning_logs/ddfm/version_9/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_0/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_1/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_10/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_100/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_101/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_102/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_103/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_104/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_106/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_107/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_108/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_109/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_11/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_110/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_111/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_112/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_113/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_114/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_115/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_116/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_118/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_119/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_12/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_120/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_121/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_122/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_123/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_124/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_125/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_126/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_127/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_128/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_13/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_130/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_131/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_132/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_133/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_134/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_135/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_136/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_137/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_138/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_139/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_14/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_140/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_141/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_142/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_143/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_144/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_146/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_147/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_148/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_149/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_15/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_150/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_151/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_152/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_153/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_154/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_155/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_156/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_157/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_158/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_159/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_16/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_160/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_162/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_163/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_164/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_165/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_166/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_167/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_168/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_169/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_17/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_170/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_171/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_172/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_174/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_175/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_176/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_177/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_178/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_179/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_180/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_181/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_182/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_183/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_184/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_186/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_187/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_188/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_189/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_19/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_190/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_191/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_192/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_193/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_194/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_195/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_196/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_197/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_198/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_199/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_2/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_20/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_200/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_201/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_202/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_204/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_205/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_206/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_207/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_208/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_209/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_21/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_210/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_211/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_212/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_213/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_214/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_215/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_216/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_217/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_218/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_219/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_22/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_220/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_221/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_222/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_223/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_224/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_225/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_226/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_227/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_228/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_229/metrics.csv +0 -6
- dfm_python-0.5.3/lightning_logs/dfm/version_23/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_24/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_25/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_26/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_27/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_28/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_29/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_3/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_30/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_32/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_33/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_34/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_35/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_36/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_37/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_38/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_39/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_4/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_40/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_41/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_42/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_44/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_45/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_46/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_47/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_48/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_49/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_50/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_51/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_52/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_53/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_54/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_55/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_57/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_58/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_59/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_6/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_60/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_61/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_62/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_63/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_64/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_65/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_66/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_67/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_69/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_7/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_70/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_71/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_72/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_73/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_74/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_75/metrics.csv +0 -2
- dfm_python-0.5.3/lightning_logs/dfm/version_76/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_77/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_78/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_79/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_8/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_80/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_82/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_83/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_84/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_85/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_86/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_87/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_88/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_89/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_9/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_90/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_91/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_92/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_94/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_95/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_96/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_97/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_98/metrics.csv +0 -12
- dfm_python-0.5.3/lightning_logs/dfm/version_99/metrics.csv +0 -12
- dfm_python-0.5.3/src/dfm_python/lightning/data_module.py +0 -771
- dfm_python-0.5.3/src/dfm_python/lightning/scaling.py +0 -444
- dfm_python-0.5.3/src/test/test_nowcast.py +0 -572
- dfm_python-0.5.3/src/test/test_nowcast_implementation.py +0 -354
- {dfm_python-0.5.3 → dfm_python-0.5.52}/.git +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/.gitignore +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/.python-version +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/LICENSE +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/experiment/test_finance.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/experiment/test_macro.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/model/ddfm.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/model/dfm.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KO3YEARC.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBFDSAAF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBFINAAF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBFXSAAF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBSESI_R.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBSIBCEQ.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBSIBCOQ.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBSIBNER.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBSIBNMR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBSIEMAR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBSIHAPR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBSIIMER.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBSIIMPR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBSIXMER.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOBUSINVR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCALL_.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCNFBUSR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCNFCONR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCNGOV_D.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCNPER_D.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCOBUSIR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCONPMTH.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCONPRCF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCONSTRP.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCPCOREF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCPEXFEF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCREU__A.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCSECDMR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCSECEMR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCSEMEMR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCSEOHDR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCSEOHSR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCSHHEMR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCSHHLMR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCSMTTOA.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCSPHIMR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCSPSPMR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOCYLEADR.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KODBLNEQA.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KODBLNHSA.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEMPCONF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEMPMANF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEMPTOTO.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEMPWREP.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEQUIMAE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEQUIPTE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEQUITTE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEXCHINA.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEXNGS_D.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEXPGDSA.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOEXPPRCF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOGCFCNSD.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOGCFFNVD.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOGDP___D.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOGFCF__D.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOHWRWEMP.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOIMNGS_D.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOIMPCONA.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOIMPGDDA.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOIMPGDSA.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOIMPPRCF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOIPALL_G.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOIPMIMAG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOLRLTCO.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOLRLTHH.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOMPCAPGG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOMPCONDG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOMPCONGG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOMPCONNG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOMPRI30G.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOMSCAPGG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOMSCONGG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KONETTRDF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KONEWCONA.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOPICAPGG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOPICONGG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOPIMANUG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOPOPACTE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOPPSRM_F.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOPROPRCF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOPSMANUG.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KORCNST.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KORELEC.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KORFBEV.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KORMACH.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KORMCMP.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOROCOINF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KORWHLS.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOSHRPRCF.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOSIAHOTE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOSIAI__E.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOSIARRLE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOSIAWRTE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOSSBFMBE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOUN_TOTQ.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOUS____.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOVALCONA.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOWRCCNSE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOWRCDURE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOWRCNODE.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/config/series/KOWRCSEME.yaml +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/data/finance.csv +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/data/macro.csv +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/config/__init__.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/config/results.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/config/utils.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/data/__init__.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/data/dataloader.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/data/dataset.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/encoder/base.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/encoder/pca.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/logger/__init__.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/logger/inference_logger.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/logger/logger.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/logger/train_logger.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/models/utils.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/ssm/__init__.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/ssm/em.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/ssm/kalman.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/ssm/utils.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/trainer/dfm.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/utils/data.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/utils/diagnostics.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/utils/helpers.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/utils/statespace.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/dfm_python/utils/time.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/test/test_config.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/test/test_helpers.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/test/test_logger.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/test/test_mixed_frequency.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/test/test_models.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/test/test_predict.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/test/test_sktime_integration.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/test/test_ssm.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/test/test_trainer.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/src/test/test_utils.py +0 -0
- {dfm_python-0.5.3 → dfm_python-0.5.52}/test_update_manual.py +0 -0
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
# Include only the DFM module (src/
|
|
1
|
+
# Include only the DFM module (src/dfm_python)
|
|
2
2
|
# Exclude all application-specific code (adapters, database, scripts, config, etc.)
|
|
3
3
|
|
|
4
4
|
include README.md
|
|
5
|
-
include LICENSE
|
|
6
5
|
include pyproject.toml
|
|
7
6
|
|
|
8
|
-
# Include only the
|
|
9
|
-
recursive-include src/
|
|
7
|
+
# Include only the dfm_python package
|
|
8
|
+
recursive-include src/dfm_python *.py
|
|
10
9
|
|
|
11
10
|
# Exclude application-specific directories
|
|
12
11
|
prune adapters
|
|
@@ -29,4 +28,5 @@ exclude *.sql
|
|
|
29
28
|
exclude *.lock
|
|
30
29
|
exclude .gitignore
|
|
31
30
|
exclude .env*
|
|
31
|
+
exclude LICENSE
|
|
32
32
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dfm-python
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.52
|
|
4
4
|
Summary: Dynamic Factor Model (DFM) estimation and nowcasting in Python
|
|
5
5
|
Project-URL: Homepage, https://github.com/yourusername/dfm-python
|
|
6
6
|
Project-URL: Documentation, https://github.com/yourusername/dfm-python#readme
|
|
@@ -8,7 +8,6 @@ Project-URL: Repository, https://github.com/yourusername/dfm-python
|
|
|
8
8
|
Project-URL: Issues, https://github.com/yourusername/dfm-python/issues
|
|
9
9
|
Author: Minkey Chang
|
|
10
10
|
License: MIT
|
|
11
|
-
License-File: LICENSE
|
|
12
11
|
Keywords: dfm,dynamic-factor-model,econometrics,forecasting,nowcasting,time-series
|
|
13
12
|
Classifier: Development Status :: 4 - Beta
|
|
14
13
|
Classifier: Intended Audience :: Science/Research
|
|
@@ -330,6 +329,95 @@ result.confidence_interval # Confidence interval
|
|
|
330
329
|
result.factors_at_view # Factor state at view date
|
|
331
330
|
```
|
|
332
331
|
|
|
332
|
+
## Mixed-Frequency Data Handling
|
|
333
|
+
|
|
334
|
+
### Clock Frequency and Target Series
|
|
335
|
+
|
|
336
|
+
The package supports mixed-frequency data where the **clock frequency** (the frequency at which factors evolve) can differ from the **target series frequency**. The clock must always be the **minimum frequency** among all series (i.e., the fastest frequency).
|
|
337
|
+
|
|
338
|
+
### Supported Frequency Combinations
|
|
339
|
+
|
|
340
|
+
| Frequencies | Clock | Target | Status | Description |
|
|
341
|
+
|------------|-------|--------|--------|-------------|
|
|
342
|
+
| `[d]` | `d` | `d` | ✅ | All daily series |
|
|
343
|
+
| `[d, w]` | `d` | `d` | ✅ | Daily clock, weekly series (7-day uniform average) |
|
|
344
|
+
| `[w, m]` | `w` | `m` | ✅ | Weekly clock, monthly series (4-week uniform average) |
|
|
345
|
+
| `[m]` | `m` | `m` | ✅ | All monthly series |
|
|
346
|
+
| `[m, q]` | `m` | `q` | ✅ | Monthly clock, quarterly series (5-month tent kernel) |
|
|
347
|
+
|
|
348
|
+
### Weekly Clock with Monthly Series
|
|
349
|
+
|
|
350
|
+
When `clock='w'` and target series is `frequency='m'`:
|
|
351
|
+
|
|
352
|
+
**Data Structure:**
|
|
353
|
+
- All data is organized at weekly frequency (T × N, where T is weekly time points)
|
|
354
|
+
- Weekly series: Full weekly observations (week-over-week changes)
|
|
355
|
+
- Monthly series: 3-4 NaN values per month, 1 observation per month (week-over-week changes)
|
|
356
|
+
|
|
357
|
+
**Model Interpretation:**
|
|
358
|
+
- **Weekly data**: Week-over-week changes (전월비 증감)
|
|
359
|
+
- **Monthly data**: 4-week uniform average of weekly changes (주간 전월비 증감의 4주 평균)
|
|
360
|
+
- **DFM factors**: Weekly frequency, week-over-week changes
|
|
361
|
+
- **Monthly observation**: Connected to 4 weekly state variables via uniform weights `[1, 1, 1, 1]`
|
|
362
|
+
|
|
363
|
+
**Tent Kernel:**
|
|
364
|
+
```python
|
|
365
|
+
('m', 'w'): np.array([1, 1, 1, 1]) # 4-week uniform average
|
|
366
|
+
# Normalized: [0.25, 0.25, 0.25, 0.25]
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
**Prediction:**
|
|
370
|
+
- `predict(horizon=4)` returns 4 weekly forecasts (clock frequency)
|
|
371
|
+
- Monthly series predictions are also at weekly frequency
|
|
372
|
+
- **To get monthly forecast**: Average the 4 weekly predictions for that month
|
|
373
|
+
- The monthly prediction equals the average of 4 weekly factors (due to uniform average constraint)
|
|
374
|
+
|
|
375
|
+
**Mathematical Relationship:**
|
|
376
|
+
```
|
|
377
|
+
Monthly observation = c × (f_t + f_{t-1} + f_{t-2} + f_{t-3})
|
|
378
|
+
= c × 4 × mean(f_t, f_{t-1}, f_{t-2}, f_{t-3})
|
|
379
|
+
= mean(f_t, f_{t-1}, f_{t-2}, f_{t-3}) (when c = 0.25)
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
Where:
|
|
383
|
+
- `f_t` is the weekly factor at time t
|
|
384
|
+
- `c` is the loading coefficient (constrained to be uniform via R_mat)
|
|
385
|
+
- The constraint `R_mat @ Cc = q` ensures `Cc[0] = Cc[1] = Cc[2] = Cc[3]` (uniform average)
|
|
386
|
+
|
|
387
|
+
### Monthly Clock with Quarterly Series
|
|
388
|
+
|
|
389
|
+
When `clock='m'` and target series is `frequency='q'`:
|
|
390
|
+
|
|
391
|
+
**Tent Kernel:**
|
|
392
|
+
```python
|
|
393
|
+
('q', 'm'): np.array([1, 2, 3, 2, 1]) # 5-month tent kernel
|
|
394
|
+
# Normalized: [0.111, 0.222, 0.333, 0.222, 0.111]
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
**Model Interpretation:**
|
|
398
|
+
- Quarterly observation = weighted average of 5 monthly factors (tent shape, peaking at middle month)
|
|
399
|
+
- This is the traditional DFM case (quarterly → monthly)
|
|
400
|
+
|
|
401
|
+
### Prediction Behavior
|
|
402
|
+
|
|
403
|
+
**Important Notes:**
|
|
404
|
+
1. **Predictions are always at clock frequency**: `predict(horizon=4)` with `clock='w'` returns 4 weekly forecasts
|
|
405
|
+
2. **No NaN in predictions**: All series (including slower-frequency ones) get predictions at clock frequency
|
|
406
|
+
3. **Aggregation for target frequency**: To get target-frequency forecasts, aggregate clock-frequency predictions:
|
|
407
|
+
- Monthly target with weekly clock: Average 4 weekly predictions per month
|
|
408
|
+
- Quarterly target with monthly clock: Apply tent kernel `[1, 2, 3, 2, 1]` to 5 monthly predictions
|
|
409
|
+
|
|
410
|
+
**Example:**
|
|
411
|
+
```python
|
|
412
|
+
# clock='w', target='m', predict(horizon=4)
|
|
413
|
+
X_forecast = model.predict(horizon=4) # Returns (4 × N) weekly forecasts
|
|
414
|
+
|
|
415
|
+
# Get monthly forecast for target series
|
|
416
|
+
monthly_idx = 2 # Index of monthly target series
|
|
417
|
+
weekly_forecasts = X_forecast[:, monthly_idx] # 4 weekly values
|
|
418
|
+
monthly_forecast = np.mean(weekly_forecasts) # Average to get monthly value
|
|
419
|
+
```
|
|
420
|
+
|
|
333
421
|
## Architecture
|
|
334
422
|
|
|
335
423
|
### Core Modules
|
|
@@ -390,10 +478,16 @@ pytest src/test/test_trainer.py -v
|
|
|
390
478
|
|
|
391
479
|
## Project Status
|
|
392
480
|
|
|
393
|
-
**Version**: 0.5.
|
|
481
|
+
**Version**: 0.5.4
|
|
394
482
|
**Status**: Stable
|
|
395
483
|
**Python**: 3.10+
|
|
396
484
|
|
|
485
|
+
### What's New in 0.5.4
|
|
486
|
+
|
|
487
|
+
- **Version consistency**: Unified version numbers across all files
|
|
488
|
+
- **Documentation updates**: Updated README and package documentation
|
|
489
|
+
- **Stability improvements**: Enhanced numerical stability and error handling
|
|
490
|
+
|
|
397
491
|
### What's New in 0.5.1
|
|
398
492
|
|
|
399
493
|
- **New `update()` method**: Replaces legacy `nowcast()` with flexible `update().predict()` pattern
|
|
@@ -274,6 +274,95 @@ result.confidence_interval # Confidence interval
|
|
|
274
274
|
result.factors_at_view # Factor state at view date
|
|
275
275
|
```
|
|
276
276
|
|
|
277
|
+
## Mixed-Frequency Data Handling
|
|
278
|
+
|
|
279
|
+
### Clock Frequency and Target Series
|
|
280
|
+
|
|
281
|
+
The package supports mixed-frequency data where the **clock frequency** (the frequency at which factors evolve) can differ from the **target series frequency**. The clock must always be the **minimum frequency** among all series (i.e., the fastest frequency).
|
|
282
|
+
|
|
283
|
+
### Supported Frequency Combinations
|
|
284
|
+
|
|
285
|
+
| Frequencies | Clock | Target | Status | Description |
|
|
286
|
+
|------------|-------|--------|--------|-------------|
|
|
287
|
+
| `[d]` | `d` | `d` | ✅ | All daily series |
|
|
288
|
+
| `[d, w]` | `d` | `d` | ✅ | Daily clock, weekly series (7-day uniform average) |
|
|
289
|
+
| `[w, m]` | `w` | `m` | ✅ | Weekly clock, monthly series (4-week uniform average) |
|
|
290
|
+
| `[m]` | `m` | `m` | ✅ | All monthly series |
|
|
291
|
+
| `[m, q]` | `m` | `q` | ✅ | Monthly clock, quarterly series (5-month tent kernel) |
|
|
292
|
+
|
|
293
|
+
### Weekly Clock with Monthly Series
|
|
294
|
+
|
|
295
|
+
When `clock='w'` and target series is `frequency='m'`:
|
|
296
|
+
|
|
297
|
+
**Data Structure:**
|
|
298
|
+
- All data is organized at weekly frequency (T × N, where T is weekly time points)
|
|
299
|
+
- Weekly series: Full weekly observations (week-over-week changes)
|
|
300
|
+
- Monthly series: 3-4 NaN values per month, 1 observation per month (week-over-week changes)
|
|
301
|
+
|
|
302
|
+
**Model Interpretation:**
|
|
303
|
+
- **Weekly data**: Week-over-week changes (전월비 증감)
|
|
304
|
+
- **Monthly data**: 4-week uniform average of weekly changes (주간 전월비 증감의 4주 평균)
|
|
305
|
+
- **DFM factors**: Weekly frequency, week-over-week changes
|
|
306
|
+
- **Monthly observation**: Connected to 4 weekly state variables via uniform weights `[1, 1, 1, 1]`
|
|
307
|
+
|
|
308
|
+
**Tent Kernel:**
|
|
309
|
+
```python
|
|
310
|
+
('m', 'w'): np.array([1, 1, 1, 1]) # 4-week uniform average
|
|
311
|
+
# Normalized: [0.25, 0.25, 0.25, 0.25]
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
**Prediction:**
|
|
315
|
+
- `predict(horizon=4)` returns 4 weekly forecasts (clock frequency)
|
|
316
|
+
- Monthly series predictions are also at weekly frequency
|
|
317
|
+
- **To get monthly forecast**: Average the 4 weekly predictions for that month
|
|
318
|
+
- The monthly prediction equals the average of 4 weekly factors (due to uniform average constraint)
|
|
319
|
+
|
|
320
|
+
**Mathematical Relationship:**
|
|
321
|
+
```
|
|
322
|
+
Monthly observation = c × (f_t + f_{t-1} + f_{t-2} + f_{t-3})
|
|
323
|
+
= c × 4 × mean(f_t, f_{t-1}, f_{t-2}, f_{t-3})
|
|
324
|
+
= mean(f_t, f_{t-1}, f_{t-2}, f_{t-3}) (when c = 0.25)
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Where:
|
|
328
|
+
- `f_t` is the weekly factor at time t
|
|
329
|
+
- `c` is the loading coefficient (constrained to be uniform via R_mat)
|
|
330
|
+
- The constraint `R_mat @ Cc = q` ensures `Cc[0] = Cc[1] = Cc[2] = Cc[3]` (uniform average)
|
|
331
|
+
|
|
332
|
+
### Monthly Clock with Quarterly Series
|
|
333
|
+
|
|
334
|
+
When `clock='m'` and target series is `frequency='q'`:
|
|
335
|
+
|
|
336
|
+
**Tent Kernel:**
|
|
337
|
+
```python
|
|
338
|
+
('q', 'm'): np.array([1, 2, 3, 2, 1]) # 5-month tent kernel
|
|
339
|
+
# Normalized: [0.111, 0.222, 0.333, 0.222, 0.111]
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
**Model Interpretation:**
|
|
343
|
+
- Quarterly observation = weighted average of 5 monthly factors (tent shape, peaking at middle month)
|
|
344
|
+
- This is the traditional DFM case (quarterly → monthly)
|
|
345
|
+
|
|
346
|
+
### Prediction Behavior
|
|
347
|
+
|
|
348
|
+
**Important Notes:**
|
|
349
|
+
1. **Predictions are always at clock frequency**: `predict(horizon=4)` with `clock='w'` returns 4 weekly forecasts
|
|
350
|
+
2. **No NaN in predictions**: All series (including slower-frequency ones) get predictions at clock frequency
|
|
351
|
+
3. **Aggregation for target frequency**: To get target-frequency forecasts, aggregate clock-frequency predictions:
|
|
352
|
+
- Monthly target with weekly clock: Average 4 weekly predictions per month
|
|
353
|
+
- Quarterly target with monthly clock: Apply tent kernel `[1, 2, 3, 2, 1]` to 5 monthly predictions
|
|
354
|
+
|
|
355
|
+
**Example:**
|
|
356
|
+
```python
|
|
357
|
+
# clock='w', target='m', predict(horizon=4)
|
|
358
|
+
X_forecast = model.predict(horizon=4) # Returns (4 × N) weekly forecasts
|
|
359
|
+
|
|
360
|
+
# Get monthly forecast for target series
|
|
361
|
+
monthly_idx = 2 # Index of monthly target series
|
|
362
|
+
weekly_forecasts = X_forecast[:, monthly_idx] # 4 weekly values
|
|
363
|
+
monthly_forecast = np.mean(weekly_forecasts) # Average to get monthly value
|
|
364
|
+
```
|
|
365
|
+
|
|
277
366
|
## Architecture
|
|
278
367
|
|
|
279
368
|
### Core Modules
|
|
@@ -334,10 +423,16 @@ pytest src/test/test_trainer.py -v
|
|
|
334
423
|
|
|
335
424
|
## Project Status
|
|
336
425
|
|
|
337
|
-
**Version**: 0.5.
|
|
426
|
+
**Version**: 0.5.4
|
|
338
427
|
**Status**: Stable
|
|
339
428
|
**Python**: 3.10+
|
|
340
429
|
|
|
430
|
+
### What's New in 0.5.4
|
|
431
|
+
|
|
432
|
+
- **Version consistency**: Unified version numbers across all files
|
|
433
|
+
- **Documentation updates**: Updated README and package documentation
|
|
434
|
+
- **Stability improvements**: Enhanced numerical stability and error handling
|
|
435
|
+
|
|
341
436
|
### What's New in 0.5.1
|
|
342
437
|
|
|
343
438
|
- **New `update()` method**: Replaces legacy `nowcast()` with flexible `update().predict()` pattern
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "dfm-python"
|
|
3
|
-
version = "0.5.
|
|
3
|
+
version = "0.5.52"
|
|
4
4
|
description = "Dynamic Factor Model (DFM) estimation and nowcasting in Python"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -65,6 +65,11 @@ all = [
|
|
|
65
65
|
requires = ["hatchling"]
|
|
66
66
|
build-backend = "hatchling.build"
|
|
67
67
|
|
|
68
|
+
[tool.hatch.metadata]
|
|
69
|
+
# Prevent automatic license-file field addition
|
|
70
|
+
allow-direct-references = false
|
|
71
|
+
allow-license-file = false
|
|
72
|
+
|
|
68
73
|
[tool.hatch.build.targets.wheel]
|
|
69
74
|
# Include DFM module
|
|
70
75
|
# All application-specific code (adapters, database, scripts, etc.) is automatically excluded
|
|
@@ -78,6 +83,11 @@ exclude = [
|
|
|
78
83
|
"test_venv/**",
|
|
79
84
|
]
|
|
80
85
|
|
|
86
|
+
[dependency-groups]
|
|
87
|
+
dev = [
|
|
88
|
+
"pytest>=9.0.1",
|
|
89
|
+
]
|
|
90
|
+
|
|
81
91
|
[project.urls]
|
|
82
92
|
Homepage = "https://github.com/yourusername/dfm-python"
|
|
83
93
|
Documentation = "https://github.com/yourusername/dfm-python#readme"
|
|
@@ -65,7 +65,7 @@ Note: DFMConfig and SeriesConfig are internal implementation details.
|
|
|
65
65
|
For detailed documentation, see the README.md file and the tutorial notebooks/scripts.
|
|
66
66
|
"""
|
|
67
67
|
|
|
68
|
-
__version__ = "0.5.
|
|
68
|
+
__version__ = "0.5.5"
|
|
69
69
|
|
|
70
70
|
# ============================================================================
|
|
71
71
|
# PUBLIC API DEFINITION
|
|
@@ -85,8 +85,8 @@ __version__ = "0.5.2"
|
|
|
85
85
|
# Configuration (from config/ subpackage)
|
|
86
86
|
from .config import (
|
|
87
87
|
DEFAULT_BLOCK_NAME,
|
|
88
|
-
ConfigSource, YamlSource,
|
|
89
|
-
|
|
88
|
+
ConfigSource, YamlSource, HydraSource,
|
|
89
|
+
make_config_source,
|
|
90
90
|
)
|
|
91
91
|
# Internal imports (for backward compatibility, but not recommended)
|
|
92
92
|
from .config import DFMConfig, SeriesConfig # Internal use only
|
|
@@ -102,7 +102,9 @@ from .utils.time import calculate_rmse
|
|
|
102
102
|
# Users can import these directly from dfm_python
|
|
103
103
|
from .lightning import (
|
|
104
104
|
DFMDataModule,
|
|
105
|
+
DDFMDataModule, # DDFM-specific DataModule
|
|
105
106
|
DFMDataset, # Dataset class (usually not needed directly)
|
|
107
|
+
DDFMDataset, # DDFM Dataset class (usually not needed directly)
|
|
106
108
|
KalmanFilter, # Module class
|
|
107
109
|
EMAlgorithm, # Module class
|
|
108
110
|
)
|
|
@@ -111,8 +113,8 @@ from .lightning import (
|
|
|
111
113
|
from .models.base import BaseFactorModel
|
|
112
114
|
from .models.dfm import DFM
|
|
113
115
|
|
|
114
|
-
# DDFM high-level API
|
|
115
|
-
from .models.ddfm import DDFM
|
|
116
|
+
# DDFM high-level API (PyTorch is mandatory)
|
|
117
|
+
from .models.ddfm import DDFM
|
|
116
118
|
|
|
117
119
|
__all__ = [
|
|
118
120
|
# Core classes
|
|
@@ -122,8 +124,8 @@ __all__ = [
|
|
|
122
124
|
# Constants
|
|
123
125
|
'DEFAULT_BLOCK_NAME',
|
|
124
126
|
# Config sources
|
|
125
|
-
'ConfigSource', 'YamlSource', '
|
|
126
|
-
'
|
|
127
|
+
'ConfigSource', 'YamlSource', 'HydraSource',
|
|
128
|
+
'make_config_source',
|
|
127
129
|
# Low-level API (functional interface - advanced usage)
|
|
128
130
|
'BaseResult', 'DFMResult', 'DDFMResult', 'calculate_rmse', 'diagnose_series', 'print_series_diagnosis',
|
|
129
131
|
]
|
|
@@ -131,13 +133,14 @@ __all__ = [
|
|
|
131
133
|
# DDFM high-level API (PyTorch is mandatory)
|
|
132
134
|
__all__.extend([
|
|
133
135
|
'DDFM', # High-level API class
|
|
134
|
-
'DDFMModel', # Low-level implementation (used internally)
|
|
135
136
|
])
|
|
136
137
|
|
|
137
138
|
# Lightning modules (mandatory dependency)
|
|
138
139
|
__all__.extend([
|
|
139
140
|
'DFMDataModule',
|
|
141
|
+
'DDFMDataModule', # DDFM-specific DataModule
|
|
140
142
|
'DFMDataset', # Dataset class (usually not needed directly)
|
|
143
|
+
'DDFMDataset', # DDFM Dataset class (usually not needed directly)
|
|
141
144
|
'KalmanFilter', # Module class
|
|
142
145
|
'EMAlgorithm', # Module class
|
|
143
146
|
])
|
|
@@ -208,13 +208,16 @@ class YamlSource:
|
|
|
208
208
|
except (ValueError, TypeError):
|
|
209
209
|
release_date = None
|
|
210
210
|
|
|
211
|
+
# Remove transformation and blocks if present (not in SeriesConfig)
|
|
212
|
+
series_data_clean = {k: v for k, v in series_data.items()
|
|
213
|
+
if k not in ['transformation', 'blocks']}
|
|
211
214
|
series_list.append(SeriesConfig(
|
|
212
215
|
series_id=series_id,
|
|
213
|
-
series_name=
|
|
214
|
-
frequency=
|
|
215
|
-
transformation
|
|
216
|
-
blocks
|
|
217
|
-
release_date=release_date
|
|
216
|
+
series_name=series_data_clean.get('series_name', series_id),
|
|
217
|
+
frequency=series_data_clean.get('frequency', 'm'),
|
|
218
|
+
# transformation removed - handled by preprocessing pipeline
|
|
219
|
+
# blocks removed - defined in DFMConfig
|
|
220
|
+
release_date=series_data_clean.get('release_date', release_date)
|
|
218
221
|
))
|
|
219
222
|
|
|
220
223
|
# If no series loaded from separate files, try to get from main config
|
|
@@ -224,17 +227,23 @@ class YamlSource:
|
|
|
224
227
|
for series_item in series_data:
|
|
225
228
|
if isinstance(series_item, str):
|
|
226
229
|
# Series is just a string ID - create minimal config
|
|
227
|
-
series_list.append(SeriesConfig(series_id=series_item, frequency='m'
|
|
230
|
+
series_list.append(SeriesConfig(series_id=series_item, frequency='m'))
|
|
228
231
|
elif isinstance(series_item, dict):
|
|
229
|
-
|
|
232
|
+
# Remove transformation and blocks if present (not in SeriesConfig)
|
|
233
|
+
series_item_clean = {k: v for k, v in series_item.items()
|
|
234
|
+
if k not in ['transformation', 'blocks']}
|
|
235
|
+
series_list.append(SeriesConfig(**series_item_clean))
|
|
230
236
|
elif isinstance(series_data, dict):
|
|
231
237
|
for series_id, series_item in series_data.items():
|
|
232
238
|
if isinstance(series_item, dict):
|
|
233
239
|
series_item['series_id'] = series_id
|
|
234
|
-
|
|
240
|
+
# Remove transformation and blocks if present (not in SeriesConfig)
|
|
241
|
+
series_item_clean = {k: v for k, v in series_item.items()
|
|
242
|
+
if k not in ['transformation', 'blocks']}
|
|
243
|
+
series_list.append(SeriesConfig(**series_item_clean))
|
|
235
244
|
elif isinstance(series_item, str):
|
|
236
245
|
# Series value is just a string - create minimal config
|
|
237
|
-
series_list.append(SeriesConfig(series_id=series_id, frequency='m'
|
|
246
|
+
series_list.append(SeriesConfig(series_id=series_id, frequency='m'))
|
|
238
247
|
|
|
239
248
|
# Load block properties from model config (factors, ar_lag, clock)
|
|
240
249
|
# Model config defines all blocks and their properties
|
|
@@ -250,28 +259,8 @@ class YamlSource:
|
|
|
250
259
|
if blocks_dict_raw is not None:
|
|
251
260
|
blocks_properties_from_config.update(blocks_dict_raw)
|
|
252
261
|
|
|
253
|
-
#
|
|
254
|
-
#
|
|
255
|
-
block_names_from_series = set()
|
|
256
|
-
for series in series_list:
|
|
257
|
-
if hasattr(series, 'blocks') and series.blocks:
|
|
258
|
-
# Handle both list of strings and list of ints
|
|
259
|
-
if isinstance(series.blocks, list):
|
|
260
|
-
for block in series.blocks:
|
|
261
|
-
if isinstance(block, str):
|
|
262
|
-
block_names_from_series.add(block)
|
|
263
|
-
|
|
264
|
-
# If no blocks specified in series, use default single block
|
|
265
|
-
# Use first block from model config if available, otherwise create default
|
|
266
|
-
if not block_names_from_series:
|
|
267
|
-
# Check if model config defines blocks
|
|
268
|
-
if blocks_properties_from_config:
|
|
269
|
-
# Use first block from model config
|
|
270
|
-
first_block_name = list(blocks_properties_from_config.keys())[0]
|
|
271
|
-
block_names_from_series.add(first_block_name)
|
|
272
|
-
else:
|
|
273
|
-
# Create default generic block
|
|
274
|
-
block_names_from_series.add(DEFAULT_BLOCK_NAME)
|
|
262
|
+
# Note: SeriesConfig no longer contains blocks information.
|
|
263
|
+
# Blocks are defined in DFMConfig, not in SeriesConfig.
|
|
275
264
|
|
|
276
265
|
# Create block dicts for each block
|
|
277
266
|
# Priority: 1) Model config properties, 2) Defaults from main_settings
|
|
@@ -296,24 +285,13 @@ class YamlSource:
|
|
|
296
285
|
'clock': default_clock
|
|
297
286
|
}
|
|
298
287
|
|
|
299
|
-
#
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
'clock': default_clock
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
# Convert block names to list for from_dict() if series use integer block indices
|
|
310
|
-
# Check if series use integer indices instead of block names
|
|
311
|
-
block_names_list = None
|
|
312
|
-
if series_list:
|
|
313
|
-
first_series_blocks = series_list[0].blocks if hasattr(series_list[0], 'blocks') else []
|
|
314
|
-
if first_series_blocks and isinstance(first_series_blocks[0], int):
|
|
315
|
-
# Series use integer indices, need block_names for from_dict()
|
|
316
|
-
block_names_list = list(blocks_dict.keys())
|
|
288
|
+
# If no blocks specified in config, use default single block
|
|
289
|
+
if not blocks_dict:
|
|
290
|
+
blocks_dict[DEFAULT_BLOCK_NAME] = {
|
|
291
|
+
'factors': 1,
|
|
292
|
+
'ar_lag': default_ar_lag,
|
|
293
|
+
'clock': default_clock
|
|
294
|
+
}
|
|
317
295
|
|
|
318
296
|
# Build dictionary for from_dict() which handles type detection
|
|
319
297
|
# Include all main_settings (which may contain DDFM parameters from model config)
|
|
@@ -323,10 +301,6 @@ class YamlSource:
|
|
|
323
301
|
**main_settings
|
|
324
302
|
}
|
|
325
303
|
|
|
326
|
-
# Add block_names if series use integer indices
|
|
327
|
-
if block_names_list is not None:
|
|
328
|
-
config_dict['block_names'] = block_names_list
|
|
329
|
-
|
|
330
304
|
# Use from_dict() which now correctly detects DDFM configs
|
|
331
305
|
# The detection bug has been fixed in schema.py
|
|
332
306
|
return DFMConfig.from_dict(config_dict)
|
|
@@ -644,12 +618,16 @@ if HYDRA_AVAILABLE and ConfigStore is not None:
|
|
|
644
618
|
|
|
645
619
|
@schema_dataclass
|
|
646
620
|
class SeriesConfigSchema:
|
|
647
|
-
"""Schema for SeriesConfig validation in Hydra.
|
|
621
|
+
"""Schema for SeriesConfig validation in Hydra.
|
|
622
|
+
|
|
623
|
+
Note: transformation is handled by preprocessing pipeline, not in SeriesConfig.
|
|
624
|
+
Note: blocks are defined in DFMConfig, not in SeriesConfig.
|
|
625
|
+
"""
|
|
648
626
|
series_id: str
|
|
649
627
|
series_name: str
|
|
650
628
|
frequency: str
|
|
651
|
-
transformation
|
|
652
|
-
blocks
|
|
629
|
+
# transformation removed - handled by preprocessing pipeline
|
|
630
|
+
# blocks removed - defined in DFMConfig
|
|
653
631
|
units: Optional[str] = None # Optional, for display only
|
|
654
632
|
|
|
655
633
|
@schema_dataclass
|