У меня есть мультииндекс, основанный на датах и времени (сгруппированные по разным). Данные выглядят следующим образом:
r2 var_v2x _s
date time
2017-10-02 08:05:00 0.00000031 0.00008784 0.00353914
2017-10-03 08:05:00 0.00000008 0.00009055 0.00085233
2017-10-04 08:05:00 0.00000000 0.00018774 0.00000000
2017-10-05 08:05:00 0.00000031 0.00007609 0.00409934
и в течение другого периода времени:
r2 var_v2x _s
date time
2017-10-02 08:30:00 0.00000000 0.00008784 0.00000000
2017-10-03 08:30:00 0.00000008 0.00009055 0.00085375
2017-10-04 08:30:00 0.00000008 0.00018774 0.00041180
2017-10-05 08:30:00 0.00000000 0.00007609 0.00000000
2017-10-10 08:30:00 0.00000008 0.00006900 0.00112288
Теперь я хочу применить скользящее среднее к столбцу _s
с саморасширяющимся катящимся окном. Это означает, что для первого наблюдения внутри группы катящееся окно равно 1 (так что только значение, второе наблюдение включает в себя 1-е и 2-ое значение столбца _s
и т.д.
В конце концов, я хочу, чтобы ungrouped dataframe
:
r2 var_v2x _s s_rolling
date time
2017-10-02 08:05:00 0.00000031 0.00008784 0.00353914 0.00353914
2017-10-02 08:10:00 0.00000024 0.00008784 0.00249531 rolling(2)
2017-10-02 08:15:00 0.00000024 0.00008784 0.00249531 rolling(3)
2017-10-02 08:20:00 0.00000024 0.00008784 0.00249531 rolling(4)
Пока у меня это:
'file_name = r'E:\Model\ModelSpecific\Index_shat.txt'
df = pd.read_csv(file_name, parse_dates=[0], index_col=None, sep=',')
list_date = sorted(set(df['Date']))
list_time = sorted(set(df['Time']))
iterables = [list_date, list_time]
indexed = pd.MultiIndex.from_product(iterables, names=['date', 'time'])
df = df.set_index(indexed)
df = df.dropna()
df['_s'] = df['r2']/df['var_v2x']
for date, new_df in enumerate(df.groupby(level=1)):
new_df = pd.DataFrame(new_df)
new_df['rolling_s'] = new_df.expanding().mean()
print(new_df)
Но возвращает: ValueError: неправильное количество элементов, переданных 3, размещение подразумевает 1.
Я также попытался enumerate(df.groupby(level=1)):
Но возвращает: AttributeError: объект 'tuple' не имеет атрибута 'roll'
df_needed = df['_s']
df_needed.rename(columns = {'_s':'s_hat'}, inplace=True)
lista = []
for date, new_df in df_needed.groupby(level=1):
new_df = pd.DataFrame(new_df)
rolling = new_df[0].expanding().mean()
lista.append(rolling)
df_init = pd.concat(lista,axis=0)
df_joined = df.join(df_init)
df_joined.columns = ['r2', 'var_v2x', 'r2_var_2x', 's_hat']
df_joined.to_csv(outfile)
Окончательный код и хорошо работает! Спасибо!
.expanding().mean()
. но не уверен точно, что это за код, так как ваш ввод недостаточно полон для создания вывода..expanding().mean()
но возвращает: AttributeError: у объекта 'tuple' нет атрибута 'roll'. Затем я попытался преобразовать кортеж вDataFrame
но это возвращает: TypeError: конструктор DataFrame, вызываемый с несовместимыми данными, и dtype: установка элемента массива с последовательностью