Как заполнить столбцы данных pandas в цикле for - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь заполнить pandas столбцы данных в цикле for.Имя столбца является параметрическим и присваивается значением цикла.Это мой код:

for k in range (-1, -4, -1):
    df_orj = pd.read_csv('something.csv', sep= '\t') 

    df_train = df_orj.head(11900)   
    df_test = df_orj.tail(720) 

    SHIFT = k

    df_train.trend = df_train.trend.shift(SHIFT)
    df_train = df_train.dropna()
    df_test.trend = df_test.trend.shift(SHIFT)
    df_test = df_test.dropna()

    drop_list = some_list

    df_out = df_test[['date','price']]
    df_out.index = np.arange(0, len(df_out)) # start index from 0
    df_out["pred-1"] = np.nan
    df_out["pred-2"] = np.nan
    df_out["pred-3"] = np.nan

    df_train.drop(drop_list, 1, inplace = True )
    df_test.drop(drop_list, 1, inplace = True )

    # some processes here

    rf = RandomForestClassifier(n_estimators = 10)
    rf.fit(X_train,y_train)
    y_pred = rf.predict(X_test)
    print("accuracy score: " , rf.score(X_test, y_test))


    X_test2 = sc.transform(df_test.drop('trend', axis=1))
    y_test2 = df_test['trend'].values

    y_pred2  = rf.predict(X_test2)
    print("accuracy score: ",rf.score(X_test2, y_test2))


    name = "pred{0}".format(k)
    for i in range (0, y_test2.size):
        df_out[name][i] = y_pred2[i]

df_out.head(20)

И это мой вывод:

                time_period_start  price_open  pred-1  pred-2  pred-3
697  2018-10-02T02:00:00.0000000Z       86.80     NaN     NaN     1.0
698  2018-10-02T03:00:00.0000000Z       86.65     NaN     NaN     1.0
699  2018-10-02T04:00:00.0000000Z       86.32     NaN     NaN     1.0

Как видите, заполнен только pred-3.Как я могу заполнить все 3 предопределенных столбца?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Вы устанавливаете эти 3 столбца как пустые значения в каждом цикле, поэтому вы теряете эти значения при повторении.Либо переместите эти инициализирующие столбцы до цикла, либо вы можете просто инициализировать переменными с помощью:

Заменить

df_out["pred-1"] = np.nan
df_out["pred-2"] = np.nan
df_out["pred-3"] = np.nan

Чтобы просто инициализировать отдельный столбец во время его цикла

name = "pred{0}".format(k)
df_out[name] = np.nan

Итак, полный код:

for k in range (-1, -4, -1):
    df_orj = pd.read_csv('something.csv', sep= '\t') 

    df_train = df_orj.head(11900)   
    df_test = df_orj.tail(720) 

    SHIFT = k

    df_train.trend = df_train.trend.shift(SHIFT)
    df_train = df_train.dropna()
    df_test.trend = df_test.trend.shift(SHIFT)
    df_test = df_test.dropna()

    drop_list = some_list

    df_out = df_test[['date','price']]
    df_out.index = np.arange(0, len(df_out)) # start index from 0

    name = "pred{0}".format(k)
    df_out[name] = np.nan

    df_train.drop(drop_list, 1, inplace = True )
    df_test.drop(drop_list, 1, inplace = True )

    # some processes here

    rf = RandomForestClassifier(n_estimators = 10)
    rf.fit(X_train,y_train)
    y_pred = rf.predict(X_test)
    print("accuracy score: " , rf.score(X_test, y_test))


    X_test2 = sc.transform(df_test.drop('trend', axis=1))
    y_test2 = df_test['trend'].values

    y_pred2  = rf.predict(X_test2)
    print("accuracy score: ",rf.score(X_test2, y_test2))



    for i in range (0, y_test2.size):
        df_out[name][i] = y_pred2[i]

df_out.head(20)
0 голосов
/ 11 декабря 2018

Если я правильно понимаю, то ваша проблема в том, что вы заполняете pred-3 только там, где другие два - nan.Это потому, что ваш df_out находится в цикле, и вы получаете результаты для последней итерации цикла.Вы должны определить его вне цикла, чтобы ваша информация не потерялась для двух других.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...