title: Fitting a curve to a power-law distribution with curve_fit does not work
body: <p>I am trying to find a curve fitting my data that visually seem to have a power law distribution. </p>
  
  <p><a href="https://i.stack.imgur.com/gmlU7.png" rel="noreferrer"><img src="https://i.stack.imgur.com/gmlU7.png" alt="enter image description here"></a></p>
  
  <p>I hoped to utilize scipy.optimize.curve_fit, but no matter what function or data normalization I try, I am getting either a RuntimeError (parameters not found or overflow) or a curve that does not fit my data even remotely. Please help me to figure out what I am doing wrong here. </p>
  
  <pre><code>%matplotlib inline
  import numpy as np
  import pandas as pd
  import matplotlib.pyplot as plt
  from scipy.optimize import curve_fit
  
  df = pd.DataFrame({
              'x': [ 1000, 3250, 5500, 10000, 32500, 55000, 77500, 100000, 200000 ],
              'y': [ 1100, 500, 288, 200, 113, 67, 52, 44, 5 ]
          })
  df.plot(x='x', y='y', kind='line', style='--ro', figsize=(10, 5))
  
  def func_powerlaw(x, m, c, c0):
      return c0 + x**m * c
  
  target_func = func_powerlaw
  
  X = df['x']
  y = df['y']
  
  popt, pcov = curve_fit(target_func, X, y)
  
  plt.figure(figsize=(10, 5))
  plt.plot(X, target_func(X, *popt), '--')
  plt.plot(X, y, 'ro')
  plt.legend()
  plt.show()
  </code></pre>
  
  <p>Output</p>
  
  <pre><code>---------------------------------------------------------------------------
  RuntimeError                              Traceback (most recent call last)
  &lt;ipython-input-243-17421b6b0c14&gt; in &lt;module&gt;()
       18 y = df['y']
       19 
  ---&gt; 20 popt, pcov = curve_fit(target_func, X, y)
       21 
       22 plt.figure(figsize=(10, 5))
  
  /Users/evgenyp/.virtualenvs/kindle-dev/lib/python2.7/site-packages/scipy/optimize/minpack.pyc in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, **kwargs)
      653         cost = np.sum(infodict['fvec'] ** 2)
      654         if ier not in [1, 2, 3, 4]:
  --&gt; 655             raise RuntimeError("Optimal parameters not found: " + errmsg)
      656     else:
      657         res = least_squares(func, p0, args=args, bounds=bounds, method=method,
  
  RuntimeError: Optimal parameters not found: Number of calls to function has reached maxfev = 800.
  </code></pre>