Как запустить несколько статистических распределений по всем возможным комбинациям значений в столбце и назначить минимуPython

Программы на Python
Ответить
Anonymous
 Как запустить несколько статистических распределений по всем возможным комбинациям значений в столбце и назначить миниму

Сообщение Anonymous »

Я пытаюсь построить интервалы для большого набора данных так, чтобы подмножество данных внутри каждого интервала хорошо соответствовало экспоненциальному распределению. Базовая структура данных выглядит следующим образом, но содержит около 1000 отдельных записей:
Location = ['CIL', 'BUR', 'SNA', 'PRT'] #a 3-letter code for each unique location data is recorded
TpD = [2.0, 6.5, 32.0, 2.86] #the average number of times per day an event occurs at that location (the independent variable)
Output = [3685, 58492, 285938, 10491] #the total recorded output produced by those events over a year (the dependent variable)

d=pd.DataFrame({'Location':Location, 'TpD':TpD, 'Output':Output})

Для каждого значения TpD A я хотел бы сделать следующее:
  • вычислить совокупные эмпирические и экспоненциальные распределения в диапазоне от A до всех значений TpD >A
  • вычислить статистику KS для этих двух распределений
  • выберите значение B, которое дает наименьшую статистику K-S для значения TpD A.
  • создайте новый столбец в DataFrame, в котором значение B будет указано в той же строке/индексе, что и значение A.
Я могу выполнить первые три шага для первого интервала, используя следующий скрипт:
KSS = []
for a in d.TpD_Avg:
Rng = stat.ecdf(d[d['TpD_Avg'].between(0,a)].Output).cdf.quantiles
Emp = stat.ecdf(d[d['TpD_Avg'].between(0,a)].Output).cdf.probabilities
Exp = stat.expon.cdf(Rng, 0, Rng.mean())
KSS.append(stat.kstest(Emp,Exp).statistic)
d['KSS'] = KSS
d.KSS.min()

Однако у меня возникли проблемы с последним шагом: повторением того же процесса для оставшихся ячеек. Моя интуиция подсказывает создать метод и применить его к каждому значению в TpD_Avg, но мне не удается заставить содержимое метода работать. Я попробовал следующий скрипт:
for a in d.TpD_Avg:

test = pd.DataFrame()
test['TpD_Avg'] = d['TpD_Avg'].drop_duplicates().sort_values(ascending=True).reset_index(drop=True)
KSS = []
bins = []

for b in test.TpD_Avg:
Rng = stat.ecdf(d[d['TpD_Avg'].between(a,b)].Output).cdf.quantiles
Emp = stat.ecdf(d[d['TpD_Avg'].between(a,b)].Output).cdf.probabilities
Exp = stat.expon.cdf(Rng, 0, Rng.mean())
KSS.append(stat.kstest(Emp,Exp).statistic)

test['KSS'] = KSS
bins.append(test[test.KSS.min()].TpD_Avg)

d['bins'] = bins

...но это выдает как предупреждение о размере выборки для трех строк, генерирующих распределения , так и ошибку ключа в последней строке.
С одной стороны, было бы неплохо, если бы я мог исправить конкретные ошибки в этом сценарии, чтобы я знал, что делаю неправильно. С другой стороны, наверняка должен быть способ сделать это, не требующий циклов for; В отчаянии я прибегнул к циклам for, безуспешно опробовав, наверное, дюжину различных наборов команд, просто используя Pandas, прежде чем выполнить первые три шага, как показано во втором блоке кода. Буду признателен за предложения по любому из подходов.
Редактировать: по запросу, вот все в одном блоке. Я не уверен, что это поможет сделать проблему более воспроизводимой при отсутствии реалистичного набора данных, но я также не знаю, как создать его искусственно.
import pandas as pd
import scipy.stats as stat

Location = ['CIL', 'BUR', 'SNA', 'PRT'] #a 3-letter code for each unique location data is recorded
TpD = [2.0, 6.5, 32.0, 2.86] #the average number of times per day an event occurs at that location (the independent variable)
Output = [3685, 58492, 285938, 10491] #the total recorded output produced by those events over a year (the dependent variable)

d=pd.DataFrame({'Location':Location, 'TpD':TpD, 'Output':Output})

for a in d.TpD_Avg:

test = pd.DataFrame()
test['TpD_Avg'] = d['TpD_Avg'].drop_duplicates().sort_values(ascending=True).reset_index(drop=True)
KSS = []
bins = []

for b in test.TpD_Avg:
Rng = stat.ecdf(d[d['TpD_Avg'].between(a,b)].Output).cdf.quantiles
Emp = stat.ecdf(d[d['TpD_Avg'].between(a,b)].Output).cdf.probabilities
Exp = stat.expon.cdf(Rng, 0, Rng.mean())
KSS.append(stat.kstest(Emp,Exp).statistic)

test['KSS'] = KSS
bins.append(test[test.KSS.min()].TpD_Avg)

d['bins'] = bins


Подробнее здесь: https://stackoverflow.com/questions/798 ... inations-o
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»