Этот код работает, если вы игнорируете значения сайта. Я преобразовал логику в Python из устаревшей системы, которая когда-либо обрабатывала только 1 сайт. Теперь он работает в Python, но должен работать для каждого конкретного сайта.
Очевидно, что это не полный код, а только столбцы и логика сайта.
В основномкод изменяет «real_value» и сглаживает значения, так что «smoothed_value» вообще не имеет отрицательных значений.
Я не могу понять, как применить логику к одному сайту, когда все сайты находятся в кадре данных одновременно.
Я не совсем уверен, с чего начать с группировкипо сайту. Я попробовал несколько вещей, но прокомментированный код (внизу) - самый близкий, который у меня есть, и он все еще не выглядит правильным. Я знаю, что основной цикл FOR должен быть изменен, но я не совсем уверен, как.
import pandas as pd
Storage=pd.DataFrame()
Storage['site'] = [
'A','A','A','A','A','A','C','C','C','C',
'D','D','D','D','D','D','D','D','D','D',
'B','B','B','B','B','B','B','B','B','B']
Storage['real_value'] = [
2593.769191,2770.73389599994,6514.75004600001,6158.58129200005,2440.53634399994,
-136.246671999981,455.359255999961,-122.125297999993,9456.82494400006,18282.550165,
8913.47572500005,524.379928000032,928.181714999916,926.490542000033,407.473650000021,
1883.205675,-13405.49748,18178.816992,-7543.11027599997,644.578617999975,
168.571999999974,138.258188000032,217.615295999974,3718.12751199997,9250.91240000011,
7102.1812419999,1376.81937600004,406.029493999961,415.965640000007,3439.79298800006]
# Smooth the data in order to remove negative values
Storage['smoothed_value']=Storage['real_value']
Storage=Storage.sort_values('site')
Storage.reset_index(inplace=True)
Storage=Storage.drop(columns=['index'])
#print (Storage.shape[0])
for i in range(0,Storage.shape[0]):
j = 0
sum = Storage['smoothed_value'].get_values()[i]
#print(str(i) + ": " + str(sum))
leftlim = i
rightlim = i
while (sum < 0):
j = j + 1
if (i - j <= 0):
#print ("if")
# Smoothing window limited by start of data set
leftlim = 0
rightlim = i + j
sum = sum + Storage.at[rightlim,'smoothed_value']
elif (i + j > Storage.shape[0]):
#print ("elif")
# Smoothing window limited by end of data set
leftlim = i - j
rightlim = Storage.shape[0]
sum = sum + Storage.at[leftlim,'smoothed_value']
else:
#print ("else")
# Smoothing window not limited by data set length
leftlim = i - j
rightlim = i + j
sum = sum + Storage.at[leftlim,'smoothed_value'] + Storage.at[rightlim,'smoothed_value']
#print("bottom of while: " + str(sum))
for k in range (leftlim,rightlim+1):
#print ("k: " + str(k) + " leftlim: " + str(leftlim) + " rightlim: " + str(rightlim))
Storage.at[k,'smoothed_value'] = sum / (rightlim - leftlim + 1)
print (Storage.to_string())
print (Storage['smoothed_value'].sum() , Storage['smoothed_value'].sum(), '\n\n\n')
#for i,g in Storage.groupby('site'):
# print (i, g)
# print (Storage['smoothed_value'].sum() , Storage['smoothed_value'].sum(), '\n\n\n')
Я ожидаю, что вычисление сглаживания работает для одного сайта за раз, поэтому в конце кодадля этого сайта нет никаких отрицательных значений, и значения real_values можно изменить для тестирования.
В версии для производственной системы могут быть десятки сайтов и сотни значений real_values (уже отсортированных в порядке дат), и они должны иметь одинаковый результат.