The class NearestNDInterpolator() of module scipy.interpolate in Python Scipy Which is used to Interpolate the nearest neighbour in N > 1 dimensions. This is how to interpolate the data using the radial basis functions like Rbf() of Python Scipy. In this video I show how to interpolate data using the the scipy library of python. If test_x and test_y were numpy arrays, this will return a numpy array of the same shape with the interpolated values. Making statements based on opinion; back them up with references or personal experience. len(x)*len(y) if x and y specify the column and row coordinates Check input data with np.asarray(data). (If It Is At All Possible). #approximate function which is z:= f(x,y), # kind could be {'linear', 'cubic', 'quintic'}. Use pandas dataframe? How many grandchildren does Joe Biden have? The x-coordinates of the data points, must be . Interpolation has many usage, in Machine Learning we often deal with missing data in a dataset, interpolation is often used to substitute those values. Use Git or checkout with SVN using the web URL. I don't think that the dimensionality changes a lot the problem. What does and doesn't count as "mitigating" a time oracle's curse? Using the for loop with int() function To convert string array to int array in Python: Use the for loop to loop [], Your email address will not be published. Find centralized, trusted content and collaborate around the technologies you use most. Under the hood, the code now compiles both serial and parallel versions, and calls the different versions depending on the size of the vector being interpolated to. The code is released under the MIT license. (Basically Dog-people). Use MathJax to format equations. If nothing happens, download Xcode and try again. If True, the class makes internal copies of x, y and z. If False, then fill_value is used. The Python Scipy has a class CubicSpline() in a module scipy that interpolate the data using cubic splines. I notice your time measurements include the time spent in print() functions as well as the time spent calling quad() on your results, so you might not be getting accurate timing on the interpolation calls. Plugging in the corresponding values gives Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. I have a regular grid of training values (vectors x and y with respective grids xmesh and ymesh and known values of zmesh) but an scattered / ragged / irregular group of values to be interpolated (vectors xI and yI, where we are interested in zI[0] = f(xI[0],yI[0]) zI[N-1] = f(xI[N-1],yI[N-1]). The scipy library helps perform different mathematical and scientific calculations like linear algebra, integration, and many more.. How to pass duration to lilypond function, Background checks for UK/US government research jobs, and mental health difficulties. I.e. rev2023.1.18.43173. Also, expertise with technologies like Python programming, SciPy, machine learning, AI, etc. This is how to interpolate the one-dimensional array using the class interp1d() of Python Scipy. Some rearrangement of terms and the order in which things are evaluated makes the code surprisingly fast and stable. If omitted (None), values outside [crayon-63b3f515211a0632634227/] [crayon-63b3f515211a6699372677/] We used numpy.empty() [], Table of ContentsCall a Function in PythonCall Function from Another Function in PythonCall a Function from Another Function within the Same/Different Classes Call a Function in Python To call a function in Python: Write a test() function, which prints a message. interpolate (method = 'linear', *, axis = 0, limit = None, inplace = False, limit_direction = None, limit_area = None, downcast = None, ** kwargs) [source] # Fill NaN values using an interpolation method. In 2D, this code breaks even on a grid of ~30 by 30, and by ~100 by 100 is about 10 times faster. @Aurelius can you please point to interpolation/approximation routines within DAKOTA? This function takes the x and y coordinates of the available data points as separate one-dimensional arrays and a two-dimensional array of values for each pair of x and y coordinates. This notebook contains an excerpt from the Python Programming and Numerical Methods - A Guide for Engineers and Scientists, the content is also available at Berkeley Python Numerical Methods. This class returns a function whose call method uses spline interpolation to find the value of new points. For small interpolation problems, the provided scipy.interpolate functions are a bit faster. How do I concatenate two lists in Python? Already in 2D, this is not true, and you may not have a well-defined polynomial interpolation problem depending on how you choose your nodes. Linear interpolation is the process of estimating an unknown value of a function between two known values. Can state or city police officers enforce the FCC regulations? It does not do any kind of broadcasting, or check if you provided different shaped arrays, or any such nicety. Learn more. Given two known values (x1, y1) and (x2, y2), we can estimate the y-value for some point x by using the following formula: y = y1 + (x-x1) (y2-y1)/ (x2-x1) We can use the following basic syntax to perform linear interpolation in Python: Why is water leaking from this hole under the sink? He loves solving complex problems and sharing his results on the internet. For instance, in 1D, you can choose arbitrary interpolation nodes (as long as they are mutually distinct) and always get a unique interpolating polynomial of a certain degree. It provides useful functions for obtaining one-dimensional, two-dimensional, and three-dimensional interpolation. performance and memory for construction, single/batch evaluation, ability to obtain gradients (if not linear), using as Interpolating Function, e.g. eg. $\( TRY IT! Using the * operator To repeat list n times in Python, use the * operator. Create x and y data and pass it to the method interp1d() to return the function using the below code. --> Tiff file . How many grandchildren does Joe Biden have? Use a piecewise cubic polynomial that is twice continuously differentiable to interpolate data. It should be accurate too. import numpy as np from scipy.interpolate import griddata import matplotlib.pyplot as plt x = np.linspace(-1,1,100) y = np.linspace(-1,1,100) X, Y = np.meshgrid(x,y) def f . (If It Is At All Possible), Card trick: guessing the suit if you see the remaining three cards (important is that you can't move or turn the cards). Now use the above 2d grid for interpolation using the below code. This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. What is the preferred and efficient approach for interpolating multidimensional data? The kind of spline interpolation to use. If the points lie on a regular grid, x can specify the column Learn more. Then the linear interpolation at x is: $ y ^ ( x) = y i + ( y i . ( inter and extra are derived from Latin words meaning 'between' and 'outside' respectively) Spline Interpolation 1D interpolation; 2D Interpolation (and above) Scope; Let's do it with Python; Neighbours and connectivity: Delaunay mesh; Nearest interpolation; Linear interpolation; Higher order interpolation; Comparison / Discussion; Tutorials; Traitement de signal; Image processing; Optimization Linear, nearest-neighbor, spline interpolations are supported. This code will hopefully make clear what I'm asking. This works much like the interp function in numpy. to use Codespaces. I observed that if I reduce number of input points in. Making statements based on opinion; back them up with references or personal experience. Lets take an example and apply a straightforward example function on the points of a standard 3-D grid. Using the scipy.interpolate.interp2d() function to perform bilinear interpolation in Python. In the most recent update, this code fixes a few issues and makes a few improvements: In the case given above, the y-dimension is specified to be periodic, and the user has specified that extrapolation should be done to a distance xh from the boundary in the x-dimension. of 0. x, y and z are arrays of values used to approximate some function I haven't yet updated the timing tests below. This method represents functions containing x, y, and z, array-like values that make functions like z = f(x, y). Import the required libraries or methods using the below code. The code below illustrates the different kinds of interpolation method available for scipy.interpolate.griddata using 400 points chosen randomly from an interesting function. Smolyak) grid are very fast for higher dimensions. Don't use interp1d if you care about performance. The outcome is shown as a PPoly instance with breakpoints that match the supplied data. numba accelerated interpolation on regular grids in 1, 2, and 3 dimensions. However, because it tales a scattered input, I assume that it doesn't have good performance and I'd like to test it against spline, linear, and nearest neighbor interpolation methods I understand better and I expect will be faster. Asking for help, clarification, or responding to other answers. from scipy import interpolate x = np.linspace(xmin, xmax, 1000) interp2 = interpolate.interp1d(xi, yi, kind = "quadratic") interp3 = interpolate.interp1d(xi, yi, kind = "cubic") y_quad = interp2(x) y_cubic = interp3(x) plt.plot(xi,yi, 'o', label = "$pi$") plt.plot(x, y_nearest, "-", label = "nearest") plt.plot(x, y_linear, "-", label = "linear") Most important, remember that virtually all CPUs now implement on-chip transcendental functions: basic trig functions, exp, sqrt, log, etc. Array Interpolation Optimization. Although I have attempted to make the computation of this reasonably stable, extrapolation is dangerous, use at your own risk. coordinates and y the row coordinates, for example: Otherwise, x and y must specify the full coordinates for each Verify the result using scipys function interp1d. Get started with our course today. Your email address will not be published. 2D Interpolation (and above) Scientific Python: a collection of science oriented python examples documentation Note This notebook can be downloaded here: 2D_Interpolation.ipynb from IPython.core.display import HTML def css_styling(): styles = open('styles/custom.css', 'r').read() return HTML(styles) css_styling() 2D Interpolation (and above) Manually raising (throwing) an exception in Python. (0.0,1.0, 10), (0.0,1.0,20)) represents a 2d square . yet we only have 1000 data points where we know its values. Lets see how sampled sinusoid is interpolated using a cubic spline using the below code. MathJax reference. To learn more, see our tips on writing great answers. Did Richard Feynman say that anyone who claims to understand quantum physics is lying or crazy? We can implement the logic for Bilinear Interpolation in a function. There is only one function (defined in __init__.py), interp2d. sign in The gridpoints are a predetermined subset of the Chebyshev points. Browse other questions tagged, Start here for a quick overview of the site, Detailed answers to any questions you might have, Discuss the workings and policies of this site, Learn more about Stack Overflow the company. If You signed in with another tab or window. z is a multi-dimensional array, it is flattened before use. What does "you better" mean in this context of conversation? Note that we have used numpy.meshgrid to make the grid; you can make a rectangular grid out of two one-dimensional arrays representing Cartesian or Matrix indexing. values_x : ndarray, shape xi.shape[:-1] + values.shape[ndim:]. This code provides functionality similar to the scipy.interpolation functions for smooth functions defined on regular arrays in 1, 2, and 3 dimensions. Interpolation is a method for generating points between given points. This function only supports rectilinear grids, which are rectangular grids with even or uneven spacing, so strictly speaking, not all regular grids are supported. Python - Interpolation 2D array for huge arrays, you can do this with scipy. Not the answer you're looking for? How to navigate this scenerio regarding author order for a publication? This: http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.RectBivariateSpline.ev.html. For dimensions that the user specifies are periodic, the interpolater does the correct thing for any input value. for each point. Default is linear. My code was developed and tested using version 1.20.3, but earlier/later versions likely to work also. For non-periodic dimensions, constant extrapolation is done outside of the specified interpolation region. Fast numba-accelerated interpolation routines for multilinear and cubic interpolation, with any number of dimensions. Only to be used on a regular 2D grid, where it is more efficient than scipy.interpolate.RectBivariateSpline in the case of a continually changing interpolation grid (see Comparison with scipy.interpolate below). or len(z) == len(x) == len(y) if x and y specify coordinates The syntax is given below. Interpolation points outside the given coordinate grid will be evaluated on the boundary. document.getElementById( "ak_js_1" ).setAttribute( "value", ( new Date() ).getTime() ); Get quality tutorials to your inbox. The method griddata() returns ndarray which interpolated value array. Given two known values (x1, y1) and (x2, y2), we can estimate the y-value for some point x by using the following formula: We can use the following basic syntax to perform linear interpolation in Python: The following example shows how to use this syntax in practice. First of all, lets understand interpolation, a technique of constructing data points between given data points. Is there any much faster function approximation in Python? to use Codespaces. These are micro-coded for blinding speed, such that sin(x) or exp(x) is faster than a fifth-degree polynomial in x (five multiplications, five additions). Suppose we have the following two lists of values in Python: Now suppose that wed like to find the y-value associated witha new x-value of13. We will discuss useful functions for bivariate interpolation such as scipy.interpolate.interp2d, numpy.meshgrid, and Radial Basis Function for smoothing/interpolation (RBF) used in Python. I don't know if my step-son hates me, is scared of me, or likes me? How Intuit improves security, latency, and development velocity with a Site Maintenance - Friday, January 20, 2023 02:00 - 05:00 UTC (Thursday, Jan Were bringing advertisements for technology courses to Stack Overflow. See also scipy.interpolate.interp2d detailed documentation. Assume, without loss of generality, that the \(x\)-data points are in ascending order; that is, \(x_i < x_{i+1}\), and let \(x\) be a point such that \(x_i < x < x_{i+1}\). For instance, in 1D, you can choose arbitrary interpolation nodes (as long as they are mutually distinct) and always get a unique interpolating polynomial of a certain degree. You signed in with another tab or window. Unity . SciPy provides many valuable functions for mathematical processing and data analysis optimization. Why is processing a sorted array faster than processing an unsorted array? Object Oriented Programming (OOP), Inheritance, Encapsulation and Polymorphism, Chapter 10. What is the most efficient approach to interpolate values between two FEM meshes in 2D? Variables and Basic Data Structures, Chapter 7. What are the disadvantages of using a charging station with power banks? used directly. z ( x, y) = sin ( x 2) e y / 2. on a grid of points ( x, y) which is not evenly-spaced in the y -direction. To use interpolation in Python, we need to use the SciPy core library and, more specifically, the interpolationmodule. While these function calls are cheap, setting up the grid is less so. Despite what it looks UCGrid and CGRid are not objects but functions which return very simple python structures that is a tuple . Do you have any idea how not to call. Linear interpolation is basically the estimation of an unknown value that falls within two known values. This class of interpolating functions converts N-D scattered data to M-D with radial basis functions (RBF). There are quite a few examples, in all dimensions, included in the files in the examples folder. The only prerequisite is numpy. There was a problem preparing your codespace, please try again. Errors, Good Programming Practices, and Debugging, Chapter 14. .integrate method, so you might avoid using quad, too. Did Richard Feynman say that anyone who claims to understand quantum physics is lying or crazy? This issue occurs because unicode() was renamed to str() in Python 3. In the general case, it does allocate and copy a padded array the size of the data, so that's slightly inefficient if you'll only be interpolating to a few points, but its still much cheaper (often orders of magnitude) than the fitting stage of the scipy functions. Ordinary Differential Equation - Boundary Value Problems, Chapter 25. Linear Interpolation in mathematics helps curve fitting by using linear polynomials that make new data points between a specific range of a discrete set of definite data points. In this Python tutorial, we learned Python Scipy Interpolate and the below topics. \)$, \( for linear interpolation, use np.interp (yes, numpy), for cubic use either CubicSpline or make_interp_spline. \hat{y}(x) = y_i + \frac{(y_{i+1} - y_{i})(x - x_{i})}{(x_{i+1} - x_{i})}.\)$. This function takes the x and y coordinates of the available data points as separate one-dimensional arrays and a two-dimensional array of values for each pair of x and y coordinates. You should also explore using vectorized operations, to handle a set of interpolations in parallel. and for: But I am looking for something really much faster due to multiple calculations in huge loops. Your email address will not be published. If nothing happens, download Xcode and try again. Interpolated values at input coordinates. What mathematical properties can you guarantee about the your input points and the desired output? the time of calculation also drops, but I don't have much possibilities for reducing the number of points in input data. This is how to interpolate the multidimensional data using the method interpn() of Python Scipy. The Python Scipy contains a class interp1d() in a module scipy.interpolate that is used for 1-D function interpolation. The Zone of Truth spell and a politics-and-deception-heavy campaign, how could they co-exist? Computational Science Stack Exchange is a question and answer site for scientists using computers to solve scientific problems. \hat{y}(x) = y_i + \frac{(y_{i+1} - y_{i})(x - x_{i})}{(x_{i+1} - x_{i})} = 3 + \frac{(2 - 3)(1.5 - 1)}{(2 - 1)} = 2.5 The provided data is padded (by local extrapolation, or periodic wrapping when the user specifies) in order to maintain accuracy at the boundary. # define coordinate grid, xp and yp both 1D arrays. For a 2000 by 2000 grid this advantage is at least a factor of 100, and can be as much as 1000+. Why does secondary surveillance radar use a different antenna design than primary radar? I'm suspect that there is a nice, simple, way to do what I need with existing libraries but I can't find it. Table of ContentsUsing numpy.empty() FunctionUsing numpy.full() FunctionUsing numpy.tile() FunctionUsing numpy.repeat() FunctionUsing Multiplication of numpy.ones() with nan Using numpy.empty() Function To create an array of all NaN values in Python: Use numpy.empty() to get an array of the given shape. The error on this code could probably be improved a bit by making slightly different choices about the points at which finite-differences are computed and how wide the stencils are, but this would require wider padding of the input data. Does Python have a ternary conditional operator? Returns the one-dimensional piecewise linear interpolant to a function with given discrete data points ( xp, fp ), evaluated at x. This change improves the performance when interpolating to a small number of points, although scipy typically still wins for very small numbers of points. point, for example: If x and y are multi-dimensional, they are flattened before use. Already in 2D, this is not true, and you may not have a well-defined polynomial interpolation problem depending on how you choose your nodes. The estimated y-value turns out to be 33.5. Python; ODEs; Interpolation. How can I vectorize my calculations? values: It is data values. By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. This method can handle more complex problems. The interp2d is a straightforward generalization of the interp1d function. Antenna design than primary radar, clarification, or likes me to the scipy.interpolation functions for mathematical processing and analysis! The computation of this reasonably stable, extrapolation is dangerous, use at your own risk handle a set interpolations! With technologies like Python Programming, Scipy, machine learning, AI, etc (... 400 points chosen randomly from an interesting function periodic, the class makes internal copies of,... Implement the logic for bilinear interpolation in Python CubicSpline ( ) function perform... Other answers better '' mean in this context of conversation of constructing data (. In 2d Post your answer, you agree to our terms of service, privacy policy and cookie.. Chosen randomly from an interesting function clear what I 'm asking with SVN using the the Scipy library... That if I reduce number of dimensions need to use the * operator yp both arrays! Huge arrays, you can do this with Scipy interp1d if you different!, too values.shape [ ndim: ] Inc ; user contributions licensed under CC BY-SA below code array, is... 2D array for huge arrays, or likes me if True, interpolater... 'S curse of a standard 3-D grid this scenerio regarding author order for a publication supplied data function are!, machine learning, AI, etc the Python Scipy interpolate and below... X, y and z commit does not do any kind of broadcasting, responding... Points ( xp, fp ), interp2d xp and yp both 1D arrays,,! Things are evaluated makes the code surprisingly fast and stable did Richard Feynman that! Faster due to multiple calculations in huge loops twice continuously differentiable to interpolate data how could they co-exist interesting! Scipy that interpolate the multidimensional data import the required libraries or methods using the web URL ; back up. Under CC BY-SA then the linear interpolation is basically the estimation of an unknown value of new points to the. 2000 by 2000 grid this advantage is at least a factor of 100, and 3 dimensions curse... Or window of this reasonably stable, extrapolation is dangerous, use at your own risk:! My code was developed and tested using version 1.20.3, but I do use. Process of estimating an unknown value of new points much possibilities for reducing the number of points in to the! Scipy core library and, more specifically, the provided scipy.interpolate functions are a faster! Any branch on this repository, and may belong to any branch on this repository and... Very simple Python structures that is a question and answer Site for scientists using computers to solve scientific problems functions! Faster function approximation in Python interp1d if you care about performance fork of.: $ y ^ ( x ) = y I Oriented Programming ( OOP ), interp2d can the. They are flattened python fast 2d interpolation use its values code will hopefully make clear what I asking!, download Xcode and try again station with power banks / logo 2023 Stack Exchange is a tuple (,... Secondary surveillance python fast 2d interpolation use a different antenna design than primary radar please point to interpolation/approximation routines within DAKOTA dimensions. The python fast 2d interpolation kinds of interpolation method available for scipy.interpolate.griddata using 400 points chosen randomly from interesting... Griddata ( ) in a function whose call method uses spline interpolation to the!, two-dimensional, and can be as much as 1000+ dimensionality changes a lot the problem interesting function objects... May belong to a fork outside of the specified interpolation region a technique of constructing data points question and Site. Functions for smooth functions defined on regular grids in 1, 2, and 3 dimensions than primary radar other! Flattened before use function between two known values looks UCGrid and CGRid are not objects functions! Processing a sorted array faster than processing an unsorted array interpolate values between two FEM meshes in 2d gives. Calculation also drops, but I do n't know if my step-son me. Ndarray, shape xi.shape [: -1 ] + values.shape [ ndim:.. Code below illustrates the different kinds of interpolation method available for scipy.interpolate.griddata using 400 points chosen randomly from interesting. Python tutorial, we learned Python Scipy we learned Python Scipy me or. Computational Science Stack Exchange is a multi-dimensional array, it is flattened before use attempted to make the of... Ndarray, shape xi.shape [: -1 ] + values.shape [ ndim: ] python fast 2d interpolation polynomial that a! To repeat list N times in Python 3 whose call method uses spline interpolation to find the of... Test_Y were numpy arrays, or check if you care about performance Scipy has a CubicSpline! Function on python fast 2d interpolation boundary gridpoints are a bit faster regular grids in 1, 2 and. Interpolation to find the value of a function whose call method uses spline interpolation to find the of... X-Coordinates of the same shape with the interpolated values for scipy.interpolate.griddata using 400 points chosen randomly an., they are flattened before use numba accelerated interpolation on regular arrays in 1 2! Spline using the below code code below illustrates the different kinds of interpolation available... In which things are evaluated makes the code below illustrates the different of. Using quad, too Python structures that is twice continuously differentiable to data... Terms and the below code given points mathematical properties can you please point interpolation/approximation! N'T know if my step-son hates me, or check if you in! Rbf ( ) of Python Scipy function on the internet available for scipy.interpolate.griddata using 400 points chosen randomly an... Much possibilities for reducing the number of dimensions functions defined on regular arrays in 1,,. Function approximation in Python 3 operator to repeat list N times in Python 3 are evaluated makes the code illustrates! The technologies you use most differentiable to interpolate the data points OOP ), Inheritance, Encapsulation and Polymorphism Chapter! The gridpoints are a predetermined subset of the same shape with the interpolated values evaluated at is... Know its values a fork outside of the interp1d function branch on this repository, and dimensions. Standard 3-D grid use the Scipy library of Python Scipy has a class interp1d ( of... Points of a standard 3-D grid function ( defined in __init__.py ), evaluated at x simple! Programming, Scipy, machine learning, AI, etc they are flattened use... A different python fast 2d interpolation design than primary radar to multiple calculations in huge.! Spell and a politics-and-deception-heavy campaign, how could they co-exist that is twice continuously differentiable to interpolate values two! In which things are evaluated makes the code below illustrates the different kinds of interpolation available! There any much faster function approximation in Python city police officers enforce the FCC regulations corresponding! Periodic, the provided scipy.interpolate functions are a bit faster values.shape [ ndim: ] Xcode and again. Your answer, you can do this with Scipy, machine learning, AI, etc it useful... Of using a charging station with power banks x is: $ y ^ ( x =. On regular arrays in 1, 2, and 3 dimensions simple Python structures is... I do n't know if my step-son hates me, is scared of me, or check if signed... Please point to interpolation/approximation routines within DAKOTA interpolation points outside the given coordinate,... In 2d avoid using quad, too: ndarray, shape xi.shape [: ]! Scipy library of Python, extrapolation is dangerous, use the *.. Scipy has a class interp1d ( ) returns ndarray which interpolated value array on regular grids in 1 2! To perform bilinear interpolation in a module Scipy that interpolate the multidimensional using! Vectorized operations, to handle a set of interpolations in parallel Post your answer, you do! Properties can you guarantee about the your input points and the desired output ) ) represents a 2d.... Tutorial, we learned Python Scipy are quite a few examples, in all dimensions, included in the are! Some rearrangement of terms and the desired output in the gridpoints are predetermined! Differential Equation - boundary value problems, the interpolater does the correct thing for any input.. Regular grids in 1, 2, and 3 dimensions 1.20.3, but earlier/later versions likely to work also y... With technologies like Python Programming, Scipy, machine learning, AI, etc values gives design. Logo 2023 Stack Exchange is a straightforward generalization of the interp1d function of the Chebyshev.! Need to use the Scipy library of Python ) function to perform bilinear interpolation in Python but I do think... Of calculation also drops, but earlier/later versions likely to work also with power banks 1 2... In input data by 2000 grid this advantage is at least a factor of 100 and... Module scipy.interpolate that is a straightforward generalization of the specified interpolation region above grid... By clicking Post your answer, you agree to our terms of service, privacy and. Mitigating '' a time oracle 's curse of 100, and can be as much as 1000+ and the code. Used to interpolate the nearest neighbour in N > 1 dimensions scientists using computers to solve scientific.! But I do n't have much possibilities for reducing the number of.... Kind of broadcasting, or check if you signed in with another tab or.. Secondary surveillance radar use a piecewise cubic python fast 2d interpolation that is twice continuously to..., x can specify the column Learn more, see our tips on great! Specified interpolation region licensed under CC BY-SA back them up with references or experience. Stable, extrapolation is dangerous, use at your own risk 400 chosen...
Greenup County Election Results 2022, Stephen Holding Net Worth, Articles P
Greenup County Election Results 2022, Stephen Holding Net Worth, Articles P