Мне нужно создать новое поле с именем ema2, которое:
перебирает каждое и каждая запись кадра данных
вычисляет экспоненциальную скользящую среднюю (EMA), учитывая цену, наблюдаемую на каждой итерации, и цены (длину EMA). в этом примере равно 2), наблюдавшихся в предыдущих тенденциях.
Например:
Я повторяю запись 0, и EMA равна NaN (отсутствует).
Я повторяю запись 1, а EMA все еще NaN (отсутствует)
< /li>
Я повторяю запись 12, а EMA равна 24,20 (учитывается цена записи 3, цена записи 5 и цена записи 12
Я повторяю запись 13, а EMA равна 13,53 (учитывается цена записи 3, цена записи 5 и цена записи 13
Я выполняю итерацию на записи 15, а EMA равна 12,46 (он учитывает цену на записи 3, цену на записи 5 и цену на записи 15
и так далее.....
Проблема в том, что когда фрейм данных содержит миллионы записей, его запуск занимает очень много времени.
Кто-нибудь знает, как получить те же результаты, но быстро и эффективно, пожалуйста?
df = pd.DataFrame(data=ds) [/code] Кадр данных выглядит следующим образом: display(df) [code] trend price 0 1 23 1 1 43 2 1 56 3 1 21 4 2 43 5 2 55 6 3 54 7 3 32 8 3 9 9 3 12 10 3 11 11 3 12 12 4 23 13 4 3 14 4 2 15 4 1 16 4 1 [/code] Я сохранил фрейм данных в файл .csv с именем df.csv: [code]df.to_csv("df.csv", index = False) [/code] Мне нужно создать новое поле с именем ema2, которое: [list] [*]перебирает каждое и каждая запись кадра данных
[*]вычисляет экспоненциальную скользящую среднюю (EMA), учитывая цену, наблюдаемую на каждой итерации, и цены (длину EMA). в этом примере равно 2), наблюдавшихся в предыдущих тенденциях. Например:
[*]Я повторяю запись 0, и EMA равна NaN (отсутствует).
[*]Я повторяю запись 1, а EMA все еще NaN (отсутствует) < /li> Я повторяю запись 12, а EMA равна 24,20 (учитывается цена записи 3, цена записи 5 и цена записи 12
Я повторяю запись 13, а EMA равна 13,53 (учитывается цена записи 3, цена записи 5 и цена записи 13
Я выполняю итерацию на записи 15, а EMA равна 12,46 (он учитывает цену на записи 3, цену на записи 5 и цену на записи 15 и так далее.....
[/list] Я написал следующий код: [code]time_window = 2
ema= []
for i in range(len(df)):
ds = pd.read_csv("df.csv", nrows=i+1) d = ds.groupby(['trend'], as_index=False).agg( {'price':'last'})
df['ema2'] = ema [/code] Что создает правильный фрейм данных: [code]print(df)
trend price ema2 0 1 23 NaN 1 1 43 NaN 2 1 56 NaN 3 1 21 NaN 4 2 43 35.666667 5 2 55 43.666667 6 3 54 49.571429 7 3 32 37.000000 8 3 9 23.857143 9 3 12 25.571429 10 3 11 25.000000 11 3 12 25.571429 12 4 23 24.200000 13 4 3 13.533333 14 4 2 13.000000 15 4 1 12.466667 16 4 1 12.466667 [/code] Проблема в том, что когда фрейм данных содержит миллионы записей, его запуск занимает очень много времени. Кто-нибудь знает, как получить те же результаты, но быстро и эффективно, пожалуйста?
Я столкнулся с этим вопросом во время собеседования и не могу придумать решения. В этом и проблема. Предположим, у вас есть следующий набор данных (он выходит за рамки времени 2, но это всего лишь образец для работы):