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