使用 Pandas 重新采样然后填充原始数据框

Posted

技术标签:

【中文标题】使用 Pandas 重新采样然后填充原始数据框【英文标题】:Using Pandas resample then populating original dataframe 【发布时间】:2016-11-02 19:42:39 【问题描述】:

我正在根据一周的收盘价和下周的开盘价调查市场统计数据。为此,我在 Pandas 中使用resample。为了举个例子,我在下面使用 pandas DataReader。

from pandas.io.data import DataReader

首先获取每日市场数据:

SP = DataReader("^GSPC", "yahoo") 
del SP['Adj Close'] 
del SP['Volume'] 

SP.head()

              Open       High         Low       Close
Date                
2010-01-04  1116.560059 1133.869995 1116.560059 1132.989990
2010-01-05  1132.660034 1136.630005 1129.660034 1136.520020

现在将resample 改为每周时间范围:

ohlc_dict =                                                                                                              
'Open':'first',                                                                                                                                                                                                         
'Close': 'last'
w1_resamp = SP.resample('1w',how=ohlc_dict, closed='left', label='left')

这给了我每周的收盘和开盘数据。我现在根据np.where 声明强调上周收盘价和本周开盘价之间的距离。

w1_resamp['distance'] = np.where(w1_resamp['Open'] < w1_resamp['Close'].shift(),(w1_resamp["Close"].shift() - w1_resamp["Open"]),'np.nan'); 



               Close    Open        distance
Date            
2010-01-03  1144.979980 1116.560059 
2010-01-10  1136.030029 1145.959961 
2010-01-17  1091.760010 1136.030029 
2010-01-24  1073.869995 1092.400024 
2010-01-31  1066.189941 1073.890015 
2010-02-07  1075.510010 1065.510010 0.6799310000001242
2010-02-14  1109.170044 1079.130005 
2010-02-21  1104.489990 1110.000000 
2010-02-28  1138.699951 1105.359985 
2010-03-07  1149.989990 1138.400024 0.29992700000002515
2010-03-14  1159.900024 1148.530029 1.4599610000000212

我现在想在原始数据框 SP 中添加一个新列,显示时间和日期间隙(如 w1_resamp['distance'] 中突出显示)已关闭但不知道如何执行此操作...有人可以帮忙吗?

根据 cmets 中的请求,添加的图像在 SP 数据帧中显示所需的输出:

【问题讨论】:

可能有助于查看您希望最终数据框的外观示例。您想要在该周下跌后再次达到原始每周开盘价时的列标记? “差距已缩小”是什么意思?你的意思是distance 从非空变为空?此外,对于 else 情况,您的 np.where() 应该返回 np.nan,而不是 '' 嗨,举个例子来说明一下。如果我们看到 2010-01-31 周收盘价为 1066.18,下周开盘价为 1065.51,则 w1_resamp['distance'] 列中突出显示的差距为 0.67。我想在 SP 数据框上创建一个新列,突出显示此差距关闭且价格回到 1066.18 的那一天。最终我将使用分钟数据并希望捕获一天中的时间,但上面的示例不够精细,因为源数据是每天的。 添加的图像显示了所需的 SP 数据帧输出 @Jeff L。突出显示的值与我的上一条评论一致。 【参考方案1】:

我没有按照您对“间隙已关闭”字段的要求,但是可以尝试一下,看看您是否可以将其应用于索引以获取您的日期计算。

仅供参考,看起来“如何”方法正在被贬低,并打印警告以使用 .apply()

import pandas as pd
import numpy as np

idx = pd.date_range("2018-01-01","2018-12-31")
columns = ['open','close']
data = np.random.normal(365,2)
df = pd.DataFrame(np.random.random((len(idx),len(columns))), columns = columns,index=idx)
df['high'] = df['open']*(1+np.random.uniform(.05, .20)) #bull market...
func = 
    'open': df['open'].resample('1w').first(),
    'close': df['close'].resample('1w').last(),
    'high': df['high'].resample('1w').max()


df_w = pd.DataFrame(func)
df_w['oc_diff'] = df_w['open'] - df_w['close'].shift()
df_w.head(10)

                open     close      high   oc_diff
2018-01-07  0.268054  0.352703  1.186531       NaN
2018-01-14  0.340011  0.907513  1.127548 -0.012693
2018-01-21  0.764949  0.907459  0.915084 -0.142564
2018-01-28  0.346734  0.703151  1.027472 -0.560725
2018-02-04  0.231348  0.960882  0.911420 -0.471803

【讨论】:

以上是关于使用 Pandas 重新采样然后填充原始数据框的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 将时间序列数据重新采样为 15 分钟和 45 分钟 - 使用多索引或列

重新采样熊猫数据框并用零填充新行

使用“bin size”/“frequency”重新采样 Pandas Dataframe

Pandas 从重采样中检索添加行的索引

当所有值都是 NaN 时,Pandas 重新采样以返回 NaN

合并两个 Pandas 数据帧,在一个时间列上重新采样,插值