Как преобразовать один столбец в нормальное или гауссово распределение. и найти CI 95% и 99%

У меня есть одно имя столбца как df['Температура воздуха'] (datatype-float64)

Я хочу преобразовать этот столбец в нормальное распределение, чтобы я мог использовать империческое правило, чтобы найти 95,99% CI. или любой другой подход также подходит для нахождения 95% 995 CI.

введите здесь описание изображения

zi=df['Air_temperature'] 
from sklearn.preprocessing import MinMaxScaler
min_max=MinMaxScaler()
df_minmax=pd.DataFrame(min_max.fit_transform(zi))
df_minmax.head()

Я пробовал этот код, но я получаю [Ожидаемый 2D-массив, вместо этого получил 1D-массив: ошибка], даже я применил операцию изменения формы, но все равно получаю ошибки. пожалуйста, предложите мне любой подход для преобразования данных в нормальное распределение или нормальное распределение и найдите CI


person Akash Desai    schedule 08.04.2021    source источник
comment
Отвечает ли это на ваш вопрос? Ошибка преобразования Sklearn: ожидаемый 2D-массив, вместо этого получен 1D-массив   -  person G. Anderson    schedule 08.04.2021
comment
я хочу преобразовать этот столбец в нормальное распределение   -  person Akash Desai    schedule 08.04.2021


Ответы (1)


Я бы использовал что-то вроде Этот ответ, чтобы подогнать кривую Гаусса (нормальное расстояние) к данным, а затем использовать сгенерированное распределение с помощью метода scipy.stats .interval(0.95) (здесь) для получения конечных точек, которые содержат 95% CDF.

пример:

import pandas as pd
from scipy.stats import norm
import numpy as np
from matplotlib import pyplot as plt

normal = np.random.normal(size=1000)
noise = np.random.uniform(size=500, low=-2, high=2)
data = np.concatenate([normal, noise])   # some dummy data
# make it a DataFrame
df = pd.DataFrame(data=data, index=range(len(data)), columns=["data"])  
df.plot(kind="density")

########### YOU ARE HERE ###################

data = df.to_numpy()                              # Numpy arrays are easier for 1D data
mu, std = norm.fit(data)                          # Fit a normal distribution
print("Mu and Std: ", mu, std)

CI_95 = norm.interval(0.95, loc=mu, scale=std)    # Find the 95% CI endpoints
print("Confidence Interval: ", CI_95)

plt.vlines(CI_95, ymin=0, ymax=0.4)               # plotting stuff
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
plt.plot(x, norm.pdf(x, mu, sigma))
plt.show()

ВЫХОД:

Mu and Std:  -0.014830093874393395 1.0238114937847707
Confidence Interval:  (-2.0214637486506972, 1.9918035609019102)

Сюжет

person franklinscudder    schedule 08.04.2021
comment
да пробовал спасибо. все еще я получаю эту ошибку TypeError: аргумент float() должен быть строкой или числом, а не «AxesSubplot» - person Akash Desai; 08.04.2021
comment
Посмотрите на пример кода, похоже, вы передаете объект matplotlib в float(), который он не может интерпретировать как число. - person franklinscudder; 08.04.2021