np.float16 support
open issues & xref
* (fillna) #19205 
* #10382
* #15517
* #2511 
* #16686 



 think this should be a bug. When calling the fill_na method in a pandas Series of type np.float16 it raises a ValueError, because of invalid dtype. May be there is a reason for that I can't guess, but I think it's a bug because it does not detect np.float16 as a subclass of np.floating. I'm using Python 3.4, didn't test if it also fails in Python 2. It fails for both methods, 'pad' and 'bfill'.

For np.float32 and np.float64 it works correctly. This code reproduces the error with np.float16:

```
import numpy as np
import pandas as pd

s = pd.Series(np.random.randn(100), dtype=np.float16)
rets = s.fillna(method='bfill')
```

and this is the ValueError it generates:

---

```
ValueError                                Traceback (most recent call last)
<ipython-input-133-5610749057ca> in <module>()
      3 
      4 s = pd.Series(np.random.randn(100), dtype=np.float16)
----> 5 rets = s.fillna(method='bfill')

/opt/anaconda3/lib/python3.4/site-packages/pandas/core/generic.py in fillna(self, value, method, axis, inplace, limit, downcast)
   2227                                               inplace=inplace,
   2228                                               coerce=True,
-> 2229                                               downcast=downcast)
   2230         else:
   2231             if method is not None:

/opt/anaconda3/lib/python3.4/site-packages/pandas/core/internals.py in interpolate(self, **kwargs)
   2223 
   2224     def interpolate(self, **kwargs):
-> 2225         return self.apply('interpolate', **kwargs)
   2226 
   2227     def shift(self, **kwargs):

/opt/anaconda3/lib/python3.4/site-packages/pandas/core/internals.py in apply(self, f, axes, filter, do_integrity_check, **kwargs)
   2190                                                  copy=align_copy)
   2191 
-> 2192             applied = getattr(b, f)(**kwargs)
   2193 
   2194             if isinstance(applied, list):

/opt/anaconda3/lib/python3.4/site-packages/pandas/core/internals.py in interpolate(self, method, axis, index, values, inplace, limit, fill_value, coerce, downcast, **kwargs)
    648                                                fill_value=fill_value,
    649                                                coerce=coerce,
--> 650                                                downcast=downcast)
    651         # try an interp method
    652         try:

/opt/anaconda3/lib/python3.4/site-packages/pandas/core/internals.py in _interpolate_with_fill(self, method, axis, inplace, limit, fill_value, coerce, downcast)
    693                                     limit=limit,
    694                                     fill_value=fill_value,
--> 695                                     dtype=self.dtype)
    696         values = self._try_coerce_result(values)
    697 

/opt/anaconda3/lib/python3.4/site-packages/pandas/core/common.py in interpolate_2d(values, method, axis, limit, fill_value, dtype)
   1576         values = transf(pad_2d(transf(values), limit=limit, mask=mask, dtype=dtype))
   1577     else:
-> 1578         values = transf(backfill_2d(transf(values), limit=limit, mask=mask, dtype=dtype))
   1579 
   1580     # reshape back

/opt/anaconda3/lib/python3.4/site-packages/pandas/core/common.py in backfill_2d(values, limit, mask, dtype)
   1378 
   1379     if _method is None:
-> 1380         raise ValueError('Invalid dtype for backfill_2d [%s]' % dtype.name)
   1381 
   1382     if mask is None:

ValueError: Invalid dtype for backfill_2d [float16]
```

And my guess is that the problem is this part of the code, I can debug it once you confirm this is a bug:
https://github.com/pydata/pandas/blob/master/pandas/core/common.py#L2459
