熊猫qcut基于所有列的扩展窗口

时间:2018-10-01 23:10:05

标签: python python-3.x pandas dataframe

假设我有一个数据框:

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.normal(0,1,[100,50]))

如下所示:

         0         1         2         3         4         5         6   \
0 -0.141305  2.158252  1.006520 -1.004185 -0.213160  0.648904 -0.089369   
1 -1.373167 -1.100959  1.007023  0.699591 -1.667834  1.422182  0.940912   
2 -0.212014  1.967436  0.401133 -0.996298 -1.696490 -0.857453 -0.686584   
3 -0.351902  0.413816 -0.494869  0.448740  0.146897 -0.798095 -0.546489   
4  0.416376 -0.689577 -0.967050 -1.667480  1.223966 -1.382113 -0.812368   

         7         8         9     ...           40        41        42  \
0  0.282299  0.627085  1.111637    ...     1.354044  0.335316 -1.817465   
1 -0.540302 -1.276811 -0.077210    ...     0.556072  0.642445  0.313477   
2  0.601571 -0.989826  0.942893    ...     0.803984  0.286897 -0.507413   
3 -0.277153 -1.068749  1.720561    ...     0.317774  0.744266 -1.671273   
4  0.391501  0.703358  0.972910    ...    -0.251225 -0.918734  0.226089   

         43        44        45        46        47        48        49  
0 -2.088606 -1.297459 -1.135577 -0.579162 -0.538286  1.223049 -0.577341  
1  2.307270  0.381122  0.970177  0.011552 -0.704012 -1.759955  0.649379  
2  0.139226  1.287651  0.335977  0.832819 -0.701925  1.656187  0.218177  
3  0.621638 -2.893360 -1.349287  2.160106  0.977205 -0.550635 -0.473224  
4 -0.646419  2.197215 -0.483294 -1.141479  0.706850  2.686787  0.054517 

以下代码可以满足我的需要,但是效率非常低:

lbound_ = float(pd.DataFrame(np.ravel(df.iloc[0:10,:].values)).quantile(0.))
ubound_ = float(pd.DataFrame(np.ravel(df.iloc[0:10,:].values)).quantile(0.1))
df[(df>=lbound_) & (df<ubound_)]

我想根据在每个时间点之前观察到的任何数据以扩展的方式对每个时间点的数据进行十分位/分位数的存储。

上面的操作仅对第一个存储桶0:10的{​​{1}}执行。

一个非常慢的实现看起来像:

[0,.1)

我将如何概括并有效地做到这一点?

在这里有些困惑,不胜感激。

谢谢

1 个答案:

答案 0 :(得分:0)

对于任何偶然发现此问题的人,以下是我的看法。可能会有更快的解决方案,因此,如果您有更好的主意,请发表。

谢谢

def standardize_block(df_standardize_arg):
    df_standardize_arg = df_standardize_arg.copy()
    ix_ = df_standardize_arg.index
    prior_data = np.array([])
    output = []
    for i in range(0, len(ix_)):
        data = np.array(df_standardize_arg.loc[ix_[i]].values.ravel())
        data = data[~np.isnan(data)]
        prior_data = np.concatenate((prior_data, data), axis=0)

        #this date piece may be specific to my use case.

        output.append({'date': ix_[i], 
                      'mean': prior_data.mean(), 
                      'std': prior_data.std()}) 

    df_output = pd.DataFrame(output)
    del df_standardize_arg #my data is quite large, so I delete it here.
    df_output.index = df_output['date']
    del df_output['date']
    return df_output.copy()