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

1

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

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

import pandas as pd
import numpy as np

df = 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%, но я не уверен, как это сделать.

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

  • 0
    Я имею в виду получить нормальное распределение по df[col] = np.random.normal(mean, std, size=len(df))
  • 0
    Спасибо! Но это все еще не решает мою проблему с отрицательными числами вероятности.
Показать ещё 1 комментарий
Теги:
pandas
numpy

1 ответ

1
Лучший ответ

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

Опция 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)

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

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

  • 0
    Отличное решение, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню