大熊猫数据帧按小区分组

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

          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
...

我如何绘制基于股票代码的 adj_closeDate

216760 次浏览

情节很简单,

你可使用:

df.plot(x='Date',y='adj_close')

或者你可以事先将索引设置为 Date,这样就可以很容易地绘制出你想要的列:

df.set_index('Date', inplace=True)
df['adj_close'].plot()

如果你想要一个由 ticker的一个系列的图表

你必须在下列日期前购买 集体服装:

df.set_index('Date', inplace=True)
df.groupby('ticker')['adj_close'].plot(legend=True)

enter image description here


如果你想要一个有独立次要情节的图表:

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()

enter image description here

与 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()

如果您想在 matlab 中获得更多的控制,那么这个解决方案可能更相关。

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

  • 问题是 < strong > < em > 如何根据股票代码绘制 adj _ close 与 Date 的对比图?
    • 这可以通过使用 .pivot.groupby将数据帧重塑为宽格式,或者直接使用 seaborn绘制现有的长格式数据帧来实现。
  • 在下面的示例数据中,'Date'列有一个 datetime64[ns] Dtype
    • 如果需要,用 pandas.to_datetime转换 Dtype
  • 测试 python 3.10pandas 1.4.2matplotlib 3.5.1seaborn 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

pandas.DataFrame.pivot & < a href = “ https://Pandas.pydata.org/docs/reference/api/Pandas.DataFrame.plot.html”rel = “ nofollow noReferrer”> pandas.DataFrame.plot

  • pandasmatplotlib作为默认后端。
  • 利用 pandas.DataFrame.pivot对数据帧进行整形,实现了从长形到宽形的转换,并将数据帧转换成正确的格式进行绘图。
  • .pivot不聚合数据,所以如果每个指数、每个股票代码有一个以上的观察值,那么使用 .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))

enter image description here


  • 使用 seaborn,它可以接受长形式的数据,因此没有必要将数据框架重塑为宽形式。
  • seaborn matplotlib的高级 API

轴线图

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

sns.relplot : 图层情节

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

enter image description here