Ajout analyse de rapports

This commit is contained in:
Jérôme Delacotte
2025-05-10 17:09:59 +02:00
parent c8fd868b6b
commit adef1736e5
5 changed files with 89 additions and 3 deletions

View File

@@ -9,3 +9,12 @@ docker build -t flask-web-app .
docker run -it -p 5000:5000 -v $(pwd)/src/:/src -v /home/jerome/Perso/freqtradeDocker/user_data/:/mnt/external flask-web-app bash docker run -it -p 5000:5000 -v $(pwd)/src/:/src -v /home/jerome/Perso/freqtradeDocker/user_data/:/mnt/external flask-web-app bash
puis : python3 app.py puis : python3 app.py
## librairies
### Génération d'un rapport sur le dataframe
ydata-profiling : https://github.com/ydataai/ydata-profiling
profile = ProfileReport(dataframe, tsmode=True, sortby="date", title="Time-Series EDA")
profile.to_file("report_timeseries.html")

View File

@@ -9,3 +9,4 @@ Werkzeug==2.2.3
joblib==1.4.2 joblib==1.4.2
pyarrow pyarrow
pandas-ta pandas-ta
ydata-profiling

View File

@@ -6,7 +6,7 @@ import os
import pickle import pickle
import joblib import joblib
from io import TextIOWrapper from io import TextIOWrapper
from ydata_profiling import ProfileReport
app = Flask(__name__) app = Flask(__name__)
FREQTRADE_USERDATA_DIR = '/mnt/external' FREQTRADE_USERDATA_DIR = '/mnt/external'
@@ -126,6 +126,26 @@ def read_feather(filename):
print(e) print(e)
return jsonify({"error": str(e)}), 500 return jsonify({"error": str(e)}), 500
@app.route('/generate_report')
def generate_report():
filename = request.args.get('filename', '')
path = os.path.join(FREQTRADE_USERDATA_DIR + "/data/binance/", filename)
print(path)
indicators = request.args.get('indicators', '').split(',')
print(indicators)
try:
dataframe = pd.read_feather(path)
print(dataframe.columns)
df = dataframe[indicators]
profile = ProfileReport(df.loc[1:100], tsmode=True, sortby="date", title="Time-Series EDA")
profile.to_file(FREQTRADE_USERDATA_DIR + "/reports/report_timeseries.html")
return dataframe.to_json(orient="records")
except Exception as e:
print(e)
return jsonify({"error": str(e)}), 500
@app.route('/get_chart_data') @app.route('/get_chart_data')
def get_chart_data(): def get_chart_data():
filename = request.args.get('filename', '') filename = request.args.get('filename', '')

View File

@@ -497,10 +497,36 @@ function loadFeather(filename) {
element.value = filename element.value = filename
fetch(`/read_feather/${filename}`) fetch(`/read_feather/${filename}`)
.then(response => response.json()) .then(response => response.json())
.then(data => renderChart(data, filename, true) ); .then(data => {
renderChart(data, filename, true)
initReport(data)
})
}
function initReport(data) {
string = "<ul class='indicators'>" +
Object.keys(data[0])
// .filter(key => !['date', 'open', 'close', 'volume', 'high', 'low'].includes(key))
.map(cols => `<li><label><input id="${cols}" type="checkbox" value="${cols}" onchange="toggleReportIndicator(this)">${cols}</label></li>`)
.join('') +
"</ul>"
const indicators = document.getElementById('indicatorsReport')
indicators.innerHTML = string
}
function generateReport() {
const element = document.getElementById('current_file_name');
let filename = element.value
const indicators = Array.from(selectedReportIndicators).join(',');
fetch(`/generate_report?filename=${filename}&indicators=${indicators}`)
.then(alert('Generation en cours'));
} }
let selectedIndicators = new Set(); let selectedIndicators = new Set();
let selectedReportIndicators = new Set();
function toggleIndicator(checkbox) { function toggleIndicator(checkbox) {
const indicator = checkbox.value; const indicator = checkbox.value;
@@ -511,6 +537,15 @@ function toggleIndicator(checkbox) {
} }
loadChartWithIndicators(); loadChartWithIndicators();
} }
function toggleReportIndicator(checkbox) {
const indicator = checkbox.value;
if (checkbox.checked) {
selectedReportIndicators.add(indicator);
} else {
selectedReportIndicators.delete(indicator);
}
}
function loadChartWithIndicators() { function loadChartWithIndicators() {
const element = document.getElementById('current_file_name'); const element = document.getElementById('current_file_name');
@@ -542,4 +577,13 @@ function init() {
document.getElementById('closeIndicatorsBtn').addEventListener('click', () => { document.getElementById('closeIndicatorsBtn').addEventListener('click', () => {
dialog.close(); dialog.close();
}); });
const dialogReport = document.getElementById('indicatorReportDialog');
document.getElementById('openIndicatorsReportBtn').addEventListener('click', () => {
dialogReport.showModal();
});
document.getElementById('closeIndicatorsReportBtn').addEventListener('click', () => {
dialogReport.close();
});
} }

View File

@@ -30,7 +30,7 @@
{% endfor %} {% endfor %}
</select> </select>
<button id="openIndicatorsBtn" style="height: 40px;">Afficher les indicateurs</button> <button id="openIndicatorsBtn" style="height: 40px;">Grahique / Indicateurs</button>
<dialog id="indicatorDialog"> <dialog id="indicatorDialog">
<h3>Indicateurs</h3> <h3>Indicateurs</h3>
@@ -40,6 +40,18 @@
<button id="closeIndicatorsBtn">Fermer</button> <button id="closeIndicatorsBtn">Fermer</button>
</dialog> </dialog>
<button id="openIndicatorsReportBtn" style="height: 40px;">Rapport / Indicateurs</button>
<dialog id="indicatorReportDialog">
<h3>Rapport</h3>
<div id="indicatorsReport">
<!-- Contenu dynamique ici -->
</div>
<button id="closeIndicatorsReportBtn">Fermer</button>
<button id="generateReport" style="height: 40px;" onclick="generateReport(this.value)">Rapport</button>
</dialog>
</div> </div>
<div id='content' class="content"> <div id='content' class="content">
<div id="json-tabs"> <div id="json-tabs">