Подтвердить что ты не робот

Вычисление разницы между двумя строками в 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, чтобы обновить dataframe со значением.

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

4b9b3361

Ответ 1

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

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

Ответ 2

Я не знаю pandas, и я уверен, что у него есть что-то конкретное для этого; однако я дам вам решение pure-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