Могут ли панды искать точку перехода из массива

#python #pandas #matplotlib

#python #pandas #matplotlib

Вопрос:

При визуализации данных легко заметить очевидные точки перехода, появляющиеся на графике. Пример следующий: введите описание изображения здесьпо оси x видно, что точка перехода возникает, когда x приблизительно равно 20.

Массиву это нравится:

 # its a numpy array, and the above graph was generated from this data.
data = [
 [1361.14518337], [1433.39549409], [1504.63249477], [1460.2021208 ], [1390.32339013], [1397.84750083],
 [1394.54077186], [1418.18011045], [1427.12952911], [1394.33866679], [1358.03014427], [1457.59190384],
 [1541.48510879], [1486.51043879], [1458.22575164], [1430.94858482], [1438.87910826], [1448.143909  ],
 [1466.55875458], [1458.7928132 ], [1434.62923805], [1477.97199541], [1413.40730951], [1411.84021648],
 [1252.4419062 ], [1217.13711238], [ 950.31336826], [ 966.47099637], [1118.83126445], [1128.35809695], 
 [ 980.90987398], [ 910.86773336], [ 902.6983213 ], [1107.94980806], [1110.05317726], [ 946.62779063],
 [ 959.91499504], [ 938.20602256], [1022.07169491], [1156.39805856], [ 954.48020012], [ 976.44245685],
 [ 982.38485077], [1074.72374569], [1102.00714274], [1159.2788817 ], [1007.43509385], [ 995.59672598],
 [1209.37631567], [ 961.19124935], [1051.04118878], [1200.09496075], [ 890.1678545 ], [ 916.42618902],
 [ 912.19546577], [ 945.58543761], [1071.88352921], [1083.20760372], [1195.35663378], [ 929.93894055],
 [ 928.27805573], [1281.7031985 ], [1347.83916238], [ 900.05017228], [ 978.48235553], [1014.88186152],
 [ 988.54237661], [1074.84866506], [ 975.67469832], [ 995.92688913], [ 993.88374947], [ 957.97894149], 
 [1398.64294143]
]
 

Итак, могут ли панды искать те точки, которые отмечены красным цветом на картинке?

Ответ №1:

Не на 100% ясно, что вам здесь нужно. Но одним из вариантов может быть вычисление скользящего среднего и определение того, когда оно изменяется больше всего:

 df = pd.DataFrame(data)
df = df.rolling(3).mean() # find the mean. See docs for rolling for more options here
df.diff().abs().idxmax() # Calculate the change as absolute value and find the index of the max value
 

Это даст индекс 25 в случае ваших данных. Настраивайте по мере необходимости.