2016-04-12 2 views
2

Так ив некоторых временных рядов, данные о которых я хочу, чтобы вычислить ежедневные возвращения/прироста, где ежедневный прирост = value_at_time (T)/value_at_time (Т-1)вычисления ежедневно возврата/прирост на dataframe

import pandas as pd 
df=pd.DataFrame([1,2,3,7]) #Sample data frame 
df[1:] 
out: 
0 
1 2 
2 3 
3 7 
df[:-1] 
out: 
    0 
0 1 
1 2 
2 3 
######### Method 1 
df[1:]/df[:-1] 
out: 
    0 
0 NaN 
1 1 
2 1 
3 NaN 

######### Method 2 
df[1:]/df[:-1].values 
out: 
      0 
1 2.000000 
2 1.500000 
3 2.333333 

######### Method 3 
df[1:].values/df[:-1] 
out: 
    0 
0 2 
1 1 
2 2 

Мои вопросы в том, что

  1. Если DF [: - 1] и DF [1:] имеют только три значения (строки ломтики dataframe), то почему оленья кожа method_1 работать?
  2. Почему методы 2 & 3, которые почти аналогичны, дают разные результаты?
  3. Почему с помощью .values ​​в Method_2 делает его работу

ответ

2

Давайте посмотрим на каждый

метод 1, если вы посмотрите на то, что вернуть ломтиков вы можете увидеть, что показатели не совпадают:

In [87]: 
print(df[1:]) 
print(df[:-1]) 

    0 
1 2 
2 3 
3 7 
    0 
0 1 
1 2 
2 3 

так тогда, когда сделать разделение только 2 колонки пересекаются:

In [88]: 
df[1:]/df[:-1] 

Out[88]: 
    0 
0 NaN 
1 1.0 
2 1.0 
3 NaN 

Метод 2 создает массив нп, это не имеет никакого индекса, так что разделение будет осуществляться в порядке поэлементно, как и ожидалось:

In [89]: 
df[:-1].values 

Out[89]: 
array([[1], 
     [2], 
     [3]], dtype=int64) 

Даяние:

In [90]: 
df[1:]/df[:-1].values 

Out[90]: 
      0 
1 2.000000 
2 1.500000 
3 2.333333 

Метод 3 по той же причине, как метод 2

Итак, вопрос в том, как это сделать в чистых пандах? Мы используем shift, чтобы выровнять показатели по желанию:

In [92]: 
df.shift(-1)/df 

Out[92]: 
      0 
0 2.000000 
1 1.500000 
2 2.333333 
3  NaN 
+1

спасибо EdChum, но другой вопрос в том, что Method_3 хотя точно так же, как Method_2 оленья кожа дают тот же результат. Пока Method_2 дает выход float, Method_3 завершает их, почему это так? Что происходит с изменением порядка. – shalini

+0

Я получаю float, но моя версия np - «1.10.4», а версия pandas - «0.18.0» и python. 3.4. – EdChum

+1

pd .__ version__ 0.17.1, numpy .__ version__ '1.10.1'. Я думаю, может быть, ошибка pandas 17.1 – shalini