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
Мобильная версия