2016-09-07 5 views
0

Ich habe drei Datenrahmen von drei Benutzern mit gleichen Spaltennamen wie Zeit, Kompassdaten, Beschleunigungsmesserdaten, Gyroskopdaten und Kameraschwenkinformationen. Ich möchte alle Datenrahmen gleichzeitig durchlaufen, um nach einer bestimmten Zeit zu suchen, in der der Benutzer das Kameraschwenk ausgeführt und den Benutzer zurückgegeben hat (wie in welchem ​​Datenrahmen das Schwenken für eine bestimmte Zeit erkannt wurde). Ich habe versucht, Strich zu verwenden, um Parallelität zu erzielen, aber vergebens. Unten ist mein CodeMehrere Datenrahmen gleichzeitig durchlaufen

import pandas as pd 
import glob 
import numpy as np 
import math 
from scipy.signal import butter, lfilter 
order=3 
fs=30 
cutoff=4.0 

data=[] 
gx=[] 
gy=[] 
g_x2=[] 
g_y2=[] 


dataList = glob.glob(r'C:\Users\chaitanya\Desktop\Thesis\*.csv') 
for csv in dataList: 
     data.append(pd.read_csv(csv)) 
for i in range(0, len(data)): 
    data[i] = data[i].groupby("Time").agg(lambda x: x.value_counts().index[0]) 
    data[i].reset_index(level=0, inplace=True) 

def butter_lowpass(cutoff,fs,order=5): 
    nyq=0.5 * fs 
    nor=cutoff/nyq 
    b,a=butter(order,nor,btype='low', analog=False) 
return b,a 
def lowpass_filter(data,cutoff,fs,order=5): 
    b,a=butter_lowpass(cutoff,fs,order=order) 
    y=lfilter(b,a,data) 
return y 

for i in range(0,len(data)): 
    gx.append(lowpass_filter(data[i]["Gyro_X"],cutoff,fs,order)) 
    gy.append(lowpass_filter(data[i]["Gyro_Y"],cutoff,fs,order)) 

    g_x2.append(gx[i]*gx[i]) 
    g_y2.append(gy[i]*gy[i]) 


g_rad=[[] for _ in range(len(data))] 
g_ang=[[] for _ in range(len(data))] 

for i in range(0,len(data)): 
    for j in range(0,len(data[i])): 
      g_ang[i].append(math.degrees(math.atan(gy[i][j]/gx[i][j]))) 


    data[i]["Ang"]=g_ang[i] 


panning=[[] for _ in range(len(data))] 
for i in range(0,len(data)): 
    for j in data[i]["Ang"]: 
     if 0-30<=j<=0+30: 
      panning[i].append("Panning") 
     elif 180-30<=j<=180+30: 
      panning[i].append("left") 
     else: 
      panning[i].append("None") 
    data[i]["Panning"]=panning[i] 
result=[[] for _ in range(len(data))] 
for i in range (0,len(data)): 
    result[i].append(data[i].loc[data[i]['Panning']=='Panning','Ang']) 
+0

zu Fuß durch gehen, so haben wir einen Ausgangspunkt mit – jhole89

+0

ich meinen aktuellen Code hinzugefügt habe, zu arbeiten. –

+1

Dies ist eine schlecht geformte Frage. Zusätzlich zum Code möchten wir Beispiele für die Daten sehen, mit denen Sie arbeiten und was Sie erwarten. Lesen Sie diese Artikel, um Ideen zu erhalten, wie Sie danach fragen können. http://stackoverflow.com/help/mcve http://stackoverflow.com/help/how-to-ask – piRSquared

Antwort

1

Ich werde die Annahme machen, dass Sie gleichzeitig in der Zeit durchqueren wollen. In jedem Fall möchten Sie, dass Ihre drei Datenfelder einen Index in der Dimension haben, die Sie durchlaufen möchten.

Ich werde 3 Datenrahmen mit Zeilen generieren, die zufällige Sekunden in einem 9-Sekunden-Zeitraum darstellen.

Dann werde ich diese mit einem pd.concat und ffill ausrichten, um in der Lage zu sein, die letzten bekannten Daten für Lücken zu referenzieren.

seconds = pd.date_range('2016-08-31', periods=10, freq='S') 

n = 6 
ssec = seconds.to_series() 
sidx = ssec.sample(n).index 

df1 = pd.DataFrame(np.random.randint(1, 10, (n, 3)), 
        ssec.sample(n).index.sort_values(), 
        ['compass', 'accel', 'gyro']) 

df2 = pd.DataFrame(np.random.randint(1, 10, (n, 3)), 
        ssec.sample(n).index.sort_values(), 
        ['compass', 'accel', 'gyro']) 

df3 = pd.DataFrame(np.random.randint(1, 10, (n, 3)), 
        ssec.sample(n).index.sort_values(), 
        ['compass', 'accel', 'gyro']) 

df4 = pd.concat([df1, df2, df3], axis=1, keys=['df1', 'df2', 'df3']).ffill() 
df4 

enter image description here

Sie können dann Ihren aktuellen Code Bitte geben Sie über iterrows()

for tstamp, row in df4.iterrows(): 
    print tstamp 
+0

Vielen Dank für Ihre Antwort. Ich habe ein Problem beim Iterieren über die Zeilen. Für jede abgerufene Zeile möchte ich den Schlüsselwert zum Beispiel in der zweiten Zeile für die 1. Sekunde zurückgeben. df1 und df3 haben den Kompasswert 4.0, also wollte ich die Schlüssel zurückgeben, die den gleichen Kompasswert haben, df1 und df3 in diesem Fall. @piRSquared –

Verwandte Themen