first commit

This commit is contained in:
ilgazca
2025-07-30 16:12:03 +03:00
commit db5d46760a
13 changed files with 1068 additions and 0 deletions

76
templates/index.html Normal file
View File

@ -0,0 +1,76 @@
<!DOCTYPE html>
<html>
<head>
<title>Time Series Analysis</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h1 class="mb-4">Time Series Analysis App</h1>
<div class="card">
<div class="card-body">
<h5 class="card-title">Upload Time Series Data</h5>
<p class="card-text">Upload a CSV or Excel file with time series data. First column should be dates, second column should be values.</p>
<form method="post" enctype="multipart/form-data" action="/upload">
<div class="mb-3">
<input type="file" class="form-control" name="file" accept=".csv,.xls,.xlsx">
</div>
<h6 class="mt-3">Select Analyses:</h6>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="decomposition" id="decomposition" checked>
<label class="form-check-label" for="decomposition">
Time Series Decomposition (Trend, Seasonality, Residuals)
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="forecasting" id="forecasting" checked>
<label class="form-check-label" for="forecasting">
Forecasting
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" name="acf_pacf" id="acf_pacf" checked>
<label class="form-check-label" for="acf_pacf">
ACF and PACF Plots
</label>
</div>
<div class="mt-3" id="forecast_options" style="display: none;">
<h6>Forecasting Options:</h6>
<div class="mb-3">
<label for="train_percent" class="form-label">Training Data Percentage (50-95%):</label>
<input type="number" class="form-control" name="train_percent" id="train_percent" value="80" min="50" max="95" step="1">
</div>
<div class="mb-3">
<label for="test_percent" class="form-label">Test Data Percentage (5-50%):</label>
<input type="number" class="form-control" name="test_percent" id="test_percent" value="20" min="5" max="50" step="1">
</div>
<div class="mb-3">
<label for="forecast_periods" class="form-label">Number of Periods to Forecast (1-24):</label>
<input type="number" class="form-control" name="forecast_periods" id="forecast_periods" value="12" min="1" max="24" step="1">
</div>
</div>
<button type="submit" class="btn btn-primary mt-3">Analyze</button>
</form>
{% if error %}
<div class="alert alert-danger mt-3">{{ error }}</div>
{% endif %}
</div>
</div>
</div>
<script>
// Show/hide forecasting options based on checkbox
document.getElementById('forecasting').addEventListener('change', function() {
document.getElementById('forecast_options').style.display = this.checked ? 'block' : 'none';
});
// Ensure train and test percentages sum to 100
const trainInput = document.getElementById('train_percent');
const testInput = document.getElementById('test_percent');
trainInput.addEventListener('input', function() {
testInput.value = (100 - parseFloat(this.value)).toFixed(0);
});
testInput.addEventListener('input', function() {
trainInput.value = (100 - parseFloat(this.value)).toFixed(0);
});
</script>
</body>
</html>

87
templates/results.html Normal file
View File

@ -0,0 +1,87 @@
<!DOCTYPE html>
<html>
<head>
<title>Analysis Results</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.plot.ly/plotly-2.20.0.min.js"></script>
</head>
<body>
<div class="container mt-5">
<h1 class="mb-4">Time Series Analysis Results</h1>
<div class="card mb-4">
<div class="card-body">
<h5 class="card-title">Summary Statistics</h5>
<table class="table">
{% for key, value in summary.items() %}
<tr>
<td>{{ key }}</td>
<td>{{ value|round(2) }}</td>
</tr>
{% endfor %}
</table>
</div>
</div>
{% if do_decomposition %}
<div class="card mb-4">
<div class="card-body">
<h5 class="card-title">Time Series Decomposition</h5>
{{ plot_html | safe }}
</div>
</div>
{% endif %}
{% if do_forecasting %}
<div class="card mb-4">
<div class="card-body">
<h5 class="card-title">Forecast (ARIMA{{ arima_params }}, Seasonal{{ seasonal_params }})</h5>
<form method="post" action="/reforecast">
<div class="mb-3">
<label for="train_percent" class="form-label">Training Data Percentage (50-95%):</label>
<input type="number" class="form-control" name="train_percent" id="train_percent" value="{{ train_percent }}" min="50" max="95" step="1">
</div>
<div class="mb-3">
<label for="test_percent" class="form-label">Test Data Percentage (5-50%):</label>
<input type="number" class="form-control" name="test_percent" id="test_percent" value="{{ test_percent }}" min="5" max="50" step="1">
</div>
<div class="mb-3">
<label for="forecast_periods" class="form-label">Number of Periods to Forecast (1-24):</label>
<input type="number" class="form-control" name="forecast_periods" id="forecast_periods" value="{{ forecast_periods }}" min="1" max="24" step="1">
</div>
<button type="submit" class="btn btn-primary">Re-run Forecast</button>
</form>
<hr>
<p>Training Data: {{ train_percent }}% ({{ train_size }} observations)</p>
<p>Test Data: {{ test_percent }}% ({{ test_size }} observations)</p>
<p>Forecast Periods: {{ forecast_periods }}</p>
{{ forecast_html | safe }}
</div>
</div>
{% endif %}
{% if do_acf_pacf %}
<div class="card mb-4">
<div class="card-body">
<h5 class="card-title">ACF and PACF Plots</h5>
{{ acf_pacf_html | safe }}
</div>
</div>
{% endif %}
<a href="/download/{{ filename }}" class="btn btn-primary">Download Processed Data</a>
<a href="/" class="btn btn-secondary">Upload Another File</a>
</div>
<script>
// Ensure train and test percentages sum to 100
const trainInput = document.getElementById('train_percent');
const testInput = document.getElementById('test_percent');
trainInput.addEventListener('input', function() {
testInput.value = (100 - parseFloat(this.value)).toFixed(0);
});
testInput.addEventListener('input', function() {
trainInput.value = (100 - parseFloat(this.value)).toFixed(0);
});
</script>
</body>
</html>