Вставьте отсутствующие даты в DataFrame и преобразуйте их в массивы - PullRequest
0 голосов
/ 09 июля 2019

У меня есть такой фрейм данных:

Buying_date Event_date  Number_of_tickets_sold

12/11/2018  01/01/2019  2

20/01/2019  24/03/2019  1

13/11/2018  01/01/2019  3

21/12/2018  01/01/2019  2

01/01/2019  10/01/2019  4

20/02/2019  21/02/2019  2

01/03/2019  24/03/2019  3

Билеты выдаются за 90 дней до даты каждого события.Бывают дни, когда никто не покупает билеты, но я хочу включить каждый день с 90-го по 0-й день в столбец Buying_date и установить для соответствующего Number_of_tickets_sold для этих дней значение 0. После этого я хотел бы создать массив Numpy для Number_of_tickets_sold.для каждого события.Таким образом, если существует 10 событий, будет 10 массивов, каждое из которых имеет 90 значений.

Пожалуйста, помогите с проблемой!

Массив для события 01.01.2009:

np.array([0, 0 , 1, 3, 2....])

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Вы можете сделать, например:

def resample(g, date):
    return g.reindex(pd.date_range(end=date, freq='D', periods=90)).fillna(0)

for date, g in (df["Number_of_tickets_sold"].groupby(df['Event_date'])):
    print(resample(g, date))

Это даст вам для каждого события серию продаж билетов в день, проиндексированных по дате. Если вас не интересует индекс, вы можете сделать:

def resample(g, date):
    return (g.reindex(pd.date_range(end=date, freq='D', periods=90))
             .fillna(0)
             .reset_index(drop=True)
           )

pd.DataFrame({date:resample(g, date) for date,g in df["Number_of_tickets_sold"]
              .groupby(df['Event_date'])})

Тогда у вас будет такой фрейм данных:

    2019-01-01  2019-02-21  2019-03-24  2019-10-01
0          0.0         0.0         0.0         0.0
1          0.0         0.0         0.0         0.0
2          0.0         0.0         0.0         0.0
3          0.0         0.0         0.0         0.0
4          0.0         0.0         0.0         0.0
5          0.0         0.0         0.0         0.0

, где в столбцах указаны ежедневные продажи билетов на каждое событие за каждый день.

Если вы хотите использовать тот же формат, что и исходные данные:

def resample(g):
    dates = pd.date_range(end=g['Event_date'][0], freq='D', periods=90)
    return g['Number_of_tickets_sold'].reindex(dates).fillna(0)

(df.set_index('Buying_date')
   .groupby('Event_date')
   .apply(resample)
   .reset_index()
)

даст вам

    Event_date    level_1  Number_of_tickets_sold
0   2019-01-01 2018-10-04                     0.0
1   2019-01-01 2018-10-05                     0.0
2   2019-01-01 2018-10-06                     0.0
3   2019-01-01 2018-10-07                     0.0
4   2019-01-01 2018-10-08                     0.0
5   2019-01-01 2018-10-09                     0.0

, где level_1 столбец - дата продажи.

0 голосов
/ 09 июля 2019

Теперь это может быть немного сложнее:)

Давайте предположим, что ваши данные находятся в кадре данных "df"

Давайте создадим фрейм данных, который будет содержать комбинацию всех дат событий и 90 дней после этой даты

list_data=[pd.concat([pd.Series(pd.to_datetime(k)).repeat(90).reset_index()[0], \
pd.Series(pd.date_range(pd.to_datetime(k)-datetime.timedelta(90),\
                        periods=90,freq='D')).reset_index()[0]],axis=1) for k in df.Event_Date]

my_need=pd.concat(list_data)
my_need.columns=['Event_Date','Buying_Date']

Преобразовать тип данных в формат даты

df['Event_Date']=df['Event_Date'].astype('datetime64')
df['Buying_Date']=df['Buying_Date'].astype('datetime64')

Давайте объединить и затем заполнить NA 0

final=pd.merge(my_need,df,how='left')
final.fillna(0,inplace=True)

Надеюсь, это то, что вы искали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...