Для цикла if оператор возвращает нежелательный результат в первой строке - PullRequest
0 голосов
/ 30 октября 2018

У меня есть код на python, который пытается вычислить выборочную дисперсию, пока я накапливаю записи в каждом цикле.

y_hat = y_df.loc[n-1]
var = []
var_sum = 0
for i in range(n):
    var_i = (g_i[i] - y_hat)**2
    var_sum += var_i
    if i == 0: 
        var_avg = var_sum
        var.append(var_avg)
    else: 
        var_avg = var_sum/i
        var.append(var_avg)

вывод результата дает очень странные первые строки (когда i равен 1), в то время как остальные строки в порядке. Может кто-нибудь помочь, пожалуйста?

Это токовый выход:

output of the code

Ниже приведен весь мой сценарий, по сути, я тестирую симуляцию Монте-Карло для оценки числа пи.

import numpy as np
import math
import matplotlib.pyplot as plt
import random
import pandas as pd
import statistics as stats

n = 1000
k = 100

# generate u r.v. with size k*n -> (100,1000)
u = []
for i in range(k):
    u_i = np.random.uniform(size = n)
    u.append(u_i)

# put into dataframe (k*n)
u_df = pd.DataFrame(u)

# calculate g_i, g_i is a df with k*n
g_i = 4*np.sqrt(1-u_df**2)

g_sum = 0
y = []
for i in range(n):
    g_sum += g_i[i]
    y_i = g_sum/(i+1)
    y.append(y_i)

# put y into df -> n*k
y_df = pd.DataFrame(y)
y_df = y_df.reset_index(drop=True)

y_hat = y_df.loc[n-1]
var = []
var_sum = 0
for i in range(n):
    var_i = (g_i[i] - y_hat)**2
    var_sum += var_i
    if i == 0: 
        var_avg = var_sum
        var.append(var_avg)
    else: 
        var_avg = var_sum/i
        var.append(var_avg)

var_df = pd.DataFrame(var)
var_df = var_df.reset_index(drop=True)

var_df.head()

1 Ответ

0 голосов
/ 30 октября 2018

Когда var.append (var_avg) выполняется внутри оператора i == 0 if, вы добавляете var_sum по ссылке на var. Таким образом, каждый раз, когда вы меняете var_sum, вы меняете var [0]. Вы можете решить эту проблему, явно скопировав var_sum, когда i == 0. Исправленный оператор if-else будет

if i == 0: 
    var_avg = var_sum
    var.append(var_avg.copy())
else: 
    var_avg = var_sum/(i+1)
    var.append(var_avg)
...