Wie berechnet man den gleitenden Durchschnitt einer Spalte mit mehr als 10000 Millionen Einträgen in JMP 11?Ich versuche, die folgende Formel für eine Spalte mit 100 Millionen Zeilen auszuführen, um den gleitenden Durchschnitt zu berechnen. Könnten Sie bitte eine JMP11-Alternative vorschlagen? Col Gleitender Durchschnitt
Col Moving Average( :x, 1, 9999999, 0 ) wird von JMP11 nicht unterstützt.</CODE></P><P><CODE class=" language-jsl">Nachfolgend finden Sie den Code, den ich ausprobiert habe:
NamesDefaultToHere(1);
// Use a function to open a .CSV file: Given the path to such a file, returns a reference to the resulting table
openMyCSV =
function({path2File}, {Default Local},
dt = Open(
path2File,
columns(
New Column( "column 1", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "items", Numeric, "Continuous", Format( "Best", 12 ) )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
)
);
dt = New Table( "My data file");
dt << New Column( "cc", Character, width( 40 ) );
dt << New Column( "MovAvgMean", Numeric );
dt << New Column( "MovAvgMax", Numeric );
// Put all the .csv files to process into a list
dir = Pick Directory(
"Directory containing your csv files",
"C:\Users\xxx\Documents\test\"
);
files = Files In Directory( dir );
For( f = N Items( files ), f >= 1, f--,
If( !Ends With( Uppercase( files[f] ), ".CSV" ),
Remove From( files, f )
)
);
// Process each file - Incomplete!
For( f = 1, f <= N Items( files ), f++,
thisTable = openMyCSV( dir || files[f] );
thisTable << New Column( "x",
Numeric,
Continuous,
Formula( (87 *:items)-(0.03998113) ));
thisTable << New Column( "av", Numeric, Continuous, Formula( Col Moving Average( :x, 1, 9999999, 0 ) ) );
// This will insure that all formula processing is complet before the next statement is run
thisTable << run formulas;
FileName = files[f];
// Add the summary statistics to the summary table
dt << Add Rows( 1 );
dt:cc[N Rows( dt )] = FileName;
dt:MovAvgMean[N Rows( dt )] = Col Mean( thisTable:x );
dt:MovAvgMax[N Rows( dt )] = Col Max( thisTable:x );
Close( thisTable, nosave );
);
9
Betreff: Wie berechnet man den gleitenden Durchschnitt einer Spalte mit 100 Millionen Einträgen in JMP 11?@jojmp ,
Angesichts Ihres ursprünglichen Skripts, in dem Sie Ihre Tabelle nicht einmal gespeichert haben und auf eine Spalte verweisen, die nie erstellt wurde, und angesichts der Tatsache, dass sich der Mittelwert einer großen Anzahl von Werten nur sehr geringfügig ändert, indem Sie eine Zeile löschen und eine weitere hinzufügen, ist Ihre Frage sehr seltsam.
Unten ist ein Skript, das eine Tabelle mit nr Zeilen erstellt, anstatt eine Datei einzulesen, in der nr = nrow(dt) ist. Wenn Sie 100 Millionen Zeilen haben, ist die Speicherverwaltung sehr wichtig und die Berechnungen sollten versuchen, die Reihenfolge n, O (n) und nicht O (n * rng) zu sein.
Wenn Sie das eingebettete Protokoll anzeigen, wird die Zeit für die Durchführung der Berechnungen ausgedruckt.Auch Datenaktualisierung beginnen() Und Datenaktualisierung beenden() werden verwendet, um E/A-Zeit (Rendering) zu sparen.Auf meinem PC sind hier einige meiner Ergebnisse:
| Nr |
Nr |
Sekunden |
| 100.000 |
100 |
0,34 |
| 10.000.000 |
1.000.000 |
10.66 |
| 100.000.000 |
100.000.000 |
85.74 |
| 100.000.000 |
10.000.000 |
104,50 |
Beachten Sie, dass dieses Skript davon ausgeht keine fehlenden Werte .Das Skript muss geändert werden, und die Leistung wird immens beeinträchtigt, um fehlende Werte zu berücksichtigen. Ändern Sie die Werte von nr und nrg, um die Leistung Ihres PCs zu testen.
Names Default to Here(1);
nr = 100000;
dt = new table("test", new column("x"), Add rows(nr));
dt:x << set each value(Random Integer(100,200));
nrg = 100;
dt << begin data update();
t0 = hp time();
mvcol = dt << new column("MV");
mvcol[1] = :x[1];
for(j=2, j<=nrg, j++,
mvcol[j] = (:x[j] + (j-1)*mvcol[j-1])/j; //assumes no missing values
);
if(nrg < nr,
for(j=nrg+1, j<=nr, j++,
mvcol[j] = (:x[j] + (nrg)*mvcol[j-1] - :x[j - nrg])/ (nrg)
);
); //end if,
wait(0);
dt << end data update();
t1= hp time();
show((t1-t0)*1e-6);
Angesichts all dessen habe ich immer noch das Gefühl, dass das, was Sie beschrieben haben, möglicherweise nicht das ist, was Sie brauchen.
Betreff: Wie berechnet man den gleitenden Durchschnitt einer Spalte mit 100 Millionen Einträgen in JMP 11?Entschuldigung für die Unklarheit, ich habe die Frage auf mehr als 10000 Millionen Einträge geändert und die Anzahl der Einträge ist nicht festgelegt, sie kann sich auf eine beliebige Zahl erhöhen. Suchen Sie nach einer allgemeinen Formel, um den gleitenden Durchschnitt über eine beliebige Anzahl von Elementen zu berechnen.Betreff: Wie berechnet man den gleitenden Durchschnitt einer Spalte mit 100 Millionen Einträgen in JMP 11?@jojmp ,
Entweder verstehe ich Ihre Anfrage nicht oder Sie verstehen Col Moving Avg() nicht.Sie haben angegeben, dass Sie 100 Millionen Zeilen haben und die Spanne, die Sie in Ihrem Skript angegeben haben, 99.999.999 war. Die letzte letzte Zeile wäre also der Mittelwert der gesamten Spalte, und die vorherigen Zeilen wären alle Werte bis einschließlich der aktuellen Zeile. Unten ist ein Bild von Big Class und einer Spalte mit gleitendem Durchschnitt mit einer Spanne von 5 (n vorher).Beachten Sie, dass Zeilen mit weniger als 6 nur alle Zeilen verwenden und zu einem Mittelwert führen, der auf weniger als 6 Werten basiert.Ab Zeile 6 wird der Mittelwert aus der aktuellen Zeile und den vorherigen 5 Zeilen berechnet.
Geben Sie daher bitte weitere Details an. Wenn Ihre Dateien nun mehr als 100 Millionen Zeilen enthalten, müsste die benutzerdefinierte Formel geändert werden.

Betreff: Wie berechnet man den gleitenden Durchschnitt einer Spalte mit 100 Millionen Einträgen in JMP 11?Woher wissen wir in dieser benutzerdefinierten Formel, dass es sich um den gleitenden Durchschnitt von 9999 Artikeln handelt?
Betreff: Wie berechnet man den gleitenden Durchschnitt einer Spalte mit 100 Millionen Einträgen in JMP 11?@jojmp , Ihre Formel für den gleitenden Durchschnitt ist etwas fremd
thisTable << New Column( "av", Numeric, Continuous, Formula( Col Moving Average( :x, 1, 9999999, 0 ) ) );
Das dritte Argument, 99999999, erzeugt eine Art (historischen) Mittelwert durch Sequenz (Zeile).Das dritte Argument ist die Spannweite des Durchschnitts. Häufiger ist eine Spanne von 5 oder 10 oder ?? um einen Mittelwert für zeitnahe Werte bereitzustellen, der nicht die gesamte Historie umfasst.
Unter der Annahme, dass Sie dies wünschen, kann eine alternative Formel dasselbe tun
If( Row() == 1,
:x,
(:x + (Row() - 1) * Lag( :av, 1 )) / Row()
)
Angehängt ist eine Version der Beispieldaten Big Class.jmp mit zwei Spalten mit Formeln
Col Moving Average( :weight, 1, 9999, 0 )
und die vergleichbare Custom Formula
If( Row() == 1,
:weight,
(:weight + (Row() - 1) * Lag( :Custom Formula, 1 )) / Row()
)