Добавьте недостающие строки дня в данные фондового рынка для поддержания непрерывности в фрейме данных pandas

#python #pandas #dataframe #numpy #etl

#python #pandas #фрейм данных #numpy #etl

Вопрос:

Итак, у меня есть данные о фондовом рынке за 13 лет с ежедневным открытием и закрытием. Проблема в том, что рынки иногда закрываются между ними, и, следовательно, с понедельника по пятницу иногда могут не отображаться непрерывно. Посмотрите ниже

Дата День Открыть Высокий Низкий Закрыть Скорректированное закрытие
0 17-09-2007 Понедельник 6898 6977.2 6843 6897.1 6897.100098
1 18-09-2007 Вторник 6921.15 7078.95 6883.6 7059.65 7059.649902
2 19-09-2007 Среда 7111 7419.35 7111 7401.85 7401.850098
3 20-09-2007 Четверг 7404.95 7462.9 7343.6 7390.15 7390.149902
4 21-09-2007 Пятница 7378.3 7506.35 7367.15 7464.5 7464.5
5 25-09-2007 Вторник 7658.5 7694.25 7490.2 7629.15 7629.149902
7 26-09-2007 Среда 7647.1 7829.85 7591.8 7755.9 7755.899902
8 28-09-2007 Пятница 7838.25 8082.85 7836.05 8042.2 8042.200195
9 01-10-2007 Понедельник 8008.55 8085.15 7913.3 7987.5 7987.5
10 03-10-2007 Среда 8029.8 8235.8 7820.25 8097.9 8097.899902
11 04-10-2007 Четверг 8083.3 8086.7 7828.65 8035.9 8035.899902
12 05-10-2007 Пятница 8038.1 8066.55 7789.7 7845.25 7845.25
13 08-10-2007 Понедельник 7853.15 7935.45 7516.45 7626.4 7626.399902
14 09-10-2007 Вторник 7580.9 7916.45 7535.05 7895.85 7895.850098
15 10-10-2007 Среда 7960.65 8081.05 7907.35 8030.65 8030.649902
16 11-10-2007 Четверг 8054.3 8177.75 8005.5 8158.8 8158.799805
17 15-10-2007 Понедельник 7962.55 8306.35 7962.55 8286.3 8286.299805
18 16-10-2007 Вторник 8361.4 8491.65 8240.3 8452.2 8452.200195
19 17-10-2007 Среда 8071.55 8218.1 7641.5 8099.9 8099.899902
20 18-10-2007 Четверг 8055.15 8192.45 7519.7 7608.75 7608.75
21 19-10-2007 Пятница 7637.4 7718.9 7279.3 7423.8 7423.799805

Я хочу иметь единообразные данные с одинаковым шаблоном с понедельника по пятницу. Следовательно, везде, где отсутствует промежуточный день, я хочу заменить его значение значениями предыдущего дня. Например, между номерами 4 и 5 я бы добавил понедельник 24-09-2007, а затем все остальные значения, скопированные из номера 4 (пятница). Иногда может случиться так, что последовательно не хватает 2 дней, и в этом случае снова необходимо скопировать последнее значение. например, если отсутствовали понедельник и вторник, я бы добавил понедельник, скопировал данные пятницы, затем добавил вторник и скопировал данные понедельника. Как мне это сделать, используя python pandas? Помните, что данные хранятся 13 лет, поэтому будут високосные годы, смена года и т. Д.

Комментарии:

1. можете ли вы добавить входные данные в виде фрейма данных, чтобы воспроизвести проблему?

2. Пожалуйста, используйте не изображения, а образцы вашего фрейма данных. Кроме того, пожалуйста, опубликуйте ожидаемый результат. Приложите усилия, прежде чем просить других сделать то же самое за вас …

Ответ №1:

процесс:

  1. установите индекс даты
  2. повторная выборка фрейма данных с помощью ‘D’
  3. отбросьте день Сб и Вс
  4. fillna с помощью ‘ffill’
 # Data Index should be timeSeries
df['Date'] = pd.to_datetime(df['Date'], format='%d-%m-%Y')

# upsample
dfn = df.set_index('Date').resample('D').asfreq()

# covert Date to Monday .. Sunday
dfn['Day'] = dfn.index.strftime('%A')

# drop Day in ['Saturday', 'Sunday']
cond = dfn['Day'].isin(['Saturday', 'Sunday'])
dfn = dfn[~cond].fillna(method='ffill').reset_index()
 

вывод:

         Date        Day     Open     High      Low    Close  Adjusted Close
0  2007-09-17     Monday  6898.00  6977.20  6843.00  6897.10     6897.100098
1  2007-09-18    Tuesday  6921.15  7078.95  6883.60  7059.65     7059.649902
2  2007-09-19  Wednesday  7111.00  7419.35  7111.00  7401.85     7401.850098
3  2007-09-20   Thursday  7404.95  7462.90  7343.60  7390.15     7390.149902
4  2007-09-21     Friday  7378.30  7506.35  7367.15  7464.50     7464.500000
5  2007-09-24     Monday  7378.30  7506.35  7367.15  7464.50     7464.500000
6  2007-09-25    Tuesday  7658.50  7694.25  7490.20  7629.15     7629.149902
7  2007-09-26  Wednesday  7647.10  7829.85  7591.80  7755.90     7755.899902
8  2007-09-27   Thursday  7647.10  7829.85  7591.80  7755.90     7755.899902
9  2007-09-28     Friday  7838.25  8082.85  7836.05  8042.20     8042.200195
10 2007-10-01     Monday  8008.55  8085.15  7913.30  7987.50     7987.500000
11 2007-10-02    Tuesday  8008.55  8085.15  7913.30  7987.50     7987.500000
12 2007-10-03  Wednesday  8029.80  8235.80  7820.25  8097.90     8097.899902
13 2007-10-04   Thursday  8083.30  8086.70  7828.65  8035.90     8035.899902
14 2007-10-05     Friday  8038.10  8066.55  7789.70  7845.25     7845.250000
15 2007-10-08     Monday  7853.15  7935.45  7516.45  7626.40     7626.399902
16 2007-10-09    Tuesday  7580.90  7916.45  7535.05  7895.85     7895.850098
17 2007-10-10  Wednesday  7960.65  8081.05  7907.35  8030.65     8030.649902
18 2007-10-11   Thursday  8054.30  8177.75  8005.50  8158.80     8158.799805
19 2007-10-12     Friday  8054.30  8177.75  8005.50  8158.80     8158.799805
20 2007-10-15     Monday  7962.55  8306.35  7962.55  8286.30     8286.299805
21 2007-10-16    Tuesday  8361.40  8491.65  8240.30  8452.20     8452.200195
22 2007-10-17  Wednesday  8071.55  8218.10  7641.50  8099.90     8099.899902
23 2007-10-18   Thursday  8055.15  8192.45  7519.70  7608.75     7608.750000
24 2007-10-19     Friday  7637.40  7718.90  7279.30  7423.80     7423.799805