Добавить столбец со случайным числом на основе другого столбца

wazo спросил: 31 июля 2018 в 09:43 в: python

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

Я пробовал простой код, подобный приведенному ниже:

import pandas as pd
import numpy as npdf = pd.DataFrame(np.random.randint(1,99,size=(100000, 1)), columns=["GOD_prob"])df["GOD_prob"] = df["GOD_prob"] / 100
df["GOD_odd"] = 1 / df["GOD_prob"]df["market_prob"] = ((df["GOD_prob"] * 100 ) + np.random.randint(-10,10, len(df))) / 100
df["market_price"] = 1 / df["market_prob"] 

Проблема, с которой я сталкиваюсь, - для значений в df ["GOD_prob"] под 0.10, я могу получить отрицательные значения для df ["market_prob"], и я не хочу этого, поскольку эти столбцы обозначают вероятности.

Впоследствии я хотел бы создать еще один столбец, который отличается от df ["GOD_prob"] 5% в среднем, но я не уверен, как это сделать.

Спасибо за помощь

1 ответ

Есть решение
agastalver ответил: 31 июля 2018 в 10:54

Поскольку ваша проблема связана с отрицательными значениями, я бы предложил обрезать их или переназначить.

Вариант 1:

s = df['GOD_prob']
df['market_prob'] = np.random.normal(s, 0.05*s).clip(0,1)

Вариант 2:

s = df['GOD_prob']
df['market_prob'] = np.random.normal(s, 0.05*s)
cond = (df['market_prob']<0)|(df['market_prob']>1)
while cond.any():
  s = df.loc[cond, 'GOD_prob']
  df.loc[cond, 'market_prob'] = np.random.normal(s, 0.05*s)
  cond = (df['market_prob']<0)|(df['market_prob']>1)

Первая опция может привести к некоторому сдвигу отклонения.

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

wazo ответил: 31 июля 2018 в 12:39
Отличное решение, спасибо!