It is very common in scientific applications to have to compute the derivative of a function specified by data. Particularly in the case of experimental data, substantial noise or imprecision may be present. Straightforward techniques for numerically calculating derivatives will amplify this noise, often so much that the result is useless. We propose a new algorithm that can give accurate results even in the presence of a large amount of noise. This approach also has the benefit of not forcing the result to be continuous, which allows for the detection of corners or edges in the data.