如何计算熊猫数据框中条件元素之间的变化

时间:2015-07-06 15:52:12

标签: python python-2.7 pandas dataframe

我在数据框中每五分钟就有30个证券的开盘价,最高价,最低价,收盘价的数据框。这是一个示例:

                     Close   High    Low   Open Symbol
2015-03-18 14:05:00  75.99  75.99  75.73  75.76     DD
2015-03-18 14:05:00  82.82  82.85  82.55  82.55    WMT
2015-03-18 14:05:00  25.72  25.72  25.62  25.64     GE
2015-03-18 14:05:00  61.94  61.95  61.62  61.62    JPM
2015-03-18 14:10:00  26.72  26.72  26.62  26.64     GE
2015-03-18 14:10:00  62.94  62.95  62.62  62.62    JPM
2015-03-18 14:10:00  83.82  83.85  83.55  83.55    WMT
2015-03-18 14:10:00  73.99  73.99  73.73  73.76     DD

我想在每个时间戳中为每个符号取Open值,然后从该符号的前一个时间戳的Close中减去它们,以便测量间隙。例如,我会将DD的14:10带时间戳的Open值从DD的14:05带时间戳的Close值中减去。

我找到了统一的数据解决方案,即如果这个数据帧只用于一个符号,但是假设我在这个数据帧中有30个符号,那么计算这个'Gap'值的最佳方法是什么?

谢谢,

CJ

1 个答案:

答案 0 :(得分:0)

你可以groupby开启'符号'然后调用apply传递lambda并使用shift

In [147]:
df.groupby('Symbol').apply(lambda x: x['Open'] - x['Close'].shift())

Out[147]:
index   2015-03-18 14:05:00  2015-03-18 14:10:00
Symbol                                          
DD                      NaN                -2.23
GE                      NaN                 0.92
JPM                     NaN                 0.68
WMT                     NaN                 0.73

修改

要将此列添加为新列,您可以按上述方式进行分组,并在感兴趣的2列上调用transform并索引'关闭'柱。 tranform返回与原始df对齐的系列:

In [19]:
df['New_col'] = df.groupby('Symbol')[['Open','Close']].transform(lambda x: x['Open'] - x['Close'].shift())['Close']
df

Out[19]:
                     Close   High    Low   Open Symbol  New_col
index                                                          
2015-03-18 14:05:00  75.99  75.99  75.73  75.76     DD    -2.23
2015-03-18 14:05:00  82.82  82.85  82.55  82.55    WMT     0.73
2015-03-18 14:05:00  25.72  25.72  25.62  25.64     GE     0.92
2015-03-18 14:05:00  61.94  61.95  61.62  61.62    JPM     0.68
2015-03-18 14:10:00  26.72  26.72  26.62  26.64     GE     0.92
2015-03-18 14:10:00  62.94  62.95  62.62  62.62    JPM     0.68
2015-03-18 14:10:00  83.82  83.85  83.55  83.55    WMT     0.73
2015-03-18 14:10:00  73.99  73.99  73.73  73.76     DD    -2.23