kann ich um Anregung bitten, effizienter (und schneller) zu iterieren? hier ist das Problem, ich bin auf der Suche nach einem Weg Null nach unten in einem Pandas Datenrahmen innerhalb einer bestimmten Fenstergröße zu propagieren:auf der Suche nach einem effizienten Weg zur Iteration
import numpy as np
import pandas as pd
A = np.matrix([[ 0., 1., 1., 1., 1.],
[ 1., 0., 1., 1., 1.],
[ 1., 1., 0., 1., 1.],
[ 1., 1., 1., 0., 1.],
[ 1., 1., 1., 1., 0.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 0.],
[ 1., 1., 0., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 1., 0., 1.],
[ 1., 1., 1., 1., 1.],
[ 1., 1., 0., 1., 1.],
[ 1., 1., 1., 1., 0.],
[ 1., 0., 1., 1., 1.],
[ 1., 1., 1., 1., 1.]])
df = pd.DataFrame(A)
jetzt wollen wir durch Erhöhung der Fenster von 3 Zeilen à der Werte füllen aus die Spitze. jedes Fenster von 3 Zeilen beginnt am window_start, definiert als:
window_size = 3
window_start = [i for i in range(0, df.shape[0])
if i % window_size == 0]
print(df)
gf = df.copy()
print('\n')
nun den Datenrahmen zu machen, wo die Nullen von den vorhergehenden Zeilen oberhalb innerhalb dieses Fensters propagieren:
for i in window_start:
for j in range(1, window_size):
try: gf.iloc[i + j] = gf.iloc[i + j - 1] * gf.iloc[i + j]
except: pass
print(gf)
Dieses letzte Bit ist ziemlich Ineffizient und zeitaufwendig für sehr große Datensätze, gibt es einen besseren Weg, dies zu tun?
Beachten Sie, dass dieser Überlauf, wenn die Werte fehlschlagen, z.B '[1e200, 1e200, 0]', weil cumprod '[1e200, inf, nan]' erzeugt. ;-) #unlikelyfailuremodeoftheday – DSM
Nice hashtag :-) – piRSquared