Применить шум к ненулевым элементам фрейма данных - PullRequest
0 голосов
/ 02 мая 2018

Я немного борюсь с этим.

У меня есть фрейм данных, и я хочу применить гауссов шум только к ненулевым элементам фрейма данных. Глупый способ сделать это:

mu, sigma = 0, 0.1 
for i in range(df.shape[0]):
    for j in range(df.shape[1]):
        if df.iat[i,j] != 0:
            df.iat[i,j] += np.random.normal(mu,sigma)

Шум должен быть разным для каждого элемента, мы не добавляем одно и то же значение каждый раз.

И я был бы рад, если бы это сработало. На самом деле по какой-то причине это не так. Вместо этого я получил это:

до шума

после шума

Как вы можете видеть на изображении, для столбцов A и C это работает хорошо, но не для других. Что странно, так это то, что все еще есть изменение (+/- 1, так далеко от того, что можно было бы, кроме гауссовского шума ...)

Я пытался выяснить, была ли это какая-то десятичная проблема с df.round (), но ничего не вышло.

Так что я ищу другой способ применить мой шум, а не решать эту странную проблему. Заранее спасибо.

1 Ответ

0 голосов
/ 02 мая 2018

Я полагаю, что вы можете сгенерировать массив с таким же размером, как у оригинального DataFrame, а затем добавить значения по условию с помощью where:

np.random.seed(234)

df = pd.DataFrame(np.random.randint(5, size=(5,5)))
print (df)
   0  1  2  3  4
0  0  4  1  1  3
1  3  0  3  3  2
2  0  2  4  1  3
3  4  0  3  0  2
4  3  1  3  3  1

mu, sigma = 0, 0.1
a = np.random.normal(mu,sigma, size=df.shape)
print (a)
[[ 0.10452115 -0.01051424 -0.13329652 -0.06376671  0.07245456]
 [-0.21753186  0.05700441  0.03595196 -0.08154859  0.0076684 ]
 [ 0.08368405  0.10390984  0.04692948  0.09711873 -0.06820933]
 [-0.07229613  0.03954906 -0.06136678 -0.02328597 -0.22123564]
 [-0.04316055  0.05945377  0.13736261  0.07895045  0.03714287]]

df = df.where(df == 0, df.add(a))
print (df)
           0         1         2         3         4
0  0.000000  3.989486  0.866703  0.936233  3.072455
1  2.782468  0.000000  3.035952  2.918451  2.007668
2  0.000000  2.103910  4.046929  1.097119  2.931791
3  3.927704  0.000000  2.938633  0.000000  1.778764
4  2.956839  1.059454  3.137363  3.078950  1.037143
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...