Ответ 1
Вместо замены '# DIV/0!' вручную, чтобы данные были числовыми. Это делает сразу две вещи: это гарантирует, что результат будет числовым (not str), и он заменяет NaN
для любых записей, которые не могут быть проанализированы как число. Пример:
In [5]: Series([1, 2, 'blah', '#DIV/0!']).convert_objects(convert_numeric=True)
Out[5]:
0 1
1 2
2 NaN
3 NaN
dtype: float64
Это должно исправить вашу ошибку. Но, по общему вопросу о подгонке строки к данным, я поддерживаю два способа сделать это, что мне нравится лучше, чем полифит. Второй из них более надежный (и может потенциально возвращать гораздо более подробную информацию о статистике), но для этого требуются statsmodels.
from scipy.stats import linregress
def fit_line1(x, y):
"""Return slope, intercept of best fit line."""
# Remove entries where either x or y is NaN.
clean_data = pd.concat([x, y], 1).dropna(0) # row-wise
(_, x), (_, y) = clean_data.iteritems()
slope, intercept, r, p, stderr = linregress(x, y)
return slope, intercept # could also return stderr
import statsmodels.api as sm
def fit_line2(x, y):
"""Return slope, intercept of best fit line."""
X = sm.add_constant(x)
model = sm.OLS(y, X, missing='drop') # ignores entires where x or y is NaN
fit = model.fit()
return fit.params[1], fit.params[0] # could also return stderr in each via fit.bse
Чтобы сделать это, сделайте что-то вроде
m, b = fit_line2(x, y)
N = 100 # could be just 2 if you are only drawing a straight line...
points = np.linspace(x.min(), x.max(), N)
plt.plot(points, m*points + b)