A pipe merely "pipes" the output of one function as an input to another. For example, | in bash. In Python this can be done the trivial way (by composing) or by using decorators.
Yes, it can be done the trivial way in most languages. For deep nestung, that's ugly and awkward, which is why some languages have piping/composition operators [or threading macros] (sometimes more than one). Python has no close equivalent of a piping operator or threading macro (decorators don't seem helpful at all here.)
So I recently started working on stochast.icu. As it currently stands, it is an implementation of pyportfolioopt restricted to CAPM modelling returns and Ledoit Wolf shrinkage estimation for the risk matrix. My plan would be to introduce a Backtrader server so that one could see, based on a scheduled rebalancing rule (implemented daily, weekly, etc), how they would perform over time. Of course, this will later include the full suite of pyportfolioopt as well as some screeners I am working on implementing soon. The idea is to make a tool which require little setup (e.g., versus Portfoliovisualizer) so one can make quickly tinker around with different tickers when exploring their options.
Also note that I am obviously not very good at UI design... lol.