#pandas
Вопрос:
У меня есть фрейм данных с большими сгруппированными данными. Я могу визуализировать фрейм данных с помощью графика, но я хотел бы определить «плавность» фрейма данных без необходимости визуализировать данные.Я исследовал и увидел, что потенциальный способ пойти-использовать разность стандартных отклонений.Существует ли способ вычисления типа плавного индекса на основе того, как данные временных рядов разделяют плавные данные от зашумленных данных.Два примера моих визуальных элементов фрейма данных:;
Плавно (без шума)
Грубый (шум)
Комментарии:
1. плавное вековое снижение значения временного ряда приведет к смещению стандартного отклонения вверх, ваш ряд должен быть стационарным, чтобы такое сравнение работало
2. Что делать, если у меня есть набор фиксированных точек данных, например, 100 точек данных для каждой.можем ли мы сравнить на этой основе, если я выберу фиксированный набор точек данных
3. Возможно, вы могли бы получить данные преобразования Фурье для шума, а затем попробовать посмотреть среднее значение стандартных отклонений данных линейной регрессии от исходного набора данных для набора равномерно распределенных интервалов, которые образуют раздел во временной области. Однако я не знаком с этим программным обеспечением.
Ответ №1:
Для начала следует с осторожностью отнестись к тому, что они подразумевают под плавностью кривой. Математически гладкость (грубо говоря) является мерой числа непрерывных производных по области ее определения. Но из вашего вопроса очевидно, что это не то, что вы ищете. Вместо этого, я думаю, вы хотите измерить «шероховатость» кривой.
Один из способов сделать это-вычислить сумму квадратов разности нормализованных разностей. В результате получается, что чем ближе вы находитесь к 0, тем более плавная кривая. Возможно, это не лучшая из всех мер, но она делает довольно хорошую работу, легко применима и инвариантна к масштабу.
Итак, вот пример: я приведу вам три временных ряда. Параболическая функция ( x**2
), случайная кривая и плоская линия. Я создаю временные ряды и преобразую их в кадры данных (возможно, это не самый приятный способ сделать это, но он работает).
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-50,50,1)
y = x**2
ts1 = pd.Series(np.random.randn(100), index=pd.date_range("1/1/2000", periods=100))
ts2 = pd.Series(y, index=pd.date_range("1/1/2000", periods=100))
ts3 = pd.Series(1,index=pd.date_range("1/1/2000", periods=100) )
df1 = pd.DataFrame(data=ts1.index, columns=['Date'])
df2 = pd.DataFrame(data=ts1.values, columns=['Values'])
df_s = pd.merge(df1, df2, left_index=True, right_index=True)
df3 = pd.DataFrame(data=ts2.index, columns=['Date'])
df4 = pd.DataFrame(data=ts2.values, columns=['Values'])
df_r = pd.merge(df3, df4, left_index=True, right_index=True)
df5 = pd.DataFrame(data=ts3.index, columns=['Date'])
df6 = pd.DataFrame(data=ts3.values, columns=['Values'])
df_l = pd.merge(df5, df6, left_index=True, right_index=True)
Итак, df_s
является ли случайная кривая:
df_r
является ли парабола:
и df_l
является ли линия:
Теперь функция, которую вы должны вычислить, имеет следующий вид:
f = df['Values'].diff()
Normed_f = (f-f.mean())/f.std()
roughness_ts = (Normed_f.diff() ** 2).sum()
В наших случаях,
f_1 = df_s['Values'].diff()
Normed_f_1 = (f_1-f_1.mean())/f_1.std()
roughness_ts1 = (Normed_f_1.diff() ** 2)
roughness_ts1.sum()
f_2 = df_r['Values'].diff()
Normed_f_2 = (f_2-f_2.mean())/f_2.std()
roughness_ts2 = (Normed_f_2.diff() ** 2)
roughness_ts2.sum()
f_3 = df_l['Values'].diff()
Normed_f_3 = (f_3-f_3.mean())/f_3.std()
roughness_ts3 = (Normed_f_3.diff() ** 2)
roughness_ts3.sum()
roughness_ts1.sum(),roughness_ts2.sum(),roughness_ts3.sum()
который возвращает:
(275.2340106887092, 0.11878787878787875, 0.0)
Другой способ (который мне труднее понять) — это автокорреляционная задержка 1, которая в основном сравнивает точки данных друг с другом, сдвигая кривую. Это позволяет увидеть, есть ли связь между последовательными точками.
ts1.autocorr(lag=1), ts2.autocorr(lag=1),ts3.autocorr(lag=1)
который возвращает:
(0.04990543648691135, 0.9969518319659281, nan)
Чем ближе к 1 балл, тем более плавная кривая, чем ближе к 0, тем «грубее» кривая. Как вы видите, он возвращается nan
для постоянных функций.