按日期分隔数据然后应用函数

Separating data by date then applying a function

所以我有一个包含 3000 多行的大型 table,它包含一堆交易信息,例如开盘价、收盘价等。

其中一列是 Datetime,此列中的条目将显示为:2022-03-03 09:30:00-05:00。每行都比前一行晚 5 分钟,所以在这种情况下,我刚放的那一行之后的下一行将是 2022-03-03 09:35:00-05:00.

我在一个单独的文件中创建了一个函数,该函数计算一个名为 RSI 的值(这意味着什么并不重要):

def RSI(p,q,window=10,signal_type='buy only'):
   
    
    gains = list(filter(lambda x: (x > 0), (p-q)))
    total_gains = sum(gains)
    avg_gain= total_gains/len(gains)
    
    loss = list(filter(lambda x: (x < 0), (p-q)))
    total_loss = (sum(loss))*-1
    avg_loss= total_loss/len(loss)
    
    RS=avg_gain/avg_loss
    rsi=100-(100/(1+RS))
    return (rsi)

这是我用来访问我的 excel 文件的代码,该文件包含所有信息和我用来创建摘要的代码 table:

dat = pd.read_csv('AMD_5m.csv',index_col='Datetime',parse_dates=['Datetime'],
                  date_parser=lambda x: pd.to_datetime(x, utc=True))
dates = backtest.get_dates(dat.index)
#create a summary table
cols = ['Num. Obs.', 'Num. Trade', 'PnL', 'Win. Ratio','RSI'] #add addtional fields if necessary
summary_table = pd.DataFrame(index = dates, columns=cols)

我想创建某种代码来按日期分隔大型数据集,因此它将收集所有数据,例如 2022-03-03,然后应用我的函数计算当天的 RSI .

我将添加与我的摘要相关的所有代码 table 这样您就可以看到我正在使用的格式类型,或者您是否只需要它因为我没有解释东西不错:

dat = pd.read_csv('AMD_5m.csv',index_col='Datetime',parse_dates=['Datetime'],
                  date_parser=lambda x: pd.to_datetime(x, utc=True))
dates = backtest.get_dates(dat.index)
#create a summary table
cols = ['Num. Obs.', 'Num. Trade', 'PnL', 'Win. Ratio','Avg Opening','Avg Closing','RSI'] #add addtional fields if necessary
summary_table = pd.DataFrame(index = dates, columns=cols)
# loop backtest by dates
for d in dates:
    this_dat = dat.loc[dat.index.date==d]
    #find the number of observations in date d
    summary_table.loc[d]['Num. Obs.'] = this_dat.shape[0] 
    #get trading (i.e. position holding) signals
    signals = backtest.SMA(this_dat['Close'].values, window=10)
    #find the number of trades in date d
    summary_table.loc[d]['Num. Trade'] = np.sum(np.diff(signals)==1) 
    #find PnLs for 100 shares
    shares = 100
    PnL = -shares*np.sum(this_dat['Close'].values[1:]*np.diff(signals))
    if np.sum(np.diff(signals))>0:
        #close position at market close
        PnL += shares*this_dat['Close'].values[-1]
    summary_table.loc[d]['PnL'] = PnL
    #find the win ratio
    ind_in = np.where(np.diff(signals)==1)[0]+1
    ind_out = np.where(np.diff(signals)==-1)[0]+1
    num_win = np.sum((this_dat['Close'].values[ind_out]-this_dat['Close'].values[ind_in])>0)
    if summary_table.loc[d]['Num. Trade']!=0:
        summary_table.loc[d]['Win. Ratio'] = 1. *num_win/summary_table.loc[d]['Num. Trade']
    dat['gain']=(dat['Close']/dat['Open'])-1
    this_dat['gain']=(this_dat['Close']/this_dat['Open'])-1

    
    summary_table.loc[d]['RSI'] = backtest.RSI(this_dat['Close'],this_dat['Open']) 
    #This only applies the function on one day, not all the days in the dataset#
    
summary_table.to_csv('AMD_5m_results.csv',index=True)

如果有人知道我该怎么做,请告诉我。

(注意:如果可能的话,我想保持一切不变,如果你需要,例如删除 Datetime 的时间部分,那么请制作一个新的 variable/function 来做这个,因为我不应该更改我提供的代码,这一切都是 for d in dates)

我不确定我是否正确理解了你的问题,但你可以在新列中像这样提取时间戳的日期:

df['dates'] = df['Datetime'].dt.date

如果您随后想为每一天应用一个函数,您可以按此列分组:

df_result = df.groupby(['date']).apply(RSI,p=42,q=42)

希望对您有所帮助 :D