Я пытаюсь объединить кучу исторических данных о ценах в единый фрейм данных, но я, кажется, случайно удаляю части данных.
Вот что я пытаюсь сделать:
"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 года....
Заранее благодарим за помощь!
Я бы использовал 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')
Вы также можете использовать 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
Предполагая, что ваши даты являются фактическими датами или по крайней мере строками даты, вы можете сортировать по индексу. Например, если это выглядит так:
>>> 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
Вы можете преобразовать две серии в dataframes, а затем использовать метод pandas df.append()
для добавления двух фреймов данных:
df1 = pd.DataFrame(series1)
df2 = pd.DataFrame(series2)
result = df1.append(df2)