You have three expressions, which had been Piecewise and are now Which and which are used repeatedly
if function out of bounds then zero else if function in bounds then result
Changing those to
If function out of bounds then zero else result
does not change the calculation time because the time needed to evaluate 'function' is approximately zero compared to the time needed for the rest of your calculations.
You have a 600 kilobyte interpolating function that is not used in your example. Removing that only speeds up initialization slightly and makes no change in the timing of your repeated calculations. I assume that is needed and used in the real problem you are trying to solve.
You have a 2200 kilobyte interpolating function of very ill behaved data that is used inside an NIntegrate that is used inside a Sum that is used inside a Table in your example.
In that there are 7310 redundant instances of " + 0.*I" Removing those only speeds up your example code by half a second = 1%.
So to speed your code up substantially I think you need to focus on how you could speed up finding the integral of that interpolating function by 10 or 100 or 1000 times.
Looking at
ListPlot[data,Joined->True,PlotRange->All]
for some of the lists of data points that make up your interpolating function tends to make me think that this may be very challenging to do.
The only thought that I have, and I cannot tell if this would be feasible because there are too many parameters being passed into your interpolating function for me to untangle, would be for you to consider whether you might be able to spend the time up front to in effect calculate something somewhat like the indefinite integral from your data points. If this were feasible then you might be able to get the same result as the NIntegrate but by just subtracting two values from that constructed integral. I'm not suggesting you try to get a symbolic integral, but an interpolating function of that integral.