How to make scipy.interpolate give a an extrapolated result beyond the input range?
I'm trying to port a program which currently uses a handrolled C++ interpolator (developed by a mathematician colleage) over to use the interpolators provided by scipy. I'd like to use or wrap the scipy interpolator so that it's behavior is as close as possible behavior to our old interpolator. A key difference between the two functions is that in our original interpolator  if the input value is above or below the input range, our original interpolator will extrapolate the result. If you try this with the scipy interpolator it raises a ValueError. Consider this program as an example: # EXAMPLE import numpy as np from scipy import interpolate x = np.arange(0,10) y = np.exp(x/3.0) f = interpolate.interp1d(x, y) print f(9) print f(11) ##### Causes ValueError, because it's greater than max(x) # END OF EXAMPLE In the example above, I'd like the last line not to raise a ValueError, but to return a value calculated from the gradient of the line between f(x[2]) and f(x[1]). Is there a sensible way to make it so that instead of crashing, the final line will simply do a linear extrapolate, continuing the gradients defined by the first and last pairs of input datapoints to infinity? I know that this is a simple enough function to write myself, however I'd rather not reinvent the wheel, especially as if I wanted to introduce new basic math functions into our library they would need to be validated by a number of gatekeepers before they were permitted into our library! I'm on Python 2.4, scipy 0.7 on Windows XP, 32bit Incidentally, I have seen this tutorial which has a "left" and "right" argument on the interpolator. This does not seem to exist on any version of the interp1d function which I can use on Windows Python 2.4  can anybody speculate which version of Scipy this tutorial is intended for? http://projects.scipy.org/scipy/browser/branches/Interpolate1D/docs/tuto rial.rst?rev=4591 Sal This email does not create a legal relationship between any member of the Crédit Agricole group and the recipient or constitute investment advice. The content of this email should not be copied or disclosed (in whole or part) to any other person. It may contain information which is confidential, privileged or otherwise protected from disclosure. If you are not the intended recipient, you should notify us and delete it from your system. Emails may be monitored, are not secure and may be amended, destroyed or contain viruses and in communicating with us such conditions are accepted. Any content which does not relate to business matters is not endorsed by us. Crédit Agricole Corporate and Investment Bank is authorised by the Comité des Etablissements de Crédit et des Entreprises d'Investissement (CECEI) and supervised by the Commission Bancaire in France and subject to limited regulation by the Financial Services Authority. Details about the extent of our regulation by the Financial Services Authority are available from us on request. Crédit Agricole Corporate and Investment Bank is incorporated in France with limited liability and registered in England & Wales. Registration number: FC008194. Registered office: Broadwalk House, 5 Appold Street, London, EC2A 2DA.
On Fri, Apr 30, 2010 at 12:18 PM, Salim, Fadhley (CACIB) <fadhley.salim@cacib.com> wrote:
I'm trying to port a program which currently uses a handrolled C++ interpolator (developed by a mathematician colleage) over to use the interpolators provided by scipy. I'd like to use or wrap the scipy interpolator so that it's behavior is as close as possible behavior to our old interpolator.
A key difference between the two functions is that in our original interpolator  if the input value is above or below the input range, our original interpolator will extrapolate the result. If you try this with the scipy interpolator it raises a ValueError. Consider this program as an example:
# EXAMPLE import numpy as np from scipy import interpolate
x = np.arange(0,10) y = np.exp(x/3.0) f = interpolate.interp1d(x, y)
print f(9) print f(11) ##### Causes ValueError, because it's greater than max(x) # END OF EXAMPLE
In the example above, I'd like the last line not to raise a ValueError, but to return a value calculated from the gradient of the line between f(x[2]) and f(x[1]).
Is there a sensible way to make it so that instead of crashing, the final line will simply do a linear extrapolate, continuing the gradients defined by the first and last pairs of input datapoints to infinity?
I know that this is a simple enough function to write myself, however I'd rather not reinvent the wheel, especially as if I wanted to introduce new basic math functions into our library they would need to be validated by a number of gatekeepers before they were permitted into our library!
I'm on Python 2.4, scipy 0.7 on Windows XP, 32bit
Incidentally, I have seen this tutorial which has a "left" and "right" argument on the interpolator. This does not seem to exist on any version of the interp1d function which I can use on Windows Python 2.4  can anybody speculate which version of Scipy this tutorial is intended for? http://projects.scipy.org/scipy/browser/branches/Interpolate1D/docs/tuto rial.rst?rev=4591
Interesting question, after renaming, the branch is at http://projects.scipy.org/scipy/browser/branches/interpolate?rev= Does anyone know what the purpose and status of this branch is? Josef
Sal
This email does not create a legal relationship between any member of the Crédit Agricole group and the recipient or constitute investment advice. The content of this email should not be copied or disclosed (in whole or part) to any other person. It may contain information which is confidential, privileged or otherwise protected from disclosure. If you are not the intended recipient, you should notify us and delete it from your system. Emails may be monitored, are not secure and may be amended, destroyed or contain viruses and in communicating with us such conditions are accepted. Any content which does not relate to business matters is not endorsed by us.
Crédit Agricole Corporate and Investment Bank is authorised by the Comité des Etablissements de Crédit et des Entreprises d'Investissement (CECEI) and supervised by the Commission Bancaire in France and subject to limited regulation by the Financial Services Authority. Details about the extent of our regulation by the Financial Services Authority are available from us on request. Crédit Agricole Corporate and Investment Bank is incorporated in France with limited liability and registered in England & Wales. Registration number: FC008194. Registered office: Broadwalk House, 5 Appold Street, London, EC2A 2DA.
_______________________________________________ NumPyDiscussion mailing list NumPyDiscussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpydiscussion
participants (2)

josef.pktd＠gmail.com

Salim, Fadhley (CACIB)