m0_74420115 2024-05-03 19:32 采纳率: 71.9%
浏览 3
已结题

python怎么指定日期

在读文件的时,csv文件日期是2010-2024年,怎么指定日期,只用2010-2020年的数据

import pandas as pd
def parse_date(date_string):
    return pd.Timestamp(date_string.replace('_', '-'))
df = pd.read_csv('D:/findata.csv', index_col='Date', parse_dates=True, date_parser=parse_date)
df.sort_index(inplace=True)
def Stock_Price_LSTM_Data_Precesing(df,mem_his_days,pre_days):
    df.dropna(inplace=True)
    df.sort_index(inplace=True)
    df['label']= df['Close'].shift(-pre_days)
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    sca_X=scaler.fit_transform(df.iloc[:,:-1])
    
    
    mem_his_days = 10
    
    from collections import deque
    deq = deque(maxlen=mem_his_days)
    
    X = []
    for i in sca_X:
        deq.append(list(i))
        if len(deq)==mem_his_days:
            X.append(list(deq))
    X_lately = X[-pre_days:]
    X = X[:-pre_days]
    y = df['label'].values[mem_his_days-1:-pre_days]
    
    
    import numpy as np
    X = np.array(X)
    y = np.array(y)
    return X,y,X_lately
X,y,X_lately = Stock_Price_LSTM_Data_Precesing(df,5,10)
print(len(X))
print(len(y))
print(len(X_lately))
pre_days = 10
# mem_days=[5,10,15]
# lstm_layers=[1,2,3]
# dense_layers=[1,2,3]
# units = [16,32]
mem_days=[5]
lstm_layers=[3]
dense_layers=[2]
units = [32]

from tensorflow.keras.callbacks import ModelCheckpoint
for the_mem_days in mem_days:
    for the_lstm_layers in lstm_layers:
        for the_dense_layers in dense_layers:
            for the_units in units:
                filepath=filepath=f"./bestmodel1/{{val_mape:.2f}}{{epoch:02d}}men{the_mem_days}lstm{the_lstm_layers}dense{the_dense_layers}unit{the_units}.keras"
                checkpoint = ModelCheckpoint(
                    filepath=filepath,
                    save_weights_only=False,
                    monitor='val_mape',
                    mode='min',
                    save_best_only=True)
                X,y,X_lately = Stock_Price_LSTM_Data_Precesing(df,the_mem_days,pre_days)
                from sklearn.model_selection import train_test_split
                X_train,X_test,y_train,y_test = train_test_split(X,y,shuffle=False,test_size=0.1)
                import tensorflow as tf
                from tensorflow.keras.models import Sequential
                from tensorflow.keras.layers import LSTM,Dense,Dropout
                model = Sequential()
                model.add(LSTM(the_units,input_shape=X.shape[1:],activation='relu',return_sequences=True))
                model.add(Dropout(0.1))
                for i in range(the_lstm_layers):
                    model.add(LSTM(the_units,activation='relu',return_sequences=True))
                    model.add(Dropout(0.1))
                
                model.add(LSTM(the_units,activation='relu'))
                model.add(Dropout(0.1))
                for i in range(the_dense_layers):
                    model.add(Dense(the_units,activation='relu'))
                    model.add(Dropout(0.1))
                
                model.add(Dense(1))
                model.compile(optimizer='adam',
                             loss='mse',
                             metrics=['mape'])
                model.fit(X_train,y_train,batch_size=32,epochs=50,validation_data=(X_test,y_test),callbacks=[checkpoint])

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-03 19:32
    关注

    引自免费微信小程序:皆我百晓生

    为了实现根据指定日期范围筛选CSV文件中的数据,你需要对原始CSV文件进行预处理,仅保留2010年至2020年的数据。以下是修改后的代码,它会添加一个额外的步骤,在读取CSV之前检查日期并过滤掉不在指定范围内的行。

    首先,我们需要定义一个函数来判断日期是否在给定范围内。然后在读取CSV文件后,我们可以使用这个函数来过滤数据。

    下面是修改后的代码:

    import pandas as pd
    
    def is_date_in_range(date_string):
        year = int(date_string.split('-')[0])
        return 2010 <= year <= 2020
    
    def parse_date(date_string):
        return pd.Timestamp(date_string.replace('_', '-'))
    
    def filter_by_date(df, start_year=2010, end_year=2020):
        return df[df.index.year.between(start_year, end_year)]
    
    df = pd.read_csv('D:/findata.csv', index_col='Date', parse_dates=True, date_parser=parse_date)
    filtered_df = filter_by_date(df)
    
    df.sort_index(inplace=True)
    filtered_df.sort_index(inplace=True)
    
    def Stock_Price_LSTM_Data_Precesing(df, mem_his_days, pre_days):
        # ... (保持原代码不变)
    
    # ... (保持原代码不变,但将df替换为filtered_df)
    
    # 在调用Stock_Price_LSTM_Data_Precesing之前,将df替换成filtered_df
    X, y, X_lately = Stock_Price_LSTM_Data_Precesing(filtered_df, the_mem_days, pre_days)
    # ... (剩余代码保持不变)
    

    这段代码做了以下更改:

    1. 添加了一个is_date_in_range函数,用于检查日期字符串是否在指定范围内。
    2. 添加了一个filter_by_date函数,该函数接收一个DataFrame和两个年份参数,返回一个新的DataFrame,其中只包含在这两个年份之间的记录。
    3. 将原始CSV文件读取后的数据帧df替换为经过筛选的filtered_df,这样后续的操作只会基于2010年至2020年的数据。

    这样,您就可以从CSV文件中获取2010年至2020年的数据,并进行后续的分析和建模了。

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

报告相同问题?

问题事件

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