'Tests for `Factor.pearsonr` and `Factor.spearmanr` when passed another
2D factor instead of a Slice.'

@parameter_space(correlation_length=[2, 3, 4])
def test_factor_correlation_methods_two_factors(self, correlation_length):

    assets = self.assets
    dates = self.dates
    start_date = self.pipeline_start_date
    end_date = self.pipeline_end_date
    start_date_index = self.start_date_index
    end_date_index = self.end_date_index
    num_days = self.num_days
    run_pipeline = self.run_pipeline
    returns_masked_1 = Returns(window_length=5, inputs=[self.col], mask=AssetID().eq(1))
    returns_masked_2 = Returns(window_length=5, inputs=[self.col], mask=AssetID().eq(2))
    with self.assertRaises(IncompatibleTerms):
        returns_masked_1.pearsonr(target=returns_masked_2, correlation_length=correlation_length)
    with self.assertRaises(IncompatibleTerms):
        returns_masked_1.spearmanr(target=returns_masked_2, correlation_length=correlation_length)
    returns_5 = Returns(window_length=5, inputs=[self.col])
    returns_10 = Returns(window_length=10, inputs=[self.col])
    pearson_factor = returns_5.pearsonr(target=returns_10, correlation_length=correlation_length)
    spearman_factor = returns_5.spearmanr(target=returns_10, correlation_length=correlation_length)
    columns = {'pearson_factor': pearson_factor, 'spearman_factor': spearman_factor}
    pipeline = Pipeline(columns=columns)
    results = run_pipeline(pipeline, start_date, end_date)
    pearson_results = results['pearson_factor'].unstack()
    spearman_results = results['spearman_factor'].unstack()
    columns = {'returns_5': returns_5, 'returns_10': returns_10}
    results = run_pipeline(Pipeline(columns=columns), dates[(start_date_index - (correlation_length - 1))], dates[end_date_index])
    returns_5_results = results['returns_5'].unstack()
    returns_10_results = results['returns_10'].unstack()
    expected_pearson_results = full_like(pearson_results, nan)
    expected_spearman_results = full_like(spearman_results, nan)
    for day in range(num_days):
        todays_returns_5 = returns_5_results.iloc[day:(day + correlation_length)]
        todays_returns_10 = returns_10_results.iloc[day:(day + correlation_length)]
        for (asset, asset_returns_5) in todays_returns_5.iteritems():
            asset_column = (int(asset) - 1)
            asset_returns_10 = todays_returns_10[asset]
            expected_pearson_results[(day, asset_column)] = pearsonr(asset_returns_5, asset_returns_10)[0]
            expected_spearman_results[(day, asset_column)] = spearmanr(asset_returns_5, asset_returns_10)[0]
    expected_pearson_results = DataFrame(data=expected_pearson_results, index=dates[start_date_index:(end_date_index + 1)], columns=assets)
    assert_frame_equal(pearson_results, expected_pearson_results)
    expected_spearman_results = DataFrame(data=expected_spearman_results, index=dates[start_date_index:(end_date_index + 1)], columns=assets)
    assert_frame_equal(spearman_results, expected_spearman_results)
