熊猫数据帧组由图组成

MCM*_*MCM 34 python matplotlib dataframe pandas

我有一个数据框,其结构如下:

          Date   ticker  adj_close 
0   2016-11-21     AAPL    111.730     
1   2016-11-22     AAPL    111.800    
2   2016-11-23     AAPL    111.230    
3   2016-11-25     AAPL    111.790     
4   2016-11-28     AAPL    111.570    
...          
8   2016-11-21      ACN    119.680            
9   2016-11-22      ACN    119.480              
10  2016-11-23      ACN    119.820              
11  2016-11-25      ACN    120.740 
...             
Run Code Online (Sandbox Code Playgroud)

我如何根据adj_close对比的股票进行情节绘制Date

Jul*_*rec 58

简单的情节,

您可以使用:

df.plot(x='Date',y='adj_close')
Run Code Online (Sandbox Code Playgroud)

或者您可以Date预先设置索引,然后可以轻松绘制所需的列:

df.set_index('Date', inplace=True)
df['adj_close'].plot()
Run Code Online (Sandbox Code Playgroud)

如果你想用一个图表有一个系列ticker就可以了

你需要在之前分组:

df.set_index('Date', inplace=True)
df.groupby('ticker')['adj_close'].plot(legend=True)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

简单的情节,

您可以使用:

grouped = df.groupby('ticker')

ncols=2
nrows = int(np.ceil(grouped.ngroups/ncols))

fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(12,4), sharey=True)

for (key, ax) in zip(grouped.groups.keys(), axes.flatten()):
    grouped.get_group(key).plot(ax=ax)

ax.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

或者您可以Date预先设置索引,然后可以轻松绘制所需的列:

df.plot(x='Date',y='adj_close')
Run Code Online (Sandbox Code Playgroud)

如果您想要一个包含单个子图的图表:

df.set_index('Date', inplace=True)
df['adj_close'].plot()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Yaa*_*ler 19

与上述 Julien 的回答类似,我在以下方面取得了成功:

fig, ax = plt.subplots(figsize=(10,4))
for key, grp in df.groupby(['ticker']):
    ax.plot(grp['Date'], grp['adj_close'], label=key)

ax.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

如果您想在 matlab 中进行更多控制,则此解决方案可能更相关。

解决方案灵感来自:https : //stackoverflow.com/a/52526454/10521959


Tre*_*ney 9

  • 问题是如何根据股票行情来绘制 adj_close 与 Date 的关系?
    • .pivot这可以通过使用或将数据帧重塑为宽格式.groupby,或者直接使用 绘制现有的长格式数据帧来完成seaborn
  • 在以下示例数据中,该'Date'列具有datetime64[ns] Dtype.
    • 如果需要的Dtype话,将其转换为。pandas.to_datetime
  • 测试于python 3.10, pandas 1.4.2, matplotlib 3.5.1,seaborn 0.11.2

导入和样本数据

import pandas as pd
import pandas_datareader as web  # for sample data; this can be installed with conda if using Anaconda, otherwise pip
import seaborn as sns
import matplotlib.pyplot as plt

# sample stock data, where .iloc[:, [5, 6]] selects only the 'Adj Close' and 'tkr' column
tickers = ['aapl', 'acn']
df = pd.concat((web.DataReader(ticker, data_source='yahoo', start='2020-01-01', end='2022-06-21')
                .assign(ticker=ticker) for ticker in tickers)).iloc[:, [5, 6]]

# display(df.head())
        Date  Adj Close ticker
0 2020-01-02  73.785904   aapl
1 2020-01-03  73.068573   aapl
2 2020-01-06  73.650795   aapl
3 2020-01-07  73.304420   aapl
4 2020-01-08  74.483604   aapl

# display(df.tail())
           Date   Adj Close ticker
1239 2022-06-14  275.119995    acn
1240 2022-06-15  281.190002    acn
1241 2022-06-16  270.899994    acn
1242 2022-06-17  275.380005    acn
1243 2022-06-21  282.730011    acn
Run Code Online (Sandbox Code Playgroud)

pandas.DataFrame.pivot&pandas.DataFrame.plot

  • pandasmatplotlib作为默认后端进行绘图。
  • 通过从长形式转换为宽形式来重塑数据帧pandas.DataFrame.pivot,并将数据帧转换为正确的格式以进行绘制。
  • .pivot不聚合数据,因此如果每个索引、每个股票代码有超过 1 个观察值,则使用.pivot_table
  • 添加subplots=True将产生一个带有两个子图的图形。
# reshape the long form data into a wide form
dfp = df.pivot(index='Date', columns='ticker', values='Adj Close')

# display(dfp.head())
ticker           aapl         acn
Date                             
2020-01-02  73.785904  203.171112
2020-01-03  73.068573  202.832764
2020-01-06  73.650795  201.508224
2020-01-07  73.304420  197.157654
2020-01-08  74.483604  197.544434

# plot
ax = dfp.plot(figsize=(11, 6))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


  • 使用seaborn,它接受长格式数据,因此无需将数据帧重新整形为宽格式。
  • seaborn是一个高级 APImatplotlib

sns.lineplot:轴级图

fig, ax = plt.subplots(figsize=(11, 6))
sns.lineplot(data=df, x='Date', y='Adj Close', hue='ticker', ax=ax)
Run Code Online (Sandbox Code Playgroud)

sns.relplot:图形级图

  • 添加row='ticker', 或col='ticker', 将生成一个带有两个子图的图形。
g = sns.relplot(kind='line', data=df, x='Date', y='Adj Close', hue='ticker', aspect=1.75)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述