%23%20%2F%2F%2F%20script%0A%23%20requires-python%20%3D%20%22%3E%3D3.11%22%0A%23%20dependencies%20%3D%20%5B%0A%23%20%20%20%20%20%22yohou%5Bplotting%5D%22%2C%0A%23%20%5D%0A%23%20%2F%2F%2F%0A%0Aimport%20marimo%0A%0A__generated_with%20%3D%20%220.23.8%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20How%20to%20Create%20a%20Custom%20Transformer%0A%0A%20%20%20%20This%20notebook%20implements%20a%20%60ScaleTransformer%60%20from%20scratch%2C%0A%20%20%20%20validates%20it%20using%20the%20built-in%20check%20generator%2C%20and%20uses%20it%0A%20%20%20%20as%20a%20target%20transformer%20inside%20a%0A%20%20%20%20%5B%60PointReductionForecaster%60%5D(%2Fpages%2Fapi%2Fgenerated%2Fyohou.point.reduction.PointReductionForecaster%2F).%0A%0A%20%20%20%20**Prerequisites%3A**%20Familiarity%20with%20the%20fit%2Fpredict%20API%0A%20%20%20%20(%5BGetting%20Started%5D(%2Fpages%2Ftutorials%2Fgetting-started%2F))%20and%0A%20%20%20%20Yohou%20transformers%20(%5BUse%20Preprocessing%20Transformers%5D(%2Fpages%2Fhow-to%2Fuse-preprocessing-transformers%2F)).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%201.%20Implement%20the%20Transformer%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20polars%20as%20pl%0A%20%20%20%20import%20polars.selectors%20as%20cs%0A%0A%20%20%20%20from%20yohou.base%20import%20BaseTransformer%0A%0A%20%20%20%20class%20ScaleTransformer(BaseTransformer)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Multiplies%20all%20numeric%20columns%20by%20a%20constant%20factor.%22%22%22%0A%0A%20%20%20%20%20%20%20%20_tags%20%3D%20%7B%22invertible%22%3A%20True%7D%0A%0A%20%20%20%20%20%20%20%20_parameter_constraints%3A%20dict%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22factor%22%3A%20%5Bfloat%2C%20int%5D%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20def%20__init__(self%2C%20factor%3D2.0)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.factor%20%3D%20factor%0A%0A%20%20%20%20%20%20%20%20def%20_fit(self%2C%20X%2C%20y%3DNone)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.columns_%20%3D%20%5Bc%20for%20c%20in%20X.columns%20if%20c%20!%3D%20%22time%22%5D%0A%0A%20%20%20%20%20%20%20%20def%20_transform(self%2C%20X)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20X.with_columns(cs.numeric()%20*%20self.factor)%0A%0A%20%20%20%20%20%20%20%20def%20_inverse_transform(self%2C%20X_t%2C%20X_p%3DNone)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20X_t.with_columns(cs.numeric()%20%2F%20self.factor)%0A%0A%20%20%20%20%20%20%20%20def%20get_feature_names_out(self%2C%20input_features%3DNone)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20self.columns_%20if%20input_features%20is%20None%20else%20input_features%0A%0A%20%20%20%20return%20ScaleTransformer%2C%20pl%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%202.%20Fit%20and%20Transform%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ScaleTransformer%2C%20pl)%3A%0A%20%20%20%20from%20yohou.datasets%20import%20fetch_sunspot%0A%20%20%20%20from%20yohou.model_selection%20import%20train_test_split%0A%0A%20%20%20%20bunch%20%3D%20fetch_sunspot()%0A%20%20%20%20y%20%3D%20bunch.frame.group_by_dynamic(%22time%22%2C%20every%3D%221mo%22).agg(%0A%20%20%20%20%20%20%20%20pl.col(%22sunspot_number%22).mean()%0A%20%20%20%20)%0A%0A%20%20%20%20y_train%2C%20y_test%20%3D%20train_test_split(y%2C%20test_size%3D24)%0A%0A%20%20%20%20transformer%20%3D%20ScaleTransformer(factor%3D0.01)%0A%20%20%20%20transformer.fit(y_train)%0A%0A%20%20%20%20y_scaled%20%3D%20transformer.transform(y_train)%0A%20%20%20%20y_restored%20%3D%20transformer.inverse_transform(y_scaled)%0A%0A%20%20%20%20print(%22Original%20(first%203%20rows)%3A%22)%0A%20%20%20%20print(y_train.head(3))%0A%20%20%20%20print(%22%5CnScaled%3A%22)%0A%20%20%20%20print(y_scaled.head(3))%0A%20%20%20%20print(%22%5CnRestored%3A%22)%0A%20%20%20%20print(y_restored.head(3))%0A%20%20%20%20return%20y_test%2C%20y_train%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%203.%20Use%20in%20a%20Forecast%20Pipeline%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ScaleTransformer%2C%20y_test%2C%20y_train)%3A%0A%20%20%20%20from%20sklearn.linear_model%20import%20Ridge%0A%0A%20%20%20%20from%20yohou.point%20import%20PointReductionForecaster%0A%0A%20%20%20%20forecaster%20%3D%20PointReductionForecaster(%0A%20%20%20%20%20%20%20%20estimator%3DRidge()%2C%0A%20%20%20%20%20%20%20%20target_transformer%3DScaleTransformer(factor%3D0.01)%2C%0A%20%20%20%20)%0A%20%20%20%20forecasting_horizon%20%3D%20len(y_test)%0A%20%20%20%20forecaster.fit(y_train%2C%20forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20y_pred%20%3D%20forecaster.predict(forecasting_horizon%3Dforecasting_horizon)%0A%20%20%20%20y_pred.head()%0A%20%20%20%20return%20(y_pred%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%204.%20Plot%20the%20Result%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(y_pred%2C%20y_test%2C%20y_train)%3A%0A%20%20%20%20from%20yohou.plotting%20import%20plot_forecast%0A%0A%20%20%20%20fig%20%3D%20plot_forecast(%0A%20%20%20%20%20%20%20%20y_train%3Dy_train%2C%0A%20%20%20%20%20%20%20%20y_test%3Dy_test%2C%0A%20%20%20%20%20%20%20%20y_pred%3Dy_pred%2C%0A%20%20%20%20)%0A%20%20%20%20fig%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Next%20Steps%0A%0A%20%20%20%20-%20%5BCreate%20a%20Transformer%5D(%2Fpages%2Fhow-to%2Fcreate-a-transformer%2F)%20for%20the%20full%20guide%0A%20%20%20%20-%20%5BCompose%20Feature%20Pipelines%5D(%2Fpages%2Fhow-to%2Fcompose-feature-pipelines%2F)%20for%20combining%20transformers%0A%20%20%20%20-%20%5BUse%20Preprocessing%20Transformers%5D(%2Fpages%2Fhow-to%2Fuse-preprocessing-transformers%2F)%20for%20built-in%20transformers%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
0733edc44754191e700d01187e9a9948