на любом дистрибутиве анаконды, данные использовались из https://bit.ly/FixedRagindex, который у меня распакован в D:\Downloads. import pandas as pd import gc gc.enable() from tqdm import tqdm tqdm.pandas() pd.options.display.max_rows=99999 import numpy as np #подготовка инфы по предметам items_raw = open(r'D:\Downloads\Ragindex v0.3.1 Full\Data\PRE\item_db.txt').readlines()[1:] items_raw = [x.strip() for x in items_raw] items_df = pd.DataFrame(columns=['id','price']) for row in tqdm(items_raw): items_df.loc[len(items_df)] = [row.split(',')[0],row.split(',')[4]]items_df.id = items_df.id.progress_map(lambda x: x.replace('=','')) #подготовка инфы по мобам mobs_raw = open(r'D:\Downloads\Ragindex v0.3.1 Full\Data\PRE\mob_db.txt').readlines()[1:] mobs_df = pd.DataFrame(columns=['mob_id','item_id','drop_rate','mob_name']) for mob in tqdm(mobs_raw): mi = mob.split(',')[0].replace('=','') mn = mob.split(',')[1] ii = '' dr = '' for i in range(37,len(mob.split(','))): if i % 2 != 0: ii = mob.split(',').strip()else: dr = mob.split(',').strip() if ii != '' and dr != '': mobs_df.loc[len(mobs_df)] = [mi,ii,dr,mn] ii = '' dr = ''mobs_df = mobs_df[mobs_df.drop_rate!='0'] mobs_df = mobs_df.drop_duplicates(keep='first').reset_index(drop=True) #сведение мобов и предметов df = pd.merge(mobs_df,items_df,how='left',left_on='item_id',right_on='id') df.drop_rate = df.drop_rate.map(lambda x: float(x)/100) df.price = df.price.map(lambda x: float(x)) #функция перевода 1х в логарифмический def make_logarithmic(rate): return np.round(rate*(3-np.log10(rate))**(np.log(4)/np.log(5)),decimals=2) #применение данной функции, а также обычного среднего df['log_drop'] = df.drop_rate.progress_map(lambda x: make_logarithmic(x)) df['mean_value'] = df.progress_apply(lambda x: x.price*x.log_drop/100, axis=1) #определение MVP boss = open(r'D:\Downloads\Ragindex v0.3.1 Full\Data\miniMVP.txt').readlines()+open(r'D:\Downloads\Ragindex v0.3.1 Full\Data\MVP.txt').readlines() boss = [x.strip() for x in boss] df['MVP'] = df.mob_id.map(lambda x: x in boss) #различные статистики by_mob_total = pd.DataFrame(df.groupby(['mob_id','MVP','mob_name'])['mean_value'].sum()).reset_index() by_mob_total = by_mob_total.sort_values('mean_value',ascending=False) by_mob_total[~by_mob_total.MVP].reset_index().drop('index',axis=1) #ссылка на РМС по ИД моба a = 1154 print(f'https://ratemyserver.net/mob_db.php?mob_id={a}&small=1&back=1') Всю аналитическую часть по тому, на ком выгоднее - это уже сами