from quantopian.pipeline import Pipeline
from quantopian.research import run_pipeline
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.factors import SimpleMovingAverage

"""
Explanation: Combining Factors
Factors can be combined, both with other Factors and with scalar values, via any of the builtin mathematical operators (+, -, *, etc). This makes it easy to write complex expressions that combine multiple Factors. For example, constructing a Factor that computes the average of two other Factors is simply:
```



f1 = SomeFactor(...)
f2 = SomeOtherFactor(...)
average = (f1 + f2) / 2.0
``
In this lesson, we will create a pipeline that creates arelative_difference` factor by combining a 10-day average factor and a 30-day average factor. 



As usual, let's start with our imports:
End of explanation
"""


mean_close_10 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=10)
mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=30)

"""
Explanation: For this example, we need two factors: a 10-day mean close price factor, and a 30-day one:
End of explanation
"""


percent_difference = (mean_close_10 - mean_close_30) / mean_close_30

"""
Explanation: Then, let's create a percent difference factor by combining our mean_close_30 factor with our mean_close_10 factor.
End of explanation
"""


def make_pipeline():

    mean_close_10 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=10)
    mean_close_30 = SimpleMovingAverage(inputs=[USEquityPricing.close], window_length=30)

    percent_difference = (mean_close_10 - mean_close_30) / mean_close_30

    return Pipeline(
        columns={
            'percent_difference': percent_difference
        }
    )

"""
Explanation: In this example, percent_difference is still a Factor even though it's composed as a combination of more primitive factors. We can add percent_difference as a column in our pipeline. Let's define make_pipeline to create a pipeline with percent_difference as a column (and not the mean close factors):
End of explanation
"""


result = run_pipeline(make_pipeline(), '2015-05-05', '2015-05-05')
result

"""
Explanation: Let's see what the new output looks like:
End of explanation
"""


