计算一系列中每个点之间的差异

时间:2014-03-25 05:43:37

标签: python pandas

我对Python / Pandas比较陌生,并且想知道进行以下操作的最佳/最有效方法:

我有一组数据,随着时间的推移价格在不同的位置。数据最初是每日,但我使用groupby功能汇总平均每月价格,并获得以下内容(简化示例):

anomes Market  price         
9508   mkt1    0.298387
       mkt2    0.000000
9509   mkt1    0.254338
       mkt2    0.289787
       mkt3    0.071116

其中'anomes'是月度时间码(yy / mm)

我的问题是,对于每个时间段,计算每个“市场”对价格差异的最佳方法是什么?

我想到的一个想法是“取消堆叠”,这样每行代表一个时间段,然后以这种方式迭代。在上面的df上调用unstack可以得到:

          price                    
Market    mkt1    mkt2      mkt3
anomes                              
9508         NaN  0.298387  0.000000
9509    0.254338  0.289787  0.071116
9510    0.255367  0.319558  0.199919
9511    0.341980  0.296720  0.236127
9512    0.420860  0.352125  0.198956

我最终希望得到的是:

           price
Market    mkt1    mkt2      mkt3       mkt1-mkt2     mkt1-mkt3   ...   mkt2-mkt3 ...                                 
9508         NaN  0.298387  0.000000   ...           ...         ...   ...
9509    0.254338  0.289787  0.071116   ...           ...         ...   ...
9510    0.255367  0.319558  0.199919   ...           ...         ...   ...
9511    0.341980  0.296720  0.236127   ...           ...         ...   ...
9512    0.420860  0.352125  0.198956   ...           ...         ...   ...

我最终需要再次重塑为“长”格式。

我对如何在Python / Pandas中实现这一目标感到有些茫然。有没有人对最佳/最有效的方式有任何好的想法?

1 个答案:

答案 0 :(得分:0)

你可以用concat(和itertools排列)来做到这一点:

In [11]: def column_difference(df, colname1, colname2):
             s = df[colname1] - df[colname2]
             s.name = '%s - %s' % (colname1, colname2)
             return s

In [12]: from itertools import permutations

In [13]: pd.concat((column_difference(df, col1, col2) 
                        for col1, col2 in permutations(df.columns, 2)
                        if col1 < col2),  # assuming the column names are orderable (and unique)
                   axis=1)
Out[13]: 
        mkt1 - mkt2  mkt1 - mkt3  mkt2 - mkt3
Market                                       
9508            NaN          NaN     0.298387
9509      -0.035449     0.183222     0.218671
9510      -0.064191     0.055448     0.119639
9511       0.045260     0.105853     0.060593
9512       0.068735     0.221904     0.153169

你可以将这个结果连接到原始框架......