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
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-')
Je pense que le plus simple est de sélectionner des colonnes par sous-ensemble, puis DataFrame.plot
:
df[['ISP.MI','Ctrv']].plot()
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()
Cependant, je pense que votre dataframe est différent de deux manières:
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.
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