Reduce redirection in ops
Among other things, this will make it easier to handle the sparse vs non-sparse Frame ops in one place.
# [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/19649?src=pr&el=h1) Report
> Merging [#19649](https://codecov.io/gh/pandas-dev/pandas/pull/19649?src=pr&el=desc) into [master](https://codecov.io/gh/pandas-dev/pandas/commit/718d0679600fa025872d8b66c198a6781b312d70?src=pr&el=desc) will **decrease** coverage by `<.01%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/pandas-dev/pandas/pull/19649/graphs/tree.svg?src=pr&token=eZ4WkYLtcO&width=650&height=150)](https://codecov.io/gh/pandas-dev/pandas/pull/19649?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master   #19649      +/-   ##
==========================================
- Coverage    91.6%   91.59%   -0.01%     
==========================================
  Files         150      150              
  Lines       48864    48830      -34     
==========================================
- Hits        44762    44728      -34     
  Misses       4102     4102
```

| Flag | Coverage Δ | |
|---|---|---|
| #multiple | `89.97% <100%> (-0.01%)` | :arrow_down: |
| #single | `41.76% <100%> (ø)` | :arrow_up: |

| [Impacted Files](https://codecov.io/gh/pandas-dev/pandas/pull/19649?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [pandas/core/sparse/array.py](https://codecov.io/gh/pandas-dev/pandas/pull/19649/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvc3BhcnNlL2FycmF5LnB5) | `91.4% <ø> (+0.02%)` | :arrow_up: |
| [pandas/core/sparse/series.py](https://codecov.io/gh/pandas-dev/pandas/pull/19649/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvc3BhcnNlL3Nlcmllcy5weQ==) | `95.26% <ø> (ø)` | :arrow_up: |
| [pandas/core/panel.py](https://codecov.io/gh/pandas-dev/pandas/pull/19649/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvcGFuZWwucHk=) | `97.3% <100%> (ø)` | :arrow_up: |
| [pandas/core/ops.py](https://codecov.io/gh/pandas-dev/pandas/pull/19649/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvb3BzLnB5) | `95.57% <100%> (-0.88%)` | :arrow_down: |
| [pandas/plotting/\_converter.py](https://codecov.io/gh/pandas-dev/pandas/pull/19649/diff?src=pr&el=tree#diff-cGFuZGFzL3Bsb3R0aW5nL19jb252ZXJ0ZXIucHk=) | `65.22% <0%> (-1.74%)` | :arrow_down: |
| [pandas/core/indexes/datetimes.py](https://codecov.io/gh/pandas-dev/pandas/pull/19649/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvaW5kZXhlcy9kYXRldGltZXMucHk=) | `95.25% <0%> (-0.07%)` | :arrow_down: |
| [pandas/core/frame.py](https://codecov.io/gh/pandas-dev/pandas/pull/19649/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvZnJhbWUucHk=) | `97.17% <0%> (-0.06%)` | :arrow_down: |
| [pandas/core/indexes/period.py](https://codecov.io/gh/pandas-dev/pandas/pull/19649/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvaW5kZXhlcy9wZXJpb2QucHk=) | `92.99% <0%> (-0.06%)` | :arrow_down: |
| [pandas/core/indexes/category.py](https://codecov.io/gh/pandas-dev/pandas/pull/19649/diff?src=pr&el=tree#diff-cGFuZGFzL2NvcmUvaW5kZXhlcy9jYXRlZ29yeS5weQ==) | `97.26% <0%> (-0.06%)` | :arrow_down: |
| ... and [19 more](https://codecov.io/gh/pandas-dev/pandas/pull/19649/diff?src=pr&el=tree-more) | |

------

[Continue to review full report at Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/19649?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/pandas-dev/pandas/pull/19649?src=pr&el=footer). Last update [718d067...9355ce2](https://codecov.io/gh/pandas-dev/pandas/pull/19649?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).
 #19613 and #19611 should both be ready; want to make sure they don't fall off the radar screen. I think this is the only outstanding PR that os core.ops-centric.  Let's try to close this out before moving forward with the remaining series/frame-implementation-de-duplication. if you can rebase and then ping on green. semi-ping.  clicking through to appveyor it shows green and said it finished an hour ago; the icon hasn't updated here though. thanks. ideally would like to see a PR to simplify this further as my above comment. The appveyor build from 9355ce2 isn't _actually_ still running is it?  If so could that be clogging the appveyor pipeline?