#python-3.x #pandas #numpy
#python-3.x #pandas #numpy
Вопрос:
Я пытаюсь получить std из массива с плавающей запятой.
Я написал rolling_std2(), чтобы сделать это через pandas:
data = my_large_array
def rolling_std2(observations, n):
df = pd.DataFrame()
df['Obs'] = observations
df['Std'] = df.Obs.rolling(n).std()
return df['Std'].values
shortSTD = rolling_std2(data , 100)
longSTD = rolling_std2(data , 5000)
data shortSTD longSTD
utcDT
<missing large number of rows>
2020-09-07 23:55:00 00:00 0.00001282 0.00000978 0.00496809
2020-09-07 23:56:00 00:00 0.00000656 0.00000979 0.00496809
2020-09-07 23:57:00 00:00 0.00000537 0.00000980 0.00496809
2020-09-07 23:58:00 00:00 0.00000194 0.00000980 0.00496809
2020-09-07 23:59:00 00:00 0.00000252 0.00000980 0.00496809
2020-09-08 00:01:00 00:00 0.00000319 0.00000978 0.00496809
2020-09-08 00:02:00 00:00 0.00001175 0.00000981 0.00496809
2020-09-08 00:03:00 00:00 0.00004597 0.00001075 0.00496809
2020-09-08 00:04:00 00:00 0.00004204 0.00001146 0.00496809
2020-09-08 00:05:00 00:00 0.00002646 0.00001171 0.00496809
longSTD не кажется правильным, его значение должно меняться.
Что я могу делать неправильно?
Комментарии:
1. Не могу сильно помочь, если мы не увидим, как выглядят данные
2. Интересно! можете ли вы поделиться данными, чтобы мы могли это протестировать? Однако один немедленный вопрос: какова разница в ваших данных (наблюдениях)?
3. данные содержат 3 миллиона строк — не уверен, как поделиться
4. Как насчет разницы? Если имеющиеся у вас данные имеют очень небольшую дисперсию (по крайней мере, кусочно), вы не ожидаете больших изменений в std.
Ответ №1:
Я не думаю, что с вашей функцией что-то не так. Как я упоминал в разделе комментариев, переход std
с окном такого размера, вероятно, приведет к тому, что вы сочтете ненормальным, ЕСЛИ в ваших данных очень много различий. Вот пример, который иллюстрирует это. Я создал 2 массива со случайными значениями в течение двух разных интервалов, [0.001, 0.01]
а другой [0.001, 0.1]
, поместил их в фрейм данных, применил
array1 = np.random.uniform(low=0.001, high=0.01, size=(1000000,))
array2 = np.random.uniform(low=0.001, high=0.1, size=(1000000,))
DF = pd.DataFrame(array1,array2).reset_index()
DF2 = DF.rename(columns={'index': "A",0: "B"})
def rolling_std2(observations, n):
df = pd.DataFrame()
df['Obs'] = observations
df['Std'] = df.Obs.rolling(n).std()
return df['Std'].values
shortSTDA = rolling_std2(DF2['A'] , 100)
longSTDA = rolling_std2(DF2['A'] , 5000)
shortSTDB = rolling_std2(DF2['B'] , 100)
longSTDB = rolling_std2(DF2['B'] , 5000)
FULL1 = pd.DataFrame(shortSTDA,shortSTDB)
FULL2 = pd.DataFrame(longSTDA,longSTDB).reset_index()
FULL2 = FULL2.rename(columns={'index': "longSTDA",0: "longSTDB"})
print(FULL2.tail(100))
и получил этот фрейм данных
longSTDA longSTDB
999900 0.002614 0.028806
999901 0.002615 0.028806
999902 0.002615 0.028804
999903 0.002615 0.028804
999904 0.002615 0.028804
... ... ...
999995 0.002612 0.028762
999996 0.002612 0.028761
999997 0.002612 0.028756
999998 0.002612 0.028755
999999 0.002611 0.028758
Как вы видите, longSTD
для массива с узким интервалом показывает очень небольшую дисперсию. Проверьте отклонение в ваших данных.
Комментарии:
1. Но вы получаете НЕКОТОРЫЕ изменения. Я не получаю ничего в примере, который я вам показал
2. Есть ли способ Stackoverflow отправить вам 10 Тыс. строк?
3. Итак, вы имеете в виду, что целое
df[longSTB]
равно0.00496809
??4. Да — похоже, он остается постоянным
5. Сложно обмениваться такими данными. Вы могли бы (если ваши данные не являются конфиденциальными) отправить его по электронной почте (sergedegossondevarennes@gmail.com ). Положительным моментом является то, что ваша функция действительно выполняет то, что должна, как показано в моем примере.