Use threading for python. and make singals from python

This commit is contained in:
derek holloway
2026-02-19 15:09:06 -08:00
parent 4f08732c78
commit 6172d1c373
3 changed files with 51 additions and 12 deletions
+13 -3
View File
@@ -8,18 +8,20 @@ import features
import matplotlib
matplotlib.use("Agg")
def Predict():
def Predict(Symbol):
# Define paths (consistent with your previous script)
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
DATA_DIR = os.path.join(SCRIPT_DIR, "data")
MODEL_PATH = os.path.join(DATA_DIR, "model.keras")
# Pull 1 month of current data to make prediction against | for volatility 20
df = yf.download("NVDA", period="2mo", auto_adjust=True)
df = yf.download(Symbol, period="2mo", auto_adjust=True)
if not df.empty:
df = features.MakeFeatures(df, 1)
df = features.CleanDF(df)
print(Symbol)
# Drop our predictor
df.drop('Target_Close', axis=1, inplace=True)
@@ -50,7 +52,15 @@ def Predict():
print(f"Predicted Target_Close: {flat_predictions}")
return json.dumps(flat_predictions)
movement_indicator = 0
if (np.mean(flat_predictions) > 0.01):
movement_indicator = 1
elif (np.mean(flat_predictions) < -0.01):
movement_indicator = -1
else:
movement_indicator = 0
return movement_indicator
if __name__ == "__main__":
Predict()
+35 -4
View File
@@ -22,8 +22,17 @@
<button @onclick="pullandtrain">@button1Text</button>
<button @onclick="predict">@button2Text</button>
@foreach(double cur in predictions){
<p>@cur</p><br/>
@foreach (stockPredictionPair cur in predictions){
<div>
<h1>Symbol: @cur.Symbol</h1><br />
@if (cur.Movement == -1){
<p>Sell</p>
} else if (cur.Movement == 1){
<p>Buy</p>
} else{
<p>Hold</p>
}
</div>
}
</div>
@@ -34,7 +43,13 @@
string button1Text = "Train AI";
string button2Text = "Predict AI";
double[] predictions = {};
List<stockPredictionPair> predictions = new List<stockPredictionPair>(){
new stockPredictionPair(){ Symbol = "AAPL" },
new stockPredictionPair(){ Symbol = "AAPL" },
new stockPredictionPair(){ Symbol = "TTD" },
new stockPredictionPair(){ Symbol = "FUN" }
};
async Task pullandtrain(){
button1Text = "Do not refresh the page. The data is refreshing.";
@@ -46,8 +61,24 @@
async Task predict(){
button2Text = "Do not refresh the page. The data is refreshing.";
await Task.Delay(1);
predictions = aiModule.PredictAI();
List<Task> threadpool = new List<Task>();
foreach(stockPredictionPair cur in predictions){
Task thread = new Task(() => {
cur.Movement = aiModule.PredictAI(cur.Symbol);
Console.WriteLine("Received Signal [" + cur.Symbol + "] : " + cur.Movement);
});
thread.Start();
threadpool.Add(thread);
}
await Task.WhenAll(threadpool);
button2Text = "Refresh Completed";
StateHasChanged();
await Task.Delay(1);
}
class stockPredictionPair{
public string Symbol = "";
public int Movement = 0;
}
}
+3 -5
View File
@@ -30,13 +30,11 @@ namespace PythonInterop {
}
}
public double[] PredictAI() {
public int PredictAI(string StockSymbol) {
using (Py.GIL()) {
dynamic main = Py.Import("ai-predictor");
string result = main.Predict();
double[]? predictions = JsonSerializer.Deserialize<double[]>(result);
double[] nullCasted = predictions != null ? predictions : [];
return nullCasted;
int result = main.Predict(StockSymbol);
return result;
}
}