2017-04-24 6 views
0

HINTERGRUND: Ich bin beschäftigt, Daten für verschiedene experimentelle Arbeit zu analysieren. Ziel ist es, eine Excel-Datei mit verschiedenen Blättern zu importieren. Dann "filtere" das Rauschen aus den Daten und finde den Durchschnitt aller Samples. Zeichnen Sie dann ein Diagramm und speichern Sie das Diagramm.Python: df.mean scheint die falsche Ausgabe zu geben, warum?

PROGRESS & PROBLEM: ich in der Lage gewesen, alle oben genannten Schritte zu tun, scheint die endgültige Grafik mit den verschiedenen Proben vs jedoch der Durchschnitt davon falsch zu mir. Ich bin mir nicht sicher, ob das "df.mean" die richtige Methode ist, den Durchschnitt zu finden. Ich habe die Grafik angehängt, die ich bekomme, irgendwie kann ich nicht zustimmen, dass der Durchschnitt so niedrig sein kann? It can be seen that the saved image from my code cuts off the legend, how can I change this?

verbesserungsbedürftig: Dies ist meine erste Frage auf Stackoverflow und ich bin noch neu in Python. Der Code scheint sehr "flauschig" zu sein und ich würde mich über Vorschläge zur Verkürzung des Codes freuen.

MEIN CODE:

#IMPORT LIBRARIES 
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 

#IMPORT DATA 
excel_df= pd.ExcelFile('data.xlsx',delimiter = ';') #import entire excel file 
sheet1=pd.read_excel('data.xlsx',sheetname=0,names=['time','void1','pressure1']) 
sheet2=pd.read_excel('data.xlsx',sheetname=1,names=['time','void2','pressure2']) 
sheet3=pd.read_excel('data.xlsx',sheetname=2,names=['time','void3','pressure3']) 
sheet4=pd.read_excel('data.xlsx',sheetname=3,names=['time','void4','pressure4']) 
sheet5=pd.read_excel('data.xlsx',sheetname=4,names=['time','void5','pressure5']) 
sheet6=pd.read_excel('data.xlsx',sheetname=5,names=['time','void6','pressure6']) 
sheet7=pd.read_excel('data.xlsx',sheetname=6,names=['time','void7','pressure7']) 
sheet8=pd.read_excel('data.xlsx',sheetname=7,names=['time','void8','pressure8']) 
sheet10=pd.read_excel('data.xlsx',sheetname=9,names=['time','void10','pressure10']) 

#SORT VALUES TO FIND THE UNWANTED DATA 
sheet1.sort_values('pressure1',ascending=False).head() #the pressure has noise so sort accordingly 

#GET ONLY WANTED DATA WITHOUT NOISE 
sheet1_new = sheet1[sheet1.pressure1 <=8] #exclude the noise above 8 bar 
sheet2_new = sheet2[sheet2.pressure2 <=8] #exclude the noise above 8 bar 
sheet3_new= sheet3[sheet3.pressure3 <=8] #exclude the noise above 8 bar 
sheet4_new = sheet4[sheet4.pressure4 <=8] #exclude the noise above 8 bar 
sheet5_new = sheet5[sheet5.pressure5 <=8] #exclude the noise above 8 bar 
sheet6_new = sheet6[sheet6.pressure6 <=8] #exclude the noise above 8 bar 
sheet7_new = sheet7[sheet7.pressure7 <=8] #exclude the noise above 8 bar 
sheet8_new = sheet8[sheet8.pressure8 <=8] #exclude the noise above 8 bar 
sheet10_new = sheet10[sheet10.pressure10 <=8] #exclude the noise above 8 bar 

#MERGE THE DATASETS TO FIND AVERAGE OF ALL SAMPLES 

#'MERGE' ONLY MERGES 2 DATAFRAMES AT A TIME 
merge12_df = pd.merge(sheet1_new,sheet2_new, on='time') 
merge34_df = pd.merge(sheet3_new,sheet4_new, on='time') 
merge56_df = pd.merge(sheet5_new,sheet6_new, on='time') 
merge78_df = pd.merge(sheet7_new,sheet8_new, on='time') 

#MERGE ON FIRST OUTPUT 
all_merged = merge12_df.merge(merge34_df, on='time').merge(merge56_df, on = 'time').merge(merge78_df, on = 'time').merge(sheet10_new, on = 'time') 
#print(all_merged.head()) #check that all data is merged into one dataframe 

#AVERAGE ALL PRESSURES 
mean_all_pressures = all_merged[["pressure1", "pressure2","pressure3", "pressure4","pressure5", "pressure6","pressure7", "pressure8", "pressure10"]].mean(axis=1) 

#PRINT AVERAGE VS ALL THE SAMPLES GRAPH 
plt.figure(1) 
plt.plot(all_merged.time,mean_all_pressures,'r.') #plot the average of all samples. 
plt.plot(sheet1_new.time,sheet1_new.pressure1) 
plt.plot(sheet2_new.time,sheet2_new.pressure2) 
plt.plot(sheet3_new.time,sheet3_new.pressure3) 
plt.plot(sheet4_new.time,sheet4_new.pressure4) 
plt.plot(sheet5_new.time,sheet5_new.pressure5) 
plt.plot(sheet6_new.time,sheet6_new.pressure6) 
plt.plot(sheet7_new.time,sheet7_new.pressure7) 
plt.plot(sheet8_new.time,sheet8_new.pressure8) 
plt.plot(sheet10_new.time,sheet10_new.pressure10) 
plt.legend(['Average','Sample 1','Sample 2','Sample 3','Sample 4','Sample 5','Sample 6','Sample 7','Sample 8','Sample 10'],bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.) 
plt.xlabel('Time (s)'),plt.ylabel('Pressure (bar)') #Specify the plot details 
plt.savefig('AllPressures_vs_Average.png') #Save the plot for later use 
plt.show() #Display the plot 
+3

'für num in Reichweite (1,11):' eine Menge Code hier retten könnte ... –

+0

Der Durchschnitt liegen die roten Punkte auf dem Graphen. Mein erstes Bild wurde nicht korrekt hochgeladen. –

+0

überprüfen Sie den Mittelwert, indem Sie die Berechnung explizit durchführen, d. H. Summieren über die gefilterten Druckwerte & dividieren, aber die Probennummer. – DrBwts

Antwort

0

Die meisten der Wiederholung in Ihrem Code stammt aus der Tatsache, dass Sie eine separate Variable für jedes Blatt definieren und führen Sie dann die gleiche Operation auf jeden von ihnen.

Sie können Ihren aktuellen Code verbessern, indem Sie den Inhalt jedes Blattes in einem einzigen Wörterbuch und nicht in separaten Variablen speichern.

Aus der documentation, sehen Sie, dass Sie alle Blätter als ein Wörterbuch importieren können, indem Sie s heetname = None angeben. Oder alternativ können Sie die Liste der Blätter angeben, die Sie lesen möchten, in Ihrem Fall [0,1,2,...,11], da sie 0-indiziert sind.

sheets_dict = pd.read_excel('data.xlsx',sheetname=None,names=['time','void1','pressure1']) 

Sie können schnell sehen, was Sie haben mit:

for name, sheet in sheets_dict.iteritems(): 
    print name, sheet.head() 

Sie jedes Blatt einzeln zugreifen können, wenn Sie brauchen:

sheets_dict['sheet_1_name'] 

Und das würde eine Menge Wiederholungen vermeiden. Zum Beispiel würde die Filterung einfach sein:

new_sheets_dict = {key: el[el.pressure1 <=8] for key, el in sheets_dict.iteritems)} 
Verwandte Themen