2017-04-24 2 views
0

CONTEXTE: Je suis occupé à analyser des données pour divers travaux expérimentaux. Le but est d'importer un fichier Excel avec différentes feuilles. Puis "filtrer" le bruit des données et trouver la moyenne de tous les échantillons. Ensuite, tracez un graphique et enregistrez le graphique.Python: df.mean semble donner la mauvaise sortie, pourquoi?

PROGRÈS & PROBLÈME: Je suis capable de faire toutes les étapes mentionnées ci-dessus, cependant, le dernier graphique avec les différents échantillons vs la moyenne de celle-ci semble mal pour moi. Je ne suis pas sûr que le "df.mean" est la bonne méthode pour trouver la moyenne. J'ai joint le graphique que je reçois, d'une manière ou d'une autre je ne peux pas convenir que la moyenne peut être si basse? It can be seen that the saved image from my code cuts off the legend, how can I change this?

AMÉLIORATION Nécessaires: Ceci est ma première question sur stackoverflow et je suis encore nouveau pour Python. Le code semble très "moelleux" et j'apprécierais toutes les suggestions sur la réduction du code.

MON 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

'pour num dans la plage (1,11):' pourrait sauver beaucoup de code ici ... –

+0

La moyenne est les points rouges sur le graphique. Ma première image n'a pas été téléchargée correctement. –

+0

sanity vérifier la valeur moyenne en faisant explicitement le calcul vous-même, c'est-à-dire en additionnant les valeurs de pression filtrées et en divisant le nombre d'échantillons. – DrBwts

Répondre

0

La plupart de la répétition dans votre code provient du fait que vous définissez une variable distincte pour chaque feuille, puis faites la même opération sur chacun d'eux.

Vous pouvez améliorer votre code actuel en stockant le contenu de chaque feuille dans un seul dictionnaire plutôt que des variables distinctes. A partir du documentation, vous pouvez voir qu'en spécifiant s heetname = None, vous pouvez importer toutes les feuilles sous forme de dictionnaire. Ou vous pouvez également fournir la liste des feuilles que vous voulez lire, dans votre cas [0,1,2,...,11] car elles sont indexées 0.

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

Vous pouvez rapidement voir ce que vous avez en utilisant:

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

Vous pouvez accéder à chaque feuille individuellement lorsque vous avez besoin:

sheets_dict['sheet_1_name'] 

Et ceci éviterait beaucoup de répétitions. Par exemple, le filtrage serait simplement:

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