web-dev-qa-db-fra.com

plot pandas dataframe deux colonnes de

j'ai un pandas dataframe qui a des dates comme index et quelques colonnes: je voudrais tracer un graphique linéaire avec 2 lignes (disons 'ISP.MI' et 'Ctrv'); sur le axe x j'ai besoin de la 'Date'

Ticker       ISP.MI  Daily returns        Ctrv  Inv_Am  Giac_Media
Date                                                                 
2016-01-01  2.90117            NaN  100.000000     100       100.0   
2016-01-04  2.80159      -0.034927  196.507301     200       150.0   
2016-01-05  2.85608       0.019263  300.292610     300       200.0   
2016-01-06  2.77904      -0.027345  392.081255     400       250.0   
2016-01-07  2.73206      -0.017050  485.396411     500       300.0   
2016-01-08  2.72267      -0.003443  583.725246     600       350.0   
10
Alessandro Sorvillo

si vous ne vous souciez pas de l'échelle des axes:

plt.figure()

x = df['Date']
y1 = df['ISP.MI']
y2 = df['Ctrv']

plt.plot(x,y1)
plt.plot(x,y2)

si vous vous en souciez:

fig, ax1 = plt.subplots()

x = df['Date']
y1 = df['ISP.MI']
y2 = df['Ctrv']

ax2 = ax1.twinx()

ax1.plot(x, y1, 'g-')
ax2.plot(x, y2, 'b-')
9
epattaro

Je pense que le plus simple est de sélectionner des colonnes par sous-ensemble, puis DataFrame.plot :

df[['ISP.MI','Ctrv']].plot()
28
jezrael

Donc, voici le code qui crée à partir de zéro une trame de données qui ressemble à la vôtre et génère le tracé que vous avez demandé:

import pandas as pd
import datetime
import numpy as np
from matplotlib import pyplot as plt

# The following two lines are not mandatory for the code to work
import matplotlib.style as style
style.use('dark_background')

def create_datetime_range(numdays=10):
    """Creates the timestamp range"""
    base = datetime.datetime.today()
    datelist = pd.date_range(base, periods=numdays).to_pydatetime()
    return datelist
def convert_to_date(datetime_list):
    """Converts a timestamp array into a date array"""
    return [x.date() for x in datetime_list]



a = pd.DataFrame(
    {
        'ISP.MI': np.random.normal(2,1,10),
        'Ctrv' : np.random.normal(200,150,10)
    }, 
    index=convert_to_date(create_date_range())
)
a.plot()

enter image description here

Cependant, je pense que votre dataframe est différent de deux manières:

  1. Il semble qu'il y ait deux niveaux dans l'index (le titre Date apparaît sur une deuxième ligne au titre Ticker). J'imagine que cela pourrait être dû au fait que vous avez utilisé quelque chose comme .groupby () ou .unstack () ou une autre méthode d'agrégation/pivotement. Je vous suggère de regarder dans la méthode reset_index ().

2.Votre trame de données a plus de colonnes dont vous avez besoin. Comme suggéré par @jezrael, vous devez d'abord sélectionner uniquement ceux-ci. Vous pouvez le faire avec quelque chose comme:

df[['ISP.MI','Ctrv']]

puis en utilisant la méthode .plot () sur la plus petite trame de données et laissez pandas gérer le reste.

2
Pezze
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

d = {'x' : [1,2,3,4,5,6,7,8,9,10],
     'y_one' : np.random.Rand(10),
     'y_two' : np.random.Rand(10)}

df = pd.DataFrame(d)

df.plot('x',y=['y_one','y_two'])
plt.show()

enter image description here

0
alexbhandari

Maintenant dans la dernière pandas vous pouvez directement utiliser la fonction df.plot.scatter

df = pd.DataFrame([[5.1, 3.5, 0], [4.9, 3.0, 0], [7.0, 3.2, 1],
               [6.4, 3.2, 1], [5.9, 3.0, 2]],
              columns=['length', 'width', 'species'])
ax1 = df.plot.scatter(x='length',
                  y='width',
                  c='DarkBlue')

https://pandas.pydata.org/pandas-docs/version/0.23/generated/pandas.DataFrame.plot.scatter.html

0
shantanu pathak