Вычисление разницы между двумя строками в Python / Pandas

В Python, как я могу ссылаться на предыдущий ряд и вычислять что-то против него? В частности, я работаю сdataframes вpandas - У меня есть фрейм данных с информацией о цене акций, который выглядит следующим образом:

           Date   Close  Adj Close
251  2011-01-03  147.48     143.25
250  2011-01-04  147.64     143.41
249  2011-01-05  147.05     142.83
248  2011-01-06  148.66     144.40
247  2011-01-07  147.93     143.69

Вот как я создал этот фрейм данных:

import pandas

url = 'http://ichart.finance.yahoo.com/table.csv?s=IBM&a=00&b=1&c=2011&d=11&e=31&f=2011&g=d&ignore=.csv'
data = data = pandas.read_csv(url)

## now I sorted the data frame ascending by date 
data = data.sort(columns='Date')

Начиная со строки № 2, или в этом случае, я думаю, это 250 (PS - это индекс?), Я хочу вычислить разницу между 2011-01-03 и 2011-01-04, для каждой записи в этом кадре данных , Я считаю, что подходящий способ - написать функцию, которая берет текущую строку, затем вычисляет предыдущую строку и вычисляет разницу между ними, используяpandas apply функция для обновления кадра данных со значением.

Это правильный подход? Если да, должен ли я использовать индекс для определения разницы? (примечание: я все еще нахожусь в режиме новичка в Python, поэтому index может быть не правильным термином и даже не правильным способом реализации этого)

 redShadow29 окт. 2012 г., 01:37
Нет, подождите .. что именно вы пытаетесь достичь? Рассчитайте для каждого дня разницу с предыдущим для всех записей в наборе данных ..?
 mikebmassey29 окт. 2012 г., 01:34
@redShadow интересная мысль. Я не думал об этом так. Единственная проблема, которую я вижу, - как бы вы справились с выходными Торговых дней 252, а не 365. Если вы попытаетесь подняться на 1 день, а это выходные, функция не сработает. Хотя, я полагаю, вы могли бы добавить некоторую обработку ошибок в функцию ...
 mikebmassey29 окт. 2012 г., 01:39
Точно @redShadow. Строка за строкой, отличие от предыдущего дня. первая строка будет 0, так что я должен был бы разобраться с обработкой ошибок, но ...
 redShadow29 окт. 2012 г., 01:32
не будет достаточно просто найти строки для двух дат и вычислить разницу между ними ..?

Ответы на вопрос(2)

Решение Вопроса

Я думаю, что вы хотите сделать что-то вроде этого:

In [26]: data
Out[26]: 
           Date   Close  Adj Close
251  2011-01-03  147.48     143.25
250  2011-01-04  147.64     143.41
249  2011-01-05  147.05     142.83
248  2011-01-06  148.66     144.40
247  2011-01-07  147.93     143.69

In [27]: data.set_index('Date').diff()
Out[27]: 
            Close  Adj Close
Date                        
2011-01-03    NaN        NaN
2011-01-04   0.16       0.16
2011-01-05  -0.59      -0.58
2011-01-06   1.61       1.57
2011-01-07  -0.73      -0.71
 IcemanBerlin03 янв. 2014 г., 17:35
@Chang Она, что если я не хочу разницу, кроме фактической стоимости. то есть вместо diff (1) есть что-то вроде value (1) или value (1: 3) .mean (). Второй составленный пример получит среднее значение следующего, второго и третьего значения. Это было бы полезно
 JejeBelfort05 мая 2017 г., 12:07
Спасибо за ответ. Для тех, кто хочет n-дневную разницу, стоит упомянуть, что вы можете установить входной параметрperiods к п. Проверитьpandas.DataFrame.diff документация для более подробной информации:pandas.pydata.org/pandas-docs/stable/generated/... .
 Sean W.07 февр. 2014 г., 20:37
.shift () в пандах дает вам значения.
 greenafrican07 нояб. 2013 г., 13:41
Отлично, но как бы вы добавили это как новый столбец в данных?

тем не менее, я дам вам решение на чистом Python, которое может помочь, даже если вам нужно использовать pandas:

import csv
import urllib

# This basically retrieves the CSV files and loads it in a list, converting
# All numeric values to floats
url='http://ichart.finance.yahoo.com/table.csv?s=IBM&a=00&b=1&c=2011&d=11&e=31&f=2011&g=d&ignore=.csv'
reader = csv.reader(urllib.urlopen(url), delimiter=',')
# We sort the output list so the records are ordered by date
cleaned = sorted([[r[0]] + map(float, r[1:]) for r in list(reader)[1:]])

for i, row in enumerate(cleaned):  # enumerate() yields two-tuples: (<id>, <item>)
    # The try..except here is to skip the IndexError for line 0
    try:
        # This will calculate difference of each numeric field with the same field
        # in the row before this one
        print row[0], [(row[j] - cleaned[i-1][j]) for j in range(1, 7)]
    except IndexError:
        pass
 ruX14 нояб. 2016 г., 10:55
голосование вниз, поскольку оригинальный вопрос имеет тегpandas что напрямую указывает на то, как автор хочет решить свою проблему
 Phyo Arkar Lwin11 дек. 2014 г., 22:25
Этот хак не нужен, пожалуйста, изучите панд.
 jonathanrocher09 апр. 2015 г., 23:03
Понижение этого, потому что, в дополнение к воспроизведению того, что делают панды, это делается с помощью вложенных циклов for, что является медленным в Python. Панды сделают это на уровне C.
 redShadow14 нояб. 2016 г., 18:24
lol @ downvote полиция четыре года спустя ..: /
 Akshay08 июн. 2016 г., 01:10
upvote для показа альтернативных способов

Ваш ответ на вопрос