在数据帧上的groupby中平铺

时间:2017-06-03 14:19:32

标签: python dataframe tiling pandas-groupby

我有一个数据框,其中包含几个日期的返回值,大小和sedols。

我的目标是确定每个日期特定条件的顶部和底部值,即我希望每个日期的顶部十分位数最大尺寸条目和底部十分位数最小尺寸条目,并通过“xx”将它们标记在新列中和'yy'。

我很困惑如何在分组时应用平铺以及创建新列,这是我已经拥有的。

import pandas as pd
import numpy as np
import datetime as dt

from random import choice
from string import ascii_uppercase

def create_dummy_data(start_date, days, entries_pday):
    date_sequence_lst = [dt.datetime.strptime(start_date,'%Y-%m-%d') + 
dt.timedelta(days=x) for x in range(0,days)]
    date_sequence_lst = date_sequence_lst * entries_pday                
    returns_lst = [round(np.random.uniform(low=-0.10,high=0.20),2) for _ in range(entries_pday*days)]

    size_lst = [round(np.random.uniform(low=10.00,high=10000.00),0) for _ in range(entries_pday*days)]

    rdm_sedol_lst = [(''.join(choice(ascii_uppercase) for i in range(7))) for x in range(entries_pday)] 
    rdm_sedol_lst = rdm_sedol_lst * days

    dates_returns_df = pd.DataFrame({'Date':date_sequence_lst , 'Sedols':rdm_sedol_lst, 'Returns':returns_lst,'Size':size_lst})
    dates_returns_df = dates_returns_df.sort_values('Date',ascending=True)
    dates_returns_df = dates_returns_df.reset_index(drop=True)
    return dates_returns_df


def order_df_by(df_in,column_name):
    df_out = df_in.sort_values(['Date',column_name],ascending=[True,False])
    return df_out


def get_ntile(df_in,ntile):
    df_in['Tiled'] = df_in.groupby(['Date'])['Size'].transform(lambda x : pd.qcut(x,ntile))
    return df_in

if __name__ == "__main__":
    # create dummy returns
    data_df = create_dummy_data('2001-01-01',31,10)
    # sort by attribute
    data_sorted_df = order_df_by(data_df,'Size')
    #ntile data per date
    data_ntiled = get_ntile(data_sorted_df, 10)

    for key, item in data_ntiled:
        print(data_ntiled.get_group(key))

到目前为止,我希望基于每个日期的“大小”来判断结果,下一步是仅过滤十分位数1和十分位数10,并分别标记条目'xx'和'yy'。

感谢

1 个答案:

答案 0 :(得分:1)

考虑在pandas.qcut方法上使用transform,对于十分位列使用标签1到ntile + 1,然后使用{有条件地设置 flag {1}}使用十分位值:

np.where