def fit(x, y, funcstr, *args, **kwargs): x = pandas.Series(array(x)) y = pandas.Series(array(y)) x, y = remove_nan(x, y) if funcstr == 'linear': result = fit(x, y, 'power', 1) result.type = 'linear' elif funcstr == 'quadratic': result = fit(x, y, 'power', 2) result.type = 'quadratic' elif funcstr == 'exponential': y2 = np.log(y) result = fit(x, y2, 'linear') result.params = [np.exp(result.params[1]), result.params[0]] p = result.params labelstr = 'y= %.4e exp(%.4e x)' % (p[0], p[1]) result.label = labelstr result.type = 'exponential' elif funcstr == 'power': data = pandas.DataFrame({'x': x, 'y': y}) power = args[0] keys = ['x'] for i in range(power - 1): exponent = (i + 2) key = 'x%d' % exponent data[key] = x**exponent keys.append(key) result2 = pandas.ols(y=data['y'], x=data[keys]) keys.reverse() keys += ['intercept'] p = [result2.beta[s] for s in keys] labelstr = 'y= ' for i, pv in enumerate(p): pw = len(p) - i - 1 if pw == 1: labelstr += '%.4e x + ' % (pv) elif pw == 0: labelstr += '%.4e + ' % (pv) else: labelstr += '%.4e x^%d + ' % (pv, pw) labelstr = labelstr[:-3] # take off the last + result = Struct() result.params = p result.type = 'power' result.label = labelstr result.pandas_result = result2 else: raise ValueError('Unknown fit name %s' % funcstr) return result
def fit(x,y,funcstr,*args,**kwargs): x=pandas.Series(array(x)) y=pandas.Series(array(y)) x,y=remove_nan(x,y) if funcstr=='linear': result=fit(x,y,'power',1) result.type='linear' elif funcstr=='quadratic': result=fit(x,y,'power',2) result.type='quadratic' elif funcstr=='exponential': y2=np.log(y) result=fit(x,y2,'linear') result.params=[np.exp(result.params[1]),result.params[0]] p=result.params labelstr='y= %.4e exp(%.4e x)' % (p[0],p[1]) result.label=labelstr result.type='exponential' elif funcstr=='power': data=pandas.DataFrame({'x':x,'y':y}) power=args[0] keys=['x'] for i in range(power-1): exponent=(i+2) key='x%d' % exponent data[key] = x**exponent keys.append(key) result2=pandas.ols(y=data['y'],x=data[keys]) keys.reverse() keys+=['intercept'] p=[result2.beta[s] for s in keys] labelstr='y= ' for i,pv in enumerate(p): pw=len(p)-i-1 if pw==1: labelstr+='%.4e x + ' % (pv) elif pw==0: labelstr+='%.4e + ' % (pv) else: labelstr+='%.4e x^%d + ' % (pv,pw) labelstr=labelstr[:-3] # take off the last + result=Struct() result.params=p result.type='power' result.label=labelstr result.pandas_result=result2 else: raise ValueError,'Unknown fit name %s' % funcstr return result