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
.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
pandas
matplotlib
作为默认后端进行绘图。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)
归档时间: |
|
查看次数: |
61347 次 |
最近记录: |