Why non-causal?
If you have your dataset in memory, you are free to take make output[100] depend on input[105] if you so please. There's nothing about Python or signal processing that prevents you from mathematically doing that, as long as you recognize that you'll need to either truncate both edges or apply suitable padding.
Mathematically, you simply convolve with your desired impulse response. For example, a length-3 rectangular moving average impulse response centered about 0 (non-causally) would be represented by y[n] = x[n-1]/3 + x[n]/3 + x[n+1]/3. We call the values [1/3, 1/3, 1/3]the coefficients of the non-causal FIR filter we have chosen. Actually designing a filter by choosing the best coefficients is a [mathematically complex and rich problem](https://en.wikipedia.org/wiki/Finite_impulse_response#Filter_design), but you may always obtain a MATLAB license and utilize a tool such asfdatool` to build the filter to your frequency response specifications.
For a physical system or realtime sample-by-sample processing (e.g. on a microcontroller running CircuitPython), this cannot be realized of course. Assuming a discrete transformation and an otherwise stable system, the non-causality shows up in the Z-transform as elements of the form z^n for positive n. By adding delays (i.e. multiplying by z-1), you can make your non-causal response causal, at the expense of that added delay. Looking at our prior example, such a delay would correspond to making output[100] still depend on input[105], but making the 100th output sample only available to the following stage after the 105th input sample has been received.
As for making your data smoother or not smoother, an LTI smoothing filter will generally always blunt your edges. You can either design a filter with the appropriate characteristics to trade off the blunting of edges with smoothing requirements, or if the data is suitable, use a non-LTI processing approach.
I am trying to implement a degree-3 noncausal moving average filter (in Python) to be applied to one of the signals. I do have an idea about moving average but I am new to signal processing. As of now, I know that a smoothing technique like an MA would reduce out the noise in the data but then it would make the sharp transitions in the data increasingly blunt. But then my question is how is this thing taken care of when we go to introduce non-causality in the system.
From what I understand about non-causal system is a system whose output not only depends on past and present inputs but also future inputs. I am trying to understand things in depth here. But i think i am stuck due to knowledge gap. I would be grateful if there are any good references or resources which I could use for a better understanding.