使用Pandas将每日数据重采样到每月(日期格式)

2024-06-08 23:29:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试着在熊猫数据框中从每天到每月重新取样一些数据。我对pandas还不熟悉,也许我需要先格式化日期和时间,然后才能这样做,但是我没有找到一个好的教程来指导如何正确处理导入的时间序列数据。我发现的一切都是从雅虎或Quandl自动导入数据。

以下是我的数据框中的内容: dataframe segment screenshot

下面是我用来创建数据帧的代码:

#Import excel file into a Pandas DataFrame
df = pd.read_excel(open('2016_forex_daily_returns.xlsx','rb'), sheetname='Sheet 1')

#Calculate the daily returns
df['daily_ret'] = df['Equity'].pct_change()

# Assume an average annual risk-free rate over the period of 5%
df['excess_daily_ret'] = df['daily_ret'] - 0.05/252

有人能帮我理解我需要对数据框中的“日期”和“时间”列做些什么,以便我可以重新取样吗?


Tags: the数据内容pandasdf时间教程序列
3条回答

对于createDataFrame可以使用:

df = pd.read_excel('2016_forex_daily_returns.xlsx', sheetname='Sheet 1')
print (df)
        Date      Time  Equity
0 2016-01-03  22:16:22  300.38
1 2016-01-04  22:16:00  300.65
2 2016-01-05  14:26:02  301.65
3 2016-01-06  19:08:13  302.10
4 2016-01-07  18:39:00  302.55
5 2016-01-08  22:16:04  308.24
6 2016-01-11  02:49:39  306.69
7 2016-01-14  15:46:39  307.93
8 2016-01-19  15:56:31  308.18

我认为您可以先转换^{}date,然后使用^{}和一些聚合函数,如summean

df.Date = pd.to_datetime(df.Date)
df1 = df.resample('M', on='Date').sum()
print (df1)
             Equity  excess_daily_ret
Date                                 
2016-01-31  2738.37          0.024252

df2 = df.resample('M', on='Date').mean()
print (df2)
                Equity  excess_daily_ret
Date                                    
2016-01-31  304.263333          0.003032

df3 = df.set_index('Date').resample('M').mean()
print (df3)
                Equity  excess_daily_ret
Date                                    
2016-01-31  304.263333          0.003032

要将每日数据重采样到每月数据,可以使用resample方法。特别是对于每日收益,下面的示例演示了一个可能的解决方案。

以下数据取自AQR执行的分析。它代表了2019年5月的市场每日回报。以下代码可用于将数据构造为pd.DataFrame

import pandas as pd

dates = pd.DatetimeIndex(['2019-05-01', '2019-05-02', '2019-05-03', '2019-05-06',
                         '2019-05-07', '2019-05-08', '2019-05-09', '2019-05-10',
                         '2019-05-13', '2019-05-14', '2019-05-15', '2019-05-16',
                         '2019-05-17', '2019-05-20', '2019-05-21', '2019-05-22',
                         '2019-05-23', '2019-05-24', '2019-05-27', '2019-05-28',
                         '2019-05-29', '2019-05-30', '2019-05-31'],
                         dtype='datetime64[ns]', name='DATE', freq=None)

daily_returns = array([-7.73787813e-03, -1.73277604e-03,  1.09124031e-02, -3.80437796e-03,
                       -1.66513456e-02, -1.67262934e-03, -2.77427734e-03,  4.01713274e-03,
                       -2.50407102e-02,  9.23270367e-03,  5.41897568e-03,  8.65419524e-03,
                       -6.83456209e-03, -6.54787106e-03,  9.04322511e-03, -4.05811322e-03,
                       -1.33152640e-02,  2.73398876e-03, -9.52000000e-05, -7.91438809e-03,
                       -7.16881982e-03,  1.19255102e-03, -1.24209547e-02])

daily_returns = pd.DataFrame(index = index, data= may.values, columns = ["returns"])

假设您没有每日价格数据,可以使用以下代码从每日收益重新采样到每月收益。

>>> daily_returns.resample("M").apply(lambda x: ((x + 1).cumprod() - 1).last("D"))
-0.06532

如果你参考他们的monthly dataset,这证实了2019年5月的市场回报率接近-6.52%-0.06532

我在这里创建了一个与您类似的随机数据帧:

import numpy as np
import pandas as pd
dates = [x for x in pd.date_range(end=pd.datetime.today(), periods=1800)]
counts = [x for x in np.random.randint(0, 10000, size=1800)]
df = pd.DataFrame({'dates': dates, 'counts': counts}).set_index('dates')

以下是收集每周计数总和的步骤,作为示例:

df['week'] = df.index.week
df['year'] = df.index.year
target_df = df.groupby(['year', 'week']).agg({'counts': np.sum})

其中,目标的输出是:

                counts
year    week    
2015    3       29877
        4       36859
        5       36872
        6       36899
        7       37769
 .      .         .
 .      .         .
 .      .         .

相关问题 更多 >