m0_74420115 2024-05-01 18:46 采纳率: 71.9%
浏览 4
已结题

python绘图时日期错误


import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras.models import load_model
 
# 假设CSV文件的第一列是日期,且格式正确可被pd.to_datetime解析
file_path = r"D:\\findata.csv"  
df = pd.read_csv(file_path)
df['Date'] = pd.to_datetime(df.pop(df.columns[0]), format='%Y_%m_%d')
 
def extract_dates_for_prediction(df, pre_days):
    # 获取用于预测的日期范围,这里简化处理,实际情况需根据数据切分逻辑调整
    last_dates = df['Date'][-(pre_days + len(y_test)):]  # 包含最后一个用于预测的日期及其前pre_days天
    return last_dates[-len(y_test):]  # 取出与预测结果对应的部分
 
# ... (你的数据预处理和模型训练代码保持不变)
 
# 加载最佳模型并进行预测
best_model = load_model('./thebestmodel/7.8713men15lstm3dense2unit32.keras')
pre = best_model.predict(X_test)
 
# 提取正确的日期范围
correct_dates = extract_dates_for_prediction(df, pre_days)
 
# 绘制图表
plt.figure(figsize=(14, 7))
plt.plot(correct_dates, y_test, color='red', label='Actual Price')
plt.plot(correct_dates, pre, color='green', label='Predicted Price')
plt.title('Stock Price Prediction')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.grid(True)
plt.xticks(rotation=45)  # 旋转X轴标签以便更好地显示
plt.show()

我的csv文件的数据是从2024年到2010年,2024年的数据在最上面,绘图时是从2010年开始的,怎么调整让绘图从最近的日期开始

  • 写回答

6条回答 默认 最新

  • 专家-皆知 2024-05-01 18:46
    关注

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    为了确保绘图从最新的日期开始,您需要确保在处理日期时它们按照降序排列,即最近的日期在前。在您的代码中,当您读取CSV文件并转换日期时,可以不需要额外步骤来改变日期的排序,因为pd.read_csv默认情况下不会改变行的顺序,这意味着最新日期(假设在文件顶部)应该已经是最先的。

    但是,当您提取用于预测的日期范围时,您需要确保这部分逻辑不会颠倒日期顺序。当前,您的extract_dates_for_prediction函数从DataFrame的末尾开始取日期,这在您的场景下可能导致日期顺序不正确。为了解决这个问题,我们可以稍微调整这个函数,确保它总是返回按日期降序排列的日期序列,特别是当您从数据的后部提取日期时。

    下面是一个调整后的版本,确保日期正确排序:

    def extract_dates_for_prediction(df, pre_days):
        # 确保日期列是排序的,这里假设原始数据已经是正序或您之前进行了排序
        df_sorted = df.sort_values(by='Date', ascending=False)  # 以降序排列,确保最新日期在前
        last_dates = df_sorted['Date'][:-(pre_days - 1)]  # 注意这里的调整,确保不会超出索引
        return last_dates  # 返回排序后的日期,这部分将与预测结果对应
    
    # 在实际调用此函数前,确保df是按日期正确排序的
    # 假设您不需要特别调整df的顺序,因为按您描述,读取时就应该是从2024到2010的顺序
    
    # 然后,使用更新后的函数提取日期
    correct_dates = extract_dates_for_prediction(df, pre_days)
    
    # 接下来,您的绘图代码应该能正确地从最近的日期开始绘图了。
    # 绘图代码保持不变
    plt.figure(figsize=(14, 7))
    plt.plot(correct_dates, y_test, color='red', label='Actual Price')
    plt.plot(correct_dates, pre, color='green', label='Predicted Price')
    plt.title('Stock Price Prediction')
    plt.xlabel('Date')
    plt.ylabel('Price')
    plt.legend()
    plt.grid(True)
    plt.xticks(rotation=45)  # 旋转X轴标签以便更好地显示
    plt.show()
    

    这段代码的关键在于确保在提取用于预测的日期时,日期列已经按照从新到旧的顺序排列。这样,无论原始DataFrame中的日期如何排序,最终绘图都会从最新的日期开始。请确认您的df在进行日期提取之前是否已经是按日期降序排列的,如果不是,上述代码中的df_sorted = df.sort_values(by='Date', ascending=False)将非常关键。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 5月12日
  • 已采纳回答 5月4日
  • 创建了问题 5月1日