Применение ежемесячного коэффициента потери уровня в часовом временном ряду с использованием Python pandas - PullRequest
0 голосов
/ 18 марта 2020

У меня есть следующий почасовой временной ряд, состоящий из 2 лет в кадре данных (df)

date energy 1/1/1997 0:00 37 1/1/1997 1:00 44 1/1/1997 2:00 55 . . . 12/31/1997 22:00 54 12/31/1997 23:00 55 1/1/1998 0:00 35 1/1/1998 1:00 36 1/1/1998 2:00 37 . . . 12/31/1998 23:00 44

Я хочу применить следующие ежемесячные потери к столбцу Energy:

Monthly Loss 1 3.6158136 2 5.3829265 3 4.4004292 4 4.1649284 5 5.9518338 6 4.5651714 7 6.1399174 8 5.9933625 9 6.4627925 10 6.2534558 11 3.3416914 12 4.5363111

Expected Output
date            energy   new_energy
1/1/1997 0:00     37     35.66   # 37 * (1-3.6158136/100)
1/1/1997 1:00     44     42.41   # 44 * (1-3.6158136/100) 
1/1/1997 2:00     55     53.01   # 55 * (1-3.6158136/100)
.
.
.
12/31/1997 22:00   54     51.55   # 54 * (1-4.5363111/100) 
12/31/1997 23:00   55     52.51   # 55 * (1-4.5363111/100) 
1/1/1998 0:00     35     33.73   # 35 * (1-3.6158136/100)
1/1/1998 1:00     36     34.70   # 36 * (1-3.6158136/100)
1/1/1998 2:00     37     35.66   # 37 * (1-3.6158136/100)
.
.
.
12/31/1997 22:00   54    51.55   # 54 * (1-4.5363111/100)
12/31/1997 23:00   55    52.50   # 55 * (1-4.5363111/100) 

Ниже мой код. Я пытаюсь найти самый простой способ применить ежемесячные убытки к часовым временным рядам

monthly_loss = [3.6158136, 5.3829265, 4.4004292, 4.1649284, 5.9518338, 4.5651714, 6.1399174, 5.9933625, 6.4627925, 6.2534558, 3.3416914, 4.5363111]

month = pd.to_datetime(df['date']).dt.month

df.insert(2, 'Month', month)

# converting the energy from hourly to monthly level
df['monthly_resampled_data'] = df.energy.resample('M').mean()

# apply monthly loss by months to the energy values
df['new_energy']=df['monthly_resampled_data']*(1-monthly_loss/100)

Ошибка получения

TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'RangeIndex'

1 Ответ

1 голос
/ 18 марта 2020

Привести дату к дате, установить его в качестве индекса и извлечь месяц в столбце с именем Ежемесячно

df['date']=pd.to_datetime(df['date'])
df.set_index(df['date'], inplace=True)
df['Monthly']=df.index.month

Объединить два кадра данных в столбце Monthly

df2= pd.merge(df, df1, on='Monthly', how='left')

Применить формулу и удалить ненужные столбцы

    df2['new_energy']=(df2['Energy']*(1-(df2['Loss']/100))).apply(lambda x:round(x,2))
df2.drop(columns=['Monthly','Loss'], inplace=True)

Вывод

enter image description here

...