Known facts: Weekend sales rose. A promotion ran. Weather was good. These co-occurred; nothing else is observed.
Hypotheses only: Promotion drove the lift; weather did; they interacted; or a third factor (payday, event, seasonality) did. Correlation ≠ causation.
Data to distinguish: Historical weekend sales with promo/weather combinations (both, promo-only, weather-only, neither). Add controls (day-of-week, holidays, competitor activity). Run difference-in-differences or OLS:
import statsmodels.api as sm
# df: sales, promo (0/1), weather (score), controls
X = sm.add_constant(df[['promo','weather']])
print(sm.OLS(df.sales, X).fit().summary())
Compare coefficients and interactions; if promo remains significant after weather/controls, it is more likely causal. Randomized promo timing would be strongest.