【问题标题】:How to plot the Data For given DataFrame?如何绘制给定 DataFrame 的数据?
【发布时间】:2020-08-12 22:38:44
【问题描述】:

这是我正在使用的主要 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

【问题讨论】:

  • 每日数据你理解为 7 天的情节?还是实际日期的所有数据,逐日?
  • 所有数据来自实际日期,逐日

标签: python pandas matplotlib


【解决方案1】:

这是我第一次创建具有多个 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', on='Date')[['High','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'], lw=1, color='r', label='Daily Low')

ax2.plot(weeks['Date'], weeks['High'], lw=2, color='g', label='Week High')
ax2.plot(weeks['Date'], weeks['Close'], lw=2, color='y', label='Week Low')

ax3.plot(months['Date'], months['High'], lw=2, color='k', label='Month High')
ax3.plot(months['Date'], months['Close'], lw=2, 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()

【讨论】:

    【解决方案2】:

    重复使用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", 98.95, 96.75, 98.15],
       ["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]
    ], columns=["Date", "weekly_High", "weekly_Low", "weekly_Close"]
    )
    
    monthly_df = pd.DataFrame([
       ["2019-08-31", 98.95 , 96.75 , 98.15],
       ["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]
    ], columns=["Date", "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()
    

    【讨论】:

      【解决方案3】:

      记得删除“假”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','High','Low' ,'Close']])
      axs[1].set_title('Weekly')
      axs[2].plot(df_monthly['Date'],df_monthly[['Open','High','Low' ,'Close']])
      axs[2].set_title('Monthly')
      
      plt.show()
      

      【讨论】:

      • 我想绘制单个提取的 DataFrame Not 'US Coffee Aug19-Jul20.csv'
      • @Vishal Naik 这个csv是一个例子,你可以修改它
      猜你喜欢
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多