Инкрементально умножать ряды панд на скаляр до состояния - PullRequest
1 голос
/ 27 сентября 2019

Предположим, у нас есть датафрейм ниже:

import pandas as pd

df_dict = {'term1':[0.87,0.65],'term2':[0.87,0.40],
               'term3':[0.87,0.55],'term4':[0.87,0.70],
              'term5':[0.87,0.85],'term6':[0.87,0.90],
              }

df = pd.DataFrame(df_dict,index = ['Revenue','Cost'])

Это дает нам:

enter image description here

Каков наилучший способ последовательноувеличить затраты, скажем, на 1% для всех terms, пока прибыль term4 не станет отрицательной?Можно ли сохранить результаты при подготовке к построению графика (ось x = прибыль, ось y =% увеличения стоимости)?

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

С небольшой математикой, число, которое вы ищете, это term4 этого:

np.log(df.loc['Revenue']/df.loc['Cost'])/np.log(1.01)

, что:

term1    29.297604
term2    78.090736
term3    46.086401
term4    21.849814
term5     2.337295
term6    -3.407078
dtype: float64

Таким образом, ответ здесь 22.Собираем все вместе:

num = np.ceil(np.log(df.loc['Revenue']/df.loc['Cost'])
                  .div(np.log(1.01))).loc['term4']
num = int(num)

inc_cost = pd.DataFrame(df.loc['Cost'].values * np.cumprod([1.01]*num)[:,None],
             columns=df.columns,
             index=[f'Cost_{i}' for i in range(1,num+1)])

Вывод:

            term1     term2     term3     term4     term5     term6
Cost_1   0.656500  0.404000  0.555500  0.707000  0.858500  0.909000
Cost_2   0.663065  0.408040  0.561055  0.714070  0.867085  0.918090
Cost_3   0.669696  0.412120  0.566666  0.721211  0.875756  0.927271
Cost_4   0.676393  0.416242  0.572332  0.728423  0.884513  0.936544
Cost_5   0.683157  0.420404  0.578056  0.735707  0.893359  0.945909
Cost_6   0.689988  0.424608  0.583836  0.743064  0.902292  0.955368
Cost_7   0.696888  0.428854  0.589674  0.750495  0.911315  0.964922
Cost_8   0.703857  0.433143  0.595571  0.758000  0.920428  0.974571
Cost_9   0.710895  0.437474  0.601527  0.765580  0.929632  0.984317
Cost_10  0.718004  0.441849  0.607542  0.773235  0.938929  0.994160
Cost_11  0.725184  0.446267  0.613618  0.780968  0.948318  1.004102
Cost_12  0.732436  0.450730  0.619754  0.788778  0.957801  1.014143
Cost_13  0.739761  0.455237  0.625951  0.796665  0.967379  1.024284
Cost_14  0.747158  0.459790  0.632211  0.804632  0.977053  1.034527
Cost_15  0.754630  0.464388  0.638533  0.812678  0.986824  1.044872
Cost_16  0.762176  0.469031  0.644918  0.820805  0.996692  1.055321
Cost_17  0.769798  0.473722  0.651367  0.829013  1.006659  1.065874
Cost_18  0.777496  0.478459  0.657881  0.837303  1.016725  1.076533
Cost_19  0.785271  0.483244  0.664460  0.845676  1.026893  1.087298
Cost_20  0.793124  0.488076  0.671105  0.854133  1.037162  1.098171
Cost_21  0.801055  0.492957  0.677816  0.862674  1.047533  1.109153
Cost_22  0.809065  0.497886  0.684594  0.871301  1.058008  1.120244
1 голос
/ 27 сентября 2019

Я собираюсь использовать небольшую алгебру, так как это, вероятно, наиболее эффективно.Вы решаете за 0 = revenue - cost*1.01**x.Который x = log_1.01(R/C).Если исходить из значений term4, то самое низкое целое число для x равно 21, прежде чем прибыль станет отрицательной.


Однако программно вы можете использовать цикл while:

data = df['term4']
n = 0
while data['Revenue'] - data['Cost'] * 1.01**n > 0:
    n += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...