Страницы

Поиск по вопросам

воскресенье, 5 января 2020 г.

Вычислить скользящее среднее

#python #pandas #машинное_обучение #dataframe #numpy


Есть датафрейм вида.

Id  Sequence
3   1,3,13...
7   1,2,1,...
8   1,2,4,...
11  1,8,25...
13  1,111,..


Где id - номер последовательности, sequence - последовательность с некоторой закономерностью.
Общая задача - угадать следующее число последовательности. Но сейчас я пока разбираюсь
со следующим:

Расположив последовательности в столбец, разбив их по запятой, имеется следующий вывод:

Id  3   7   8   11  13  15  16  18  20  21  ... 227677  227679  227680  227681  227682
 227683  227684  227686  227689  227690
0   1   1   1   1   1   1   840 1   4   1   ... 12  1   1   7   1   0   0   0   2   5
1   3   2   2   8   111 1   1320    2   6   2   ... 50  1   6   7   0   0   -1  1   3   7
2   13  1   4   25  12211   1   1680    7   8   1   ... 113 2   45  3   1   4   -1
 9   3   179


То есть траспонировали датафрейм. Теперь следующая проблема

Метод для вычисления скользящей средней:

def moving_average(series, n):
    return np.average(series[-n:])

moving_average(dftrain[3], 24)


Здесь я подаю пока что только 1 столбец для теста, хотя на самом деле вызов должен
быть в цикле for для каждого существующего столбца. Так вот
В последовательности имеются Слишком большие числа, поэтому необходимо отсечь из
каждого столбца все числа, которые больше скажем некоторого X. Также проблема в том,
что в столбцах значения None, метод не может сложить два None числа, я пытался заменить
None на 0, но по-моему это неверно

dftrain.replace(None, 0)


Для тех кому мало данных. Данная тема является продолжением этой (Тык)

Вопроса 2. Как исключить большие числа из стобцов и как избавиться с проблемой с
None. Чтобы метод скользящее среднее отработал нормально
    


Ответы

Ответ 1



Чтобы заменить числа состоящие из более чем 12 цифр на бесконечность, а строковые значения None на NaN (Not a Number): import pandas as pd def strip_big_nums(col, maxlen=12): return pd.to_numeric(np.where(col.str.len() > maxlen, 'inf', col), errors='coerce') train = pd.read_csv(r'C:\download\train.csv', sep=",", index_col=['Id']) r = train['Sequence'].str.split(',', expand=True) r = r.apply(lambda col: strip_big_nums(col, 12)) получилось: In [8]: r Out[8]: 0 1 2 3 4 5 6 7 ... 340 341 342 343 344 345 346 347 Id ... 3 1.0 3.0 13.0 87.0 1053.0 2.857600e+04 2.141733e+06 5.081471e+08 ... NaN NaN NaN NaN NaN NaN NaN NaN 7 1.0 2.0 1.0 5.0 5.0 1.000000e+00 1.100000e+01 1.600000e+01 ... NaN NaN NaN NaN NaN NaN NaN NaN 8 1.0 2.0 4.0 5.0 8.0 1.000000e+01 1.600000e+01 2.000000e+01 ... NaN NaN NaN NaN NaN NaN NaN NaN 11 1.0 8.0 25.0 83.0 274.0 2.275000e+03 1.322240e+05 1.060067e+06 ... NaN NaN NaN NaN NaN NaN NaN NaN 13 1.0 111.0 12211.0 1343211.0 147753211.0 1.625285e+10 inf inf ... NaN NaN NaN NaN NaN NaN NaN NaN 15 1.0 1.0 1.0 1.0 1.0 1.000000e+00 1.000000e+00 1.000000e+00 ... NaN NaN NaN NaN NaN NaN NaN NaN 16 840.0 1320.0 1680.0 2520.0 3192.0 3.432000e+03 4.920000e+03 5.208000e+03 ... NaN NaN NaN NaN NaN NaN NaN NaN ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 227681 7.0 7.0 3.0 2.0 3.0 9.000000e+00 5.000000e+00 4.000000e+00 ... NaN NaN NaN NaN NaN NaN NaN NaN 227682 1.0 0.0 1.0 0.0 0.0 0.000000e+00 0.000000e+00 0.000000e+00 ... NaN NaN NaN NaN NaN NaN NaN NaN 227683 0.0 0.0 4.0 1198.0 1829388.0 2.379604e+10 inf inf ... NaN NaN NaN NaN NaN NaN NaN NaN 227684 0.0 -1.0 -1.0 -1.0 -1.0 1.032430e+07 inf inf ... NaN NaN NaN NaN NaN NaN NaN NaN 227686 0.0 1.0 9.0 85.0 801.0 7.549000e+03 7.114500e+04 6.705010e+05 ... NaN NaN NaN NaN NaN NaN NaN NaN 227689 2.0 3.0 3.0 4.0 6.0 4.000000e+00 5.000000e+00 1.000000e+01 ... NaN NaN NaN NaN NaN NaN NaN NaN 227690 5.0 7.0 179.0 229.0 439.0 5.570000e+02 6.113000e+03 2.239990e+05 ... NaN NaN NaN NaN NaN NaN NaN NaN [113845 rows x 348 columns] далее данный DF можно транспонировать: In [9]: r.T Out[9]: Id 3 7 8 11 13 15 16 ... 227681 227682 227683 227684 227686 227689 227690 0 1.0 1.0 1.0 1.0 1.000000e+00 1.0 840.0 ... 7.0 1.0 0.000000e+00 0.000000e+00 0.0 2.0 5.0 1 3.0 2.0 2.0 8.0 1.110000e+02 1.0 1320.0 ... 7.0 0.0 0.000000e+00 -1.000000e+00 1.0 3.0 7.0 2 13.0 1.0 4.0 25.0 1.221100e+04 1.0 1680.0 ... 3.0 1.0 4.000000e+00 -1.000000e+00 9.0 3.0 179.0 3 87.0 5.0 5.0 83.0 1.343211e+06 1.0 2520.0 ... 2.0 0.0 1.198000e+03 -1.000000e+00 85.0 4.0 229.0 4 1053.0 5.0 8.0 274.0 1.477532e+08 1.0 3192.0 ... 3.0 0.0 1.829388e+06 -1.000000e+00 801.0 6.0 439.0 5 28576.0 1.0 10.0 2275.0 1.625285e+10 1.0 3432.0 ... 9.0 0.0 2.379604e+10 1.032430e+07 7549.0 4.0 557.0 6 2141733.0 11.0 16.0 132224.0 inf 1.0 4920.0 ... 5.0 0.0 inf inf 71145.0 5.0 6113.0 .. ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 341 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 342 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 343 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 344 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 345 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 346 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN 347 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN [348 rows x 113845 columns]

Комментариев нет:

Отправить комментарий