Процент от общего числа клеток, которые имеют положительные значения - PullRequest
0 голосов
/ 16 октября 2019

Я рассчитываю, сколько процентов лет компания имела положительный доход. В моем фрейме данных тысячи компаний, и поэтому я пытаюсь выяснить, как изолировать каждую компанию для выполнения этого расчета.

Sample Data

Использование данных выборкиодной вышеупомянутой компании, и если предположить, что RSG.AX был основан в 2007 году, я хочу, чтобы в появившемся столбце было указано:

             percentPositiveEarnings
(NaN/12) =   NaN
(5/11)   =   0.45
(4/10)   =   0.4
(3/9)    =   0.33
(3/8)    =   0.375
(3/7)    =   0.429
(3/6)    =   0.5
(2/5)    =   0.4
(1/4)    =   0.25
(1/3)    =   0.33
(1/2)    =   0.5
(1/1)    =   1

Каждая ячейка в этом столбце должна подсчитывать количество лет, в течение которых компания имела положительный доход, деленный наобщее количество лет с момента его основания.

Я не уверен, должен ли я использовать .groupby() для разделения данных каждой компании, поскольку я никогда не использовал их ранее. Любая помощь приветствуется!

1 Ответ

1 голос
/ 16 октября 2019
# Sample data.
df = pd.DataFrame({
    'RIC': ['RSG.AX'] * 12 + ['IBM'] * 2, 
    'Date': list(range(2007, 2019)) + list(range(2000, 2002)), 
    'FCF': [4.66, -2.36, -9.3, -5.7, 7.7, 1.2, -2.6, -2.4, -4.3, 1.1, 4.22, np.nan, 1, -2]
})

Обратите внимание, что я решил игнорировать NaN ценность, а не получить результат NaN.

df = df.sort_values(['RIC', 'Date']).reset_index(drop=True)
pct_profitable = df.groupby('RIC')['FCF'].transform(
    lambda s: s.gt(0).cumsum() / s.notnull().cumsum())
>>> df.assign(pct_profitable=pct_profitable)
       RIC  Date   FCF  pct_profitable
0      IBM  2000  1.00        1.000000
1      IBM  2001 -2.00        0.500000
2   RSG.AX  2007  4.66        1.000000
3   RSG.AX  2008 -2.36        0.500000
4   RSG.AX  2009 -9.30        0.333333
5   RSG.AX  2010 -5.70        0.250000
6   RSG.AX  2011  7.70        0.400000
7   RSG.AX  2012  1.20        0.500000
8   RSG.AX  2013 -2.60        0.428571
9   RSG.AX  2014 -2.40        0.375000
10  RSG.AX  2015 -4.30        0.333333
11  RSG.AX  2016  1.10        0.400000
12  RSG.AX  2017  4.22        0.454545
13  RSG.AX  2018   NaN        0.454545
...