Как объединить серию на основе индекса даты, чтобы сформировать df без потери данных

1

Я пытаюсь объединить кучу исторических данных о ценах в единый фрейм данных, но я, кажется, случайно удаляю части данных.

Вот что я пытаюсь сделать:

"v" - значение, тип float

Серия 1:

       Ticker1
Date1     v1
Date2     v2
Date3     v3
Date4     v4
.
.
.
.
Date100   v5

Серия 2:

       Ticker2
Date101   v6
Date102   v7
Date103   v8
Date104   v9
.
.
.
.
Date200   v10

Конечный желаемый df

       Ticker1        Ticker2
Date1   v1               np.nan
Date2   v2               np.nan
Date3   v3               np.nan
Date4   v4
.
.
Date100 v5
Date101 np.nan          v6
Date102 np.nan          v7
Date103 np.nan          v8
Date104 np.nan          v9
.
.
.
.
Date200 np.nan         v10

Вот как я это делаю:

data_dict = {}

for ticker in tickers:
    try:
        data_dict[ticker] = data.DataReader(ticker,'iex',start_date, end_date)
        data_dict[ticker] = data_dict[ticker].reset_index()
        data_dict[ticker]['date'] = pd.to_datetime(data_dict[ticker]['date'], format="%Y-%m-%d")
        data_dict[ticker]['date'] = data_dict[ticker]['date'].dt.date
        data_dict[ticker].index = data_dict[ticker]['date']
        data_dict[ticker] = data_dict[ticker].drop('date', axis=1)
    except:
        pass

pricing_df = pd.DataFrame()
volume_df = pd.DataFrame()

for ticker in data_dict.keys():

    temp_series = pd.Series(data = data_dict[ticker]['close'].values,
                        index = data_dict[ticker].index,
                        name = ticker
                        )

    pricing_df[ticker] = temp_series

    temp_series = pd.Series(data = data_dict[ticker]['volume'].values,
                        index = data_dict[ticker].index,
                        name = ticker
                        )

    volume_df[ticker] = temp_series

То, что я получаю взамен, - это то, что я хочу, но с произвольным количеством дат, отрезанных в начале набора данных. В частности, у меня есть серия с датами, относящимися к 2014 году, но когда я привожу в окончательный набор данных, но df начинается в середине 2015 года....

Заранее благодарим за помощь!

Теги:
pandas
performance

2 ответа

1

Способ 1: Присоединение:

Я бы использовал join в вашем случае, которое легко позволило бы заданной дате иметь значения как в Ticker1 и в Ticker2, хотя вам все равно придется сначала преобразовать их в числовые кадры (как в ответе @dportman):

pd.DataFrame(series1).join(pd.DataFrame(series2), how='outer')

        Ticker1 Ticker2
Date1        v1     NaN
Date100      v5     NaN
Date101     NaN      v6
Date102     NaN      v7
Date103     NaN      v8
Date104     NaN      v9
Date2        v2     NaN
Date200     NaN     v10
Date3        v3     NaN
Date4        v4     NaN

Примечание: вы можете сделать то же самое с merge, но вам нужно будет добавить left_index=True, right_index=True:

pd.DataFrame(series1).merge(pd.DataFrame(series2), 
                            left_index=True, right_index=True, how='outer')

Способ 2: Конкатенирование:

Вы также можете использовать pd.concat в своей серии 2, чтобы получить те же результаты:

pd.concat([series1, series2], axis=1)

        Ticker1 Ticker2
Date1        v1     NaN
Date100      v5     NaN
Date101     NaN      v6
Date102     NaN      v7
Date103     NaN      v8
Date104     NaN      v9
Date2        v2     NaN
Date200     NaN     v10
Date3        v3     NaN
Date4        v4     NaN

Сортировка по индексу datetime:

Предполагая, что ваши даты являются фактическими датами или по крайней мере строками даты, вы можете сортировать по индексу. Например, если это выглядит так:

>>> df
           Ticker1 Ticker2
2018-06-25      v1     NaN
2018-06-28      v5     NaN
2018-06-26     NaN      v6
2018-07-01     NaN      v7
2018-06-24     NaN      v8
2018-06-23     NaN      v9
2018-06-29      v2     NaN
2018-06-30     NaN     v10
2018-06-22      v3     NaN
2018-06-27      v4     NaN

используйте df.sort_index():

           Ticker1 Ticker2
2018-06-22      v3     NaN
2018-06-23     NaN      v9
2018-06-24     NaN      v8
2018-06-25      v1     NaN
2018-06-26     NaN      v6
2018-06-27      v4     NaN
2018-06-28      v5     NaN
2018-06-29      v2     NaN
2018-06-30     NaN     v10
2018-07-01     NaN      v7
0

Вы можете преобразовать две серии в dataframes, а затем использовать метод pandas df.append() для добавления двух фреймов данных:

df1 = pd.DataFrame(series1)
df2 = pd.DataFrame(series2)
result = df1.append(df2)
  • 0
    Спасибо, вы знаете, что это может происходить?
  • 0
    На самом деле я попробовал это, и я все еще сбрасываю данные
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню