2016-05-11 7 views
5

Ich versuche, eine Zeitreihe mit Seaborn aus einem Datenrahmen, der mehrere Serien hat.Seaborn Zeitreihen Grundstück mit mehreren Serien

Von diesem Beitrag: seaborn time series from pandas dataframe

entnehme ich, dass tsplot nicht, wie es Unsicherheit plotten soll funktionieren wird.

Gibt es eine andere Seaborn-Methode, die für Liniendiagramme mit mehreren Serien gedacht ist?

Meine Datenrahmen sieht wie folgt aus:

print(df.info()) 
print(df.describe()) 
print(df.values) 
print(df.index) 

Ausgang:

<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 253 entries, 2013-01-03 to 2014-01-03 
Data columns (total 5 columns): 
Equity(24 [AAPL])  253 non-null float64 
Equity(3766 [IBM])  253 non-null float64 
Equity(5061 [MSFT]) 253 non-null float64 
Equity(6683 [SBUX]) 253 non-null float64 
Equity(8554 [SPY])  253 non-null float64 
dtypes: float64(5) 
memory usage: 11.9 KB 
None 
     Equity(24 [AAPL]) Equity(3766 [IBM]) Equity(5061 [MSFT]) \ 
count   253.000000   253.000000   253.000000 
mean   67.560593   194.075383   32.547436 
std    6.435356   11.175226    3.457613 
min   55.811000   172.820000   26.480000 
25%   62.538000   184.690000   28.680000 
50%   65.877000   193.880000   33.030000 
75%   72.299000   203.490000   34.990000 
max   81.463000   215.780000   38.970000 

     Equity(6683 [SBUX]) Equity(8554 [SPY]) 
count   253.000000   253.000000 
mean    33.773277   164.690180 
std    4.597291   10.038221 
min    26.610000   145.540000 
25%    29.085000   156.130000 
50%    33.650000   165.310000 
75%    38.280000   170.310000 
max    40.995000   184.560000 
[[ 77.484 195.24 27.28 27.685 145.77 ] 
[ 75.289 193.989 26.76 27.85 146.38 ] 
[ 74.854 193.2  26.71 27.875 145.965] 
..., 
[ 80.167 187.51 37.43 39.195 184.56 ] 
[ 79.034 185.52 37.145 38.595 182.95 ] 
[ 77.284 186.66 36.92 38.475 182.8 ]] 
DatetimeIndex(['2013-01-03', '2013-01-04', '2013-01-07', '2013-01-08', 
       '2013-01-09', '2013-01-10', '2013-01-11', '2013-01-14', 
       '2013-01-15', '2013-01-16', 
       ... 
       '2013-12-19', '2013-12-20', '2013-12-23', '2013-12-24', 
       '2013-12-26', '2013-12-27', '2013-12-30', '2013-12-31', 
       '2014-01-02', '2014-01-03'], 
       dtype='datetime64[ns]', length=253, freq=None, tz='UTC') 

Das funktioniert (aber ich möchte, dass meine Hände schmutzig mit Seaborn bekommen):

df.plot() 

Ausgang:

enter image description here

Vielen Dank für Ihre Zeit!

Update1:

df.to_dict() zurückgegeben: https://gist.github.com/anonymous/2bdc1ce0f9d0b6ccd6675ab4f7313a5f

Update2:

@knagaev Beispielcode verwenden, habe ich es verengt dieser Differenz nach unten:

aktuellen Datenrahmen (Ausgabe von print(current_df)):

      Equity(24 [AAPL]) Equity(3766 [IBM]) \ 
2013-01-03 00:00:00+00:00    77.484   195.2400 
2013-01-04 00:00:00+00:00    75.289   193.9890 
2013-01-07 00:00:00+00:00    74.854   193.2000 
2013-01-08 00:00:00+00:00    75.029   192.8200 
2013-01-09 00:00:00+00:00    73.873   192.3800 

gewünschter Datenrahmen (Ausgabe von print(desired_df)):

  Date Company  Kind   Price 
0 2014-01-02  IBM  Open  187.210007 
1 2014-01-02  IBM  High  187.399994 
2 2014-01-02  IBM  Low  185.199997 
3 2014-01-02  IBM  Close  185.529999 
4 2014-01-02  IBM  Volume 4546500.000000 
5 2014-01-02  IBM Adj Close  171.971090 
6 2014-01-02 MSFT  Open  37.349998 
7 2014-01-02 MSFT  High  37.400002 
8 2014-01-02 MSFT  Low  37.099998 
9 2014-01-02 MSFT  Close  37.160000 
10 2014-01-02 MSFT  Volume 30632200.000000 
11 2014-01-02 MSFT Adj Close  34.960000 
12 2014-01-02 ORCL  Open  37.779999 
13 2014-01-02 ORCL  High  38.029999 
14 2014-01-02 ORCL  Low  37.549999 
15 2014-01-02 ORCL  Close  37.840000 
16 2014-01-02 ORCL  Volume 18162100.000000 

Was ist der beste Weg, um die current_df-desired_df neu zu organisieren?

Update 3: Ich habe es endlich aus der Hilfe von @knagaev arbeiten:

df['Datetime'] = df.index 
melted_df = pd.melt(df, id_vars='Datetime', var_name='Security', value_name='Price') 
melted_df['Dummy'] = 0 

sns.tsplot(melted_df, time='Datetime', unit='Dummy', condition='Security', value='Price', ax=ax) 

zu produzieren: enter image description here

I der Index eine Dummy-Spalte sowie Finesse hinzufügen hatte

+0

'seaborn' im Allgemeinen keine Funktionalität duplizieren, die in matplotlib oder Pandas availible ist. Gibt es etwas Spezifisches, das du versuchst zu tun? – mwaskom

+0

können Sie die Ausgabe von 'df.to_csv()' oder 'df.to_dict()' posten - damit wir Ihren DF einfach neu erstellen können? – MaxU

+0

@MaxU Ich habe die Frage mit den Daten aktualisiert. Danke für einen Blick. –

Antwort

5

Sie können versuchen, Hände schmutzig zu bekommen mit tsplot.

Sie Ihre Liniendiagramme mit Standardfehler („statistische Ergänzungen“)

Ich habe versucht, ziehen Sie Ihre Datenmenge zu simulieren. Also hier sind die Ergebnisse

import pandas.io.data as web 
from datetime import datetime 
import seaborn as sns 

stocks = ['ORCL', 'TSLA', 'IBM','YELP', 'MSFT'] 
start = datetime(2014,1,1) 
end = datetime(2014,3,28)  
f = web.DataReader(stocks, 'yahoo',start,end) 

df = pd.DataFrame(f.to_frame().stack()).reset_index() 
df.columns = ['Date', 'Company', 'Kind', 'Price'] 

sns.tsplot(df, time='Date', unit='Kind', condition='Company', value='Price') 

Übrigens ist diese Probe sehr imitativ.Der Parameter "Einheit" ist "Feld in dem Daten-Datenrahmen, der die Abtasteinheit identifiziert (z. B. Subjekt, Neuron, usw.). Die Fehlerrepräsentation wird über Einheiten bei jeder Zeit-/Zustandsbeobachtung zusammenfallen." (Aus der Dokumentation). Daher habe ich das Feld "Kind" zu Illustrationszwecken verwendet.

Ok, ich habe ein Beispiel für Ihren Datenrahmen gemacht. Es hat Dummy-Feld für "noise Reinigung" :)

import pandas.io.data as web 
from datetime import datetime 
import seaborn as sns 

stocks = ['ORCL', 'TSLA', 'IBM','YELP', 'MSFT'] 
start = datetime(2010,1,1) 
end = datetime(2015,12,31)  
f = web.DataReader(stocks, 'yahoo',start,end) 

df = pd.DataFrame(f.to_frame().stack()).reset_index() 
df.columns = ['Date', 'Company', 'Kind', 'Price'] 

df_open = df[df['Kind'] == 'Open'].copy() 
df_open['Dummy'] = 0 

sns.tsplot(df_open, time='Date', unit='Dummy', condition='Company', value='Price') 
Verwandte Themen