Search code examples
pythonpandasnumpyplotyahoo-finance

Python Pandas plot using dataframe column values


I'm trying to plot a graph using dataframes.

I'm using 'pandas_datareader' to get the data.

so my code is below:

tickers = ["AAPL","GOOG","MSFT","XOM","BRK-A","FB","JNJ","GE","AMZN","WFC"]
import pandas_datareader.data as web
import datetime as dt
end = dt.datetime.now().strftime("%Y-%m-%d")
start = (dt.datetime.now()-dt.timedelta(days=365*3)).strftime("%Y-%m-%d")
%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
data = []
for ticker in tickers:
    sub_df = web.get_data_yahoo(ticker, start, end)
    sub_df["name"] = ticker
    data.append(sub_df)
data = pd.concat(data)

So in the variable data, there are 8 columns = ['Date', 'Open', 'High' ,'Low' ,'Close' 'Volume', 'Adj Close','name']

The variable 'data' is shown below: enter image description here

What I want to do is to plot a graph taking 'date' values as x-parameter , 'high' as y-parameter with multiple columns as 'name' column values(=["AAPL","GOOG","MSFT","XOM","BRK-A","FB","JNJ","GE","AMZN","WFC"]).

How can I do this?

When i executed data.plot(), the result takes data as x-parameter well but there are 5 columns ['open','high','low','close','volume','adj close'] not 7 columns ["AAPL","GOOG","MSFT","XOM","BRK-A","FB","JNJ","GE","AMZN","WFC"] : what i want to do. The result is below: enter image description here


Solution

  • You need to reshape your data so that the names become the header of the data frame, here since you want to plot High only, you can extract the High and name columns, and transform it to wide format, then do the plot:

    import matplotlib as mpl
    mpl.rcParams['savefig.dpi'] = 120
    
    high = data[["High", "name"]].set_index("name", append=True).High.unstack("name")
    
    # notice here I scale down the BRK-A column so that it will be at the same scale as other columns
    high['BRK-A'] = high['BRK-A']/1000
    high.head()
    

    enter image description here

    ax = high.plot(figsize = (16, 10))
    

    enter image description here