Хорошо, я думаю, что знаю, что вы имеете в виду. Приведенный ниже код не имеет значения, интересует ли значение «да» или «нет». Но то, что вы хотите, - это рассчитать коэффициент GINI двумя различными способами для каждой строки на основе значения в Интересном значении этой строки. Так что если интересно == нет, то результат 0,5, потому что a == b. Но если интересно «да», то вам нужно использовать a = вероятность [i] и b = вероятность [i + 1]. Поэтому пропустите этот раздел, чтобы получить обновленный код ниже.
import pandas as pd
df = pd.read_csv('df.txt',delim_whitespace=True)
probs = df['probabilities']
def ROLLING_GINI(probabilities):
a1 = (probabilities[0]/(probabilities[0]+probabilities[0]))**2
b1 = (probabilities[0]/(probabilities[0]+probabilities[0]))**2
res = 1 - (a1 + b1)
yield res
for i in range(len(probabilities)-1):
a1 = (probabilities[i]/(probabilities[i]+probabilities[i+1]))**2
b1 = (probabilities[i+1]/(probabilities[i]+probabilities[i+1]))**2
res = 1 - (a1 + b1)
yield res
df['GINI'] = [val for val in ROLLING_GINI(probs)]
print(df)
Именно здесь начинаются настоящие проблемы, потому что, если я правильно понимаю вашу идею, вы не сможете рассчитать последнее значение GINI, потому что ваш фрейм данных не будет разрешить это. Важным моментом здесь является то, что последнее интересное значение в вашем фрейме данных - «да». Это означает, что я должен использовать a = вероятность [i] и b = вероятность [i + 1]. Но у вашего фрейма данных нет строки номер 11. У вас есть 10 строк, а в строке i == 10 вам понадобится вероятность в строке 11 для вычисления коэффициента GINI. Поэтому, чтобы ваша идея работала, последнее Интересное значение ДОЛЖНО быть «нет», в противном случае вы всегда получите ошибку индекса.
В любом случае, вот код:
import pandas as pd
df = pd.read_csv('df.txt',delim_whitespace=True)
def ROLLING_GINI(dataframe):
probabilities = dataframe['probabilities']
how_to_calculate = dataframe['Interesting']
for i in range(len(dataframe)-1):
if how_to_calculate[i] == 'yes':
a1 = (probabilities[i]/(probabilities[i]+probabilities[i+1]))**2
b1 = (probabilities[i+1]/(probabilities[i]+probabilities[i+1]))**2
res = 1 - (a1 + b1)
yield res
elif how_to_calculate[i] == 'no':
a1 = (probabilities[i]/(probabilities[i]+probabilities[i]))**2
b1 = (probabilities[i]/(probabilities[i]+probabilities[i]))**2
res = 1 - (a1 + b1)
yield res
GINI = [val for val in ROLLING_GINI(df)]
print('All GINI coefficients: %s'%GINI)
print('Length of all calculatable GINI coefficients: %s'%len(GINI))
print('Number of rows in the dataframe: %s'%len(df))
print('The last Interesting value is: %s'%df.iloc[-1,0])
РЕДАКТИРОВАТЬ НОМЕР ТРИ (извините за позднюю реализацию):
Так что это работает, если я правильно применю индексацию. Проблема заключалась в том, что я хотел использовать вероятность Next , а не предыдущую. Так что это a = вероятности [i-1] и b = вероятности [i]
import pandas as pd
df = pd.read_csv('df.txt',delim_whitespace=True)
def ROLLING_GINI(dataframe):
probabilities = dataframe['probabilities']
how_to_calculate = dataframe['Interesting']
for i in range(len(dataframe)):
if how_to_calculate[i] == 'yes':
a1 = (probabilities[i-1]/(probabilities[i-1]+probabilities[i]))**2
b1 = (probabilities[i]/(probabilities[i-1]+probabilities[i]))**2
res = 1 - (a1 + b1)
yield res
elif how_to_calculate[i] == 'no':
a1 = (probabilities[i]/(probabilities[i]+probabilities[i]))**2
b1 = (probabilities[i]/(probabilities[i]+probabilities[i]))**2
res = 1 - (a1 + b1)
yield res
GINI = [val for val in ROLLING_GINI(df)]
print('All GINI coefficients: %s'%GINI)
print('Length of all calculatable GINI coefficients: %s'%len(GINI))
print('Number of rows in the dataframe: %s'%len(df))
print('The last Interesting value is: %s'%df.iloc[-1,0])