如何解决如何绘制给定DataFrame的数据?
这是我正在使用的主要DataFrame:
- Date Open High Low Close
1. 01-08-2019 | 97.85 | 98.45 | 96.40 |97.25
2. 02-08-2019 | 97.15 | 98.95 | 96.75 |98.15
3. 05-08-2019 | 98.30 | 98.70 | 94.30 |95.65
4. 06-08-2019 | 95.75 | 97.75 | 95.20 |97.05
5. 07-08-2019 | 96.80 | 97.70 | 96.05 |96.90
6. 08-08-2019 | 97.40 | 98.90 | 96.55 |97.40
7. 09-08-2019 | 97.20 | 98.10 | 96.65 |97.30
8. 12-08-2019 | 97.20 | 97.25 | 93.40 |93.75
9. 13-08-2019 | 93.70 | 96.60 | 93.15 |96.35
我从DataFrame上方提取了高,低,每日收盘价,3天,每周,每月数据。如何在单张图中绘制每日高低收盘价,每周最高价,低位,收盘价和每月最高价低位收盘价?
每日高低收盘
Date High Low Close
0 2019-08-01 98.45 96.40 97.25
1 2019-08-02 98.95 96.75 98.15
2 2019-08-05 98.70 94.30 95.65
3 2019-08-06 97.75 95.20 97.05
4 2019-08-07 97.70 96.05 96.90
每周最高,最低,收盘价
Date High Low Close
0 2019-08-04 98.95 96.75 98.15
1 2019-08-11 98.90 96.65 97.40
2 2019-08-18 97.25 94.15 96.35
3 2019-08-25 93.85 92.25 93.50
4 2019-09-01 94.85 93.40 94.20
每月最高价低位收盘价
Date High Low Close
0 2019-08-31 98.95 96.75 98.15
1 2019-09-30 104.90 102.08 103.83
2 2019-10-31 102.90 100.15 102.05
3 2019-11-30 118.90 117.95 118.55
4 2019-12-31 138.40 135.85 135.90
Link to CSV file I am working with
解决方法
请记住要删除“假” today
日期的变量,因为该数据集不是最新的,所以我必须这样做
import datetime
import matplotlib.pyplot as plt
from datetime import date
from datetime import datetime
from datetime import timedelta
today1 = date.today() #run in up to date dataframe,change to 'today' and remove fake today below
today = '2019-08-06'
w_today = '2019-08-06'
m_today = '2019-08-06'
today = datetime.strptime(today,'%Y-%m-%d')
today = today.date()
w_today = datetime.strptime(w_today,'%Y-%m-%d')
w_today = w_today.date()
m_today = datetime.strptime(m_today,'%Y-%m-%d')
m_today = m_today.date()
df= pd.read_csv('D:/stack_overflow/US Coffee Aug19-Jul20.csv')
df['Date']=pd.to_datetime(df['Date']).dt.date
# df['Date']= df['Date'].floor('D')
#df from today,each day DAILY
df_daily = df[
df.Date>=today
]
df_daily = df_daily.reset_index(drop=True)
weekly = []
monthly = []
last_date = df_daily['Date'].iloc[-1]
while w_today < last_date:
w_today+=timedelta(days=7)
weekly.append(w_today)
while m_today < last_date:
m_today+=timedelta(days=10)
monthly.append(m_today)
df_weekly = df_daily[
df_daily.Date.isin(weekly)
]
df_monthly = df_daily[
df_daily.Date.isin(monthly)
]
fig,axs = plt.subplots(3)
axs[0].plot(df_daily['Date'],df_daily[['Open','High','Low','Close']])
axs[0].set_title('Daily')
axs[1].plot(df_weekly['Date'],df_weekly[['Open','Close']])
axs[1].set_title('Weekly')
axs[2].plot(df_monthly['Date'],df_monthly[['Open','Close']])
axs[2].set_title('Monthly')
plt.show()
,
重新使用ax
对象在同一图中绘制:
import pandas as pd
import matplotlib.pyplot as plt
daily_df = pd.DataFrame([
["2019-08-01",98.45,96.40,97.25],["2019-08-02",98.95,96.75,98.15],["2019-08-05",98.70,94.30,95.65],["2019-08-06",97.75,95.20,97.05],["2019-08-07",97.70,96.05,96.90]
],columns=["Date","daily_High","daily_Low","daily_Close"]
)
weekly_df = pd.DataFrame([
["2019-08-04",["2019-08-11",98.90,96.65,97.40],["2019-08-18",97.25,94.15,96.35],["2019-08-25",93.85,92.25,93.50],["2019-09-01",94.85,93.40,94.20]
],"weekly_High","weekly_Low","weekly_Close"]
)
monthly_df = pd.DataFrame([
["2019-08-31",["2019-09-30",104.90,102.08,103.83],["2019-10-31",102.90,100.15,102.05],["2019-11-30",118.90,117.95,118.55],["2019-12-31",138.40,135.85,135.90]
],"monthly_High","monthly_Low","monthly_Close"]
)
daily_df["Date"] = pd.to_datetime(daily_df["Date"],format='%Y-%m-%d')
weekly_df["Date"] = pd.to_datetime(weekly_df["Date"],format='%Y-%m-%d')
monthly_df["Date"] = pd.to_datetime(monthly_df["Date"],format='%Y-%m-%d')
daily_df.set_index(["Date"],inplace=True)
weekly_df.set_index(["Date"],inplace=True)
monthly_df.set_index(["Date"],inplace=True)
ax = daily_df.plot()
weekly_df.plot(ax=ax)
monthly_df.plot(ax=ax)
plt.show()
,
这是我第一次创建具有多个x轴的图形,并且进行了大量研究。我有几个问题要回答,例如验证数据和改善x轴的显示。我基于these answers对其进行了自定义。
import pandas as pd
import numpy as np
df= pd.read_csv('../../../Downloads/US Coffee Aug19-Jul20 - US Coffee Aug19-Jul20.csv')
df['Date'] = pd.to_datetime(df['Date'])
weeks = df.resample('W-Mon',on='Date')[['High','Close']].agg('mean').reset_index().sort_values(by='Date')
months = df.resample('1M','Close']].agg('mean').reset_index().sort_values(by='Date')
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(16,9),dpi=144)
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()
ax3 = ax1.twiny()
weeks_tick_locations = weeks['Date']
months_tick_locations = months['Date']
ax1.plot(df['Date'],df['High'],lw=1,color='b',label='Daily High')
ax1.plot(df['Date'],df['Close'],color='r',label='Daily Low')
ax2.plot(weeks['Date'],weeks['High'],lw=2,color='g',label='Week High')
ax2.plot(weeks['Date'],weeks['Close'],color='y',label='Week Low')
ax3.plot(months['Date'],months['High'],color='k',label='Month High')
ax3.plot(months['Date'],months['Close'],color='m',label='Month Low')
# Move twinned axis ticks and label from top to bottom
ax2.xaxis.set_ticks_position("bottom")
ax2.xaxis.set_label_position("bottom")
# Offset the twin axis below the host
ax2.spines["bottom"].set_position(("axes",-0.1))
ax2.set_frame_on(True)
ax2.patch.set_visible(False)
for sp in iter(ax2.spines.values()):
sp.set_visible(False)
ax2.spines["bottom"].set_visible(True)
ax2.set_xticks(weeks_tick_locations)
ax2.set_xticklabels(weeks_tick_locations)
ax2.set_xlabel('Week')
ax3.xaxis.set_ticks_position("bottom")
ax3.xaxis.set_label_position("bottom")
# Offset the twin axis below the host
ax3.spines["bottom"].set_position(("axes",-0.2))
ax3.set_frame_on(True)
ax3.patch.set_visible(False)
for sp in iter(ax3.spines.values()):
sp.set_visible(False)
ax3.spines["bottom"].set_visible(True)
ax3.set_xticks(months_tick_locations)
ax3.set_xticklabels(months_tick_locations)
ax3.set_xlabel('Month')
fig.legend(loc='upper left',bbox_to_anchor=(0.88,0.98),bbox_transform=ax1.transAxes,)
plt.show()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。