Расчет фактора роста в python - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть следующий фрейм данных

Date           Country  Sales
01/02/20        France   1000
01/02/20        Germany  1000
02/02/20        France   2000
02/02/20        Germany  3000
03/02/20        France   4500
03/02/20        Germany  5000

Я хочу рассчитать коэффициент роста по стране для каждого дня. Например, коэффициент роста для Германии 02.02.20 = 3000/1000 и 03.02.2020 должен быть 5000/3000. Не ищите процентного изменения.

Ответы [ 3 ]

1 голос
/ 28 апреля 2020
df = pd.DataFrame([
['01/02/20',        'France '  ,1000],
['01/02/20',        'Germany'  ,1000],
['02/02/20',        'France '  ,2000],
['02/02/20',        'Germany'  ,3000],
['03/02/20',        'France '  ,4500],
['03/02/20',        'Germany'  ,5000]
], columns=['Date', 'Country', 'Sales'])
df['Diff'] = df.groupby(['Country']).diff()
df['Growth'] = df.eval('Sales/(Sales - Diff)')
print(df)

Другая альтернатива, как указано выше.

       Date  Country  Sales    Diff    Growth
0  01/02/20  France    1000     NaN       NaN
1  01/02/20  Germany   1000     NaN       NaN
2  02/02/20  France    2000  1000.0  2.000000
3  02/02/20  Germany   3000  2000.0  3.000000
4  03/02/20  France    4500  2500.0  2.250000
5  03/02/20  Germany   5000  2000.0  1.666667
0 голосов
/ 28 апреля 2020

Использование:

df["Growth Factor"] = df.groupby(
    "Country")["Sales"].transform(lambda g: g / g.shift())
print(df)

Печать:

       Date  Country  Sales  Growth Factor
0  01/02/20   France   1000            NaN
1  01/02/20  Germany   1000            NaN
2  02/02/20   France   2000       2.000000
3  02/02/20  Germany   3000       3.000000
4  03/02/20   France   4500       2.250000
5  03/02/20  Germany   5000       1.666667
0 голосов
/ 28 апреля 2020

Начните с сортировки по стране: df = df.sort_values(['Country'])

Затем настройте фильтр, который возвращает значение true, только если индекс совпадает с предыдущим (т. Е. Они имеют ту же страну): filter = df['Country'] == df['Country'].shift(1)

Теперь вычислите дробное изменение в последней точке, где приведенный выше фильтр истинен:

df['Growth'] = df['Sales'].where(filter)/df['Sales'].shift(1)

Окончательно прибегните к индексу:

df = df.sort_index()

Результат:

       Date  Country  Sales     Growth
0  01/02/20   France   1000         NaN
1  01/02/20  Germany   1000         NaN
2  02/02/20   France   2000    2.000000
3  02/02/20  Germany   3000    3.000000
4  03/02/20   France   4500    2.250000
5  03/02/20  Germany   5000    1.666667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...