- 问题是如何根据股票代码绘制adj_close和日期?
- 可以通过使用
.pivot
或.groupby
将数据框重塑为宽格式,或直接使用seaborn
绘制现有的长格式数据框来实现。
- 在以下示例数据中,
'Date'
列具有datetime64[ns] Dtype
。
- 如有需要,请使用
pandas.to_datetime
转换Dtype
。
- 在
python 3.10
、pandas 1.4.2
、matplotlib 3.5.1
、seaborn 0.11.2
下测试通过
Imports and Sample Data
import pandas as pd
import pandas_datareader as web
import seaborn as sns
import matplotlib.pyplot as plt
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]]
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
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
默认使用 matplotlib
作为后端进行绘图。
- 使用
pandas.DataFrame.pivot
对数据框进行重塑,将长格式转换为宽格式,并将数据框放在正确的绘图格式中。
.pivot
不会聚合数据,因此如果每个索引、每个股票代码存在多个观察值,则需要使用.pivot_table
。
- 添加
subplots=True
将生成一个包含两个子图的图形。
dfp = df.pivot(index='Date', columns='ticker', values='Adj Close')
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
ax = dfp.plot(figsize=(11, 6))
![在这里输入图片描述](https://istack.dev59.com/UxDW8.webp)
- 使用
seaborn
,接受长格式数据,因此不需要将数据框重塑为宽格式。
seaborn
是一个基于 matplotlib
的高级应用程序接口。
fig, ax = plt.subplots(figsize=(11, 6))
sns.lineplot(data=df, x='Date', y='Adj Close', hue='ticker', ax=ax)
- 添加
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](https://istack.dev59.com/tvX7O.webp)