#python-3.x #pandas #dataframe #time-series #multiplication
#python-3.x #pandas #фрейм данных #временные ряды #умножение
Вопрос:
У меня есть фрейм данных с несколькими столбцами, однако в этом случае важны только три: дата (datetime), Страна и значение. Фрейм данных содержит данные временных рядов, которые охватывают несколько лет. Для простоты предположим, что все числа в столбце «Значение» имеют начальное значение 2.
df
Date Country Value
2020-01-02 UK 2
2020-01-02 USA 2
2020-01-02 AU 2
2020-01-03 UK 2
2020-01-03 USA 2
2020-01-03 AU 2
...
Чего я хочу добиться, так это умножения на коэффициент, который меняется каждый месяц, от начального значения до конечного значения. Ежемесячное изменение коэффициента рассчитывается как разница между коэффициентом окончания и коэффициентом начала, деленная на количество месяцев.
start_factor = 1.1
end_factor = 1.5
start_date = '2020-02-01'
end_date = '2020-06-01'
Я хочу умножить столбец «Значение» на правильный коэффициент для данного месяца.
Результат, который я хочу:
Date Country Value
2020-01-01 UK 2
2020-01-01 USA 2
...
2020-02-01 UK 2.2
2020-02-01 USA 2.2
...
2020-03-01 UK 2.4
2020-03-01 USA 2.4
...
2020-04-01 UK 2.6
2020-04-01 USA 2.6
...
2020-05-01 UK 2.8
2020-05-01 USA 2.8
...
2020-06-01 UK 3
2020-06-01 USA 3
...
2020-07-01 UK 3
2020-07-01 USA 3
...
2020-08-01 UK 3
2020-08-01 USA 3
Каков наилучший способ достижения этого? Я пытался создать диапазон дат с помощью pd.date_range(start = start_date, end = end_date, freq='M')
, перебирать его и изменять коэффициенты с помощью df.loc, но я не уверен, что это лучший способ сделать это. Также: как бы я это сделал, если бы мне просто нужны были коэффициенты в новом столбце?
Ответ №1:
Я не уверен, я получил вопрос, но вот мое предложение:
import pandas as pd
def create_add_series(start, end, factor):
start_year, start_month = [int(x) for x in start.split('-')]
index = pd.date_range(start, end, freq='MS')
values = [((x.year - start_year) * 12 x.month - start_month) * factor for x in index]
return pd.Series(values, index)
series = create_add_series('2020-01', '2020-06', 1.1)
df.Values = [df.loc[x, 'Values'] series.loc[df.loc[x, 'Date']] for x in df.index]
Комментарии:
1. Это умножает коэффициент на количество месяцев. Я хочу, чтобы коэффициент постепенно увеличивался с
start_factor
доend_factor
в течение нескольких месяцев.