2017-06-27 4 views
1

C'est la première fois que j'utilise des pandas et un ordinateur portable iPython et que je n'arrive pas à trouver les termes de recherche corrects pour mon problème.Comment regrouper des données et tracer des graphiques en ligne

Je dispose d'un fichier .xls pour les données de temps de compilation pour 3 build-serveurs situés sur 3 sites A, B et C. Ces serveurs de compilation compilent plusieurs projets, donc je choisirai n'importe quel projet spécifique. Par conséquent, je dois tracer des données comme celui-ci (pour un projet spécifique - pas tous dans un seul graphique, pour faire simple):

X-axis = date 
Y-axis = average build time on that date 

3 lines for sites A, B and C 

Ce que je l'ai fait jusqu'à présent:

import pandas as pd 
import numpy as np 
import matplotlib as plt 

file= r'/home/abc/Downloads/request.xls' 
df = pd.read_excel(file,parse_dates=['Date']) 

build_times = df[['Date','site','project','Duration']] 
build_group = build_times.groupby(['Date','site','project']).mean() 

Je besoin d'aide sur ce qui suit:

  1. comment je sélectionne seulement un succès builds s'il y a une colonne status avec 0 et 1.

  2. Comment tracer les lignes pour les sites A, B et C (pour un projet spécifique) avec les axes X et Y mentionnés ci-dessus.

EDIT

Après la réponse de @jezrael, je suis en mesure d'obtenir les données suivantes

2017-03-27 A project1 963.200000 
      B project2 4587.176471 
      C project2 1449.375000 
      C project1 1449.375000 
    ....... 
2017-03-28 A project1 93.200000 
      B project1 4787.176471 
      C project2 1339.375000 
      C project1 1749.375000 
+0

Pouvez-vous ajouter un peu échantillon de données? – jezrael

Répondre

2

Je pense que vous avez besoin premier filtre par boolean indexing ou query:

build_group = build_times[build_times['status'] == 1] 
          .groupby(['Date','site','project'])['Duration'].mean() 

Ou:

build_group = build_times.query('status == 1') 
         .groupby(['Date','site','project'])['Duration'].mean() 

sortie est la même que:

d={'Duration': [963.2, 4587.176471, 1449.375, 1449.375, 93.2, 4787.176471, 1339.375, 1749.375], 
'project': ['project1', 'project2', 'project2', 'project1', 'project1', 'project1', 'project2', 'project1'], 
'Date': [pd.Timestamp('2017-03-27 00:00:00'), pd.Timestamp('2017-03-27 00:00:00'), pd.Timestamp('2017-03-27 00:00:00'), pd.Timestamp('2017-03-27 00:00:00'), pd.Timestamp('2017-03-28 00:00:00'), pd.Timestamp('2017-03-28 00:00:00'), pd.Timestamp('2017-03-28 00:00:00'), pd.Timestamp('2017-03-28 00:00:00')], 
'site': ['A', 'B', 'C', 'C', 'A', 'B', 'C', 'C']} 
build_group = pd.DataFrame(d).set_index(['Date','site','project'])['Duration'] 
print (build_group) 
Date  site project 
2017-03-27 A  project1  963.200000 
      B  project2 4587.176471 
      C  project2 1449.375000 
        project1 1449.375000 
2017-03-28 A  project1  93.200000 
      B  project1 4787.176471 
      C  project2 1339.375000 
        project1 1749.375000 
Name: Duration, dtype: float64 

puis remodeler par unstack avec level=1 (parce que level==1 sont sites) et sélectionner par xs. Dernière plot:

#for check column names for typos 
print (build_group.index.get_level_values(2).unique().tolist()) 
['project1', 'project2'] 

p = 'project1' 
build_group = build_group.unstack(level=1).xs(p, level=1, axis=0) 
print (build_group) 
site   A   B   C 
Date          
2017-03-27 963.2   NaN 1449.375 
2017-03-28 93.2 4787.176471 1749.375 

build_group.plot() 

graph

+0

Oh, nous pouvons faire nesting .. on dirait que ça marche.Maintenant, comment puis-je choisir des graphiques de ligne de projet et d'intrigue spécifiques pour 3 sites? –

+0

Je pense que oui, mais le code tapait sans données. Donc, est-il possible d'ajouter 'print (build_group.head())' à votre question? Si besoin d'aide pour la sélection, mais je pense que ['DataFrame.xs'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.xs.html) devrait aider. – jezrael

+0

s'il vous plaît voir l'édition –

0

Le mot-clé est: DataFrame.mean (axe = Aucun, skipna = Aucun, = Aucun, numeric_only = Aucun, ** kwargs) [source]

Référence est donner dans ce lien https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.mean.html

Ensuite, vous pouvez faire: = df [ « succès »] succès> 0 cela va créer une nouvelle trame de données réussie . Où « succès » est la colonne qui a 1 ou 0.

Pour (2), vous pouvez faire la même chose, sélectionnez uniquement la colonne et l'intrigue à l'aide df.plot (* args)