Создание случайных отсортированных дат из диапазона дат в Пандах - PullRequest
0 голосов
/ 01 декабря 2018

Текущий фрейм данных:

    Account_ID  Transaction_Type    Transaction_Date
0   10001        B                      
1   10001        B                      
2   10001        B                      
3   10001        B                      
4   10002        D                      
5   10002        D                      
6   10002        D                      
7   10003        F                      
8   10003        F                      
9   10004        H      

Я пытаюсь создать случайную «дату транзакции» в диапазоне от «2018-06-30» до «2018-11-30», которая сортируется по группе«Идентификатор учетной записи».Для каждой группы «Идентификатор учетной записи» случайная дата должна учитывать указанный диапазон.

Ожидаемый результат:

    Account_ID  Transaction_Type    Transaction_Date
0   10001        B                  2018-06-30  
1   10001        B                  2018-07-15  
2   10001        B                  2018-07-22  
3   10001        B                  2018-09-14  
4   10002        D                  2018-07-02  
5   10002        D                  2018-07-29  
6   10002        D                  2018-10-20  
7   10003        F                  2018-07-07  
8   10003        F                  2018-11-11  
9   10004        H                  2018-06-30  

Я пытаюсь использовать следующую логику.

Группировать поaccountid, получить счетчик каждой группы, сгенерировать случайный список дат в указанном диапазоне с выборкой счетчиков для каждой группы и назначить элементы списка для серии «Transaction_Date» с помощью loc.Любой лучший способ, пожалуйста, предложите.Спасибо!

1 Ответ

0 голосов
/ 01 декабря 2018

Я бы определил пользовательскую функцию и применил бы ее с groupby().transform.Функция выполняет следующие действия:

1: получает количество дней между начальным и конечным днями

2: получает n случайные целые числа ( n - размер каждой группы, и целые числа представляют количество дней после дня начала), и сортирует их

3: добавляет эти случайные целые числа как временную дельту дней к дате начала.

start_date = pd.to_datetime('2018-06-30')
end_date = pd.to_datetime('2018-11-30')

def gen_rand_date(group, start_date = start_date, end_date = end_date):
    # step 1 in description above:
    days = (end_date - start_date).days
    # step 2:
    d = pd.np.sort(pd.np.random.choice(range(days), len(group)))
    # step 3:
    return start_date + pd.to_timedelta(d,unit='D')

df['Transaction_Date'] = df.groupby('Account_ID').transform(lambda x: gen_rand_date(x))

>>> df
   Account_ID Transaction_Type Transaction_Date
0       10001                B       2018-07-19
1       10001                B       2018-08-12
2       10001                B       2018-08-27
3       10001                B       2018-09-29
4       10002                D       2018-10-23
5       10002                D       2018-11-09
6       10002                D       2018-11-14
7       10003                F       2018-08-03
8       10003                F       2018-09-10
9       10004                H       2018-09-16
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...