Я пытаюсь добавить столбец в 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%, но я не уверен, как это сделать.
Спасибо за помощь!
Поскольку ваша проблема связана с отрицательными значениями, я предлагаю обрезать их или переназначить.
Опция 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)
Первый вариант может привести к некоторому сдвигу отклонения.
Второй вариант может быть неэффективным, но сохранит определенные отклонения.
df[col] = np.random.normal(mean, std, size=len(df))