def _standardize_index(
self, df_in: pd.DataFrame, symbol: str=None, datatype: str=None,
barsize: str=None, tz: str=None):
"""Normalize input DataFrame index to MarketDataBlock standard.
"""
# Add or starndardize index names in the input.
if isinstance(df_in.index, pd.MultiIndex):
df_in.reset_index(inplace=True)
# Rename ambiguous column names.
df_in.columns = [
col_rename.get(col.strip().lower(), col.strip().lower())
for col in df_in.columns]
# Insert Symbol, DataType, Barsize columns from arguments if not
# found in the input dataframe.
for col in MarketDataBlock.data_index:
if col not in df_in.columns:
if locals().get(col.lower(), None) is None:
raise KeyError(
'No {0} argument and no {0} column in the DataFrame.'
.format(col))
df_in.insert(0, col, locals()[col.lower()])
# Convert datetime strings to pandas DatetimeIndex
df_in['TickerTime'] = pd.DatetimeIndex(
df_in['TickerTime'].apply(pd.Timestamp))
# Standardize BarSize strings
df_in['BarSize'] = df_in['BarSize'].map(timedur_standardize)
# Set index to class-defined MultiIndex
df_in.set_index(MarketDataBlock.data_index, inplace=True)
# Set time zone so all DatetimeIndex are tz-aware
df_in_tz = df_in.index.levels[self.__class__.dtlevel].tz
if df_in_tz is None or isinstance(df_in_tz, timezone) or \
isinstance(df_in_tz, pytz._FixedOffset):
# Input df has naive time index, or tzinfo is not pytz.timezone()
if tz is None:
raise ValueError(
'Argument tz=None, and TickerTime.tzinfo is None(naive),'
'datetime.timezone, or pytz._FixedOffset.')
if df_in_tz is None:
df_in = df_in.tz_localize(tz, level=self.__class__.dtlevel)
else:
df_in = df_in.tz_convert(tz, level=self.__class__.dtlevel)
return df_in
评论列表
文章目录