Diary
August 17, 2025, 1:32pm
1
Hallo
Ich hatte mir überlegt, in PP zwei Seiten für einen schnellen Marktüberblick anzulegen.
Es würde beispielsweise folgende Werte beinhalten:
Einige Daten stellt die FRED über ihre API bereit, man könnte die per JSON abfragen.
Allerdings muss da ein entsprechender Schlüssel genutzt werden.
Könnte man das in PP integrieren?
Rafa
August 17, 2025, 1:49pm
2
Bietet PP nicht bereits die Möglichkeit, JSON als historische Quelle zu verwenden?
Diary
August 17, 2025, 1:53pm
3
JSON ja, aber man muss ja den API-Key übergeben…
Wäre doch schick, wenn man den nur einmal hinterlegen würde, so wie für EOD oder andere bereits hinterlegte API.
Vielleicht denke ich aber auch zu kompliziert…
mit Pipedream geht es:
Achtung logt aber die API keys mit. oder ihr erstellt euch euren eigenen. ambesten mit dem verweiß auf das Python script sonst macht der Blödsin.
Pythonscript erstellt mit chat gpt aber es funktioniert.
Abruf:
http://127.0.0.1:5000/data?series_id=BAMLC0A4CBBB&api_key=\*\*\*\*\ *
# pip install flask requests
import requests
from flask import Flask, jsonify, request
app = Flask(__name__)
URL = "https://api.stlouisfed.org/fred/series/observations"
def fetch_and_process_data(series_id, api_key):
params = {
"series_id": series_id,
"api_key": api_key,
"file_type": "json"
}
resp = requests.get(URL, params=params)
resp.raise_for_status()
data = resp.json()
# "." -> "N/A"
for obs in data.get("observations", []):
if obs.get("value") == ".":
obs["value"] = "N/A"
return data
@app.route("/data")
def get_data():
series_id = request.args.get("series_id")
api_key = request.args.get("api_key")
if not series_id or not api_key:
return jsonify({"error": "series_id und api_key sind erforderlich"}), 400
data = fetch_and_process_data(series_id, api_key)
return jsonify(data)
if __name__ == "__main__":
app.run(host="127.0.0.1", port=5000, debug=True)
Hier der Code der mir Chatgpt ausspuckt: mit bezug auf mein Pythoncode und EOD Historical Data als bsp.
package name.abuchen.portfolio.online.impl;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import name.abuchen.portfolio.PortfolioLog;
import name.abuchen.portfolio.util.WebAccess;
public class FredDataCom
{
private static final String HOST = "api.stlouisfed.org"; //$NON-NLS-1$
private String apiKey;
public FredDataCom(String apiKey)
{
this.apiKey = apiKey;
}
public static class Observation
{
private final String date;
private final String value;
public Observation(String date, String value)
{
this.date = date;
this.value = value;
}
public String getDate()
{
return date;
}
public String getValue()
{
return value;
}
@Override
public String toString()
{
return date + " -> " + value;
}
}
public Optional<List<Observation>> lookup(String seriesId) throws IOException
{
try
{
WebAccess webAccess = new WebAccess(HOST, "/fred/series/observations") //$NON-NLS-1$
.addParameter("series_id", seriesId) //$NON-NLS-1$
.addParameter("api_key", apiKey) //$NON-NLS-1$
.addParameter("file_type", "json"); //$NON-NLS-1$
String response = webAccess.get();
JSONObject jsonObject = (JSONObject) JSONValue.parse(response);
JSONArray observations = (JSONArray) jsonObject.get("observations");
List<Observation> list = (List<Observation>) observations.stream().map(o -> {
JSONObject obj = (JSONObject) o;
String date = (String) obj.get("date");
String value = (String) obj.get("value");
if (".".equals(value))
value = "N/A";
return new Observation(date, value);
}).collect(Collectors.toList());
return Optional.of(list);
}
catch (IOException e)
{
PortfolioLog.error(e);
throw e;
}
}
}
Diary
August 30, 2025, 5:15pm
7
Vielen Dank für die schnelle Umsetzung an das Programmierer-Team!
Ich konnte es bisher nur auf die Schnelle testen, aber soweit ich das gesehen habe, funktioniert der JSON-Import von der FRED nun problemlos!
Das hilft sehr!
1 Like