Хранение данных временных рядов в python

У меня есть данные о ценах Amazon примерно на 8,5 тыс. продуктов за период с 1 февраля 2015 г. по 31 октября 2015 г. В настоящее время они представлены в виде словаря с ключом в виде количества дней с базовой даты и значением в виде новая цена, начиная с этого дня. Например, здесь цена составляет 10 долларов с 1-го дня и меняется на 15 долларов на 45-й день, а затем меняется на 9 долларов на 173-й день и после этого не меняется.

{1:10,
 45:15,
 .
 .
 .
 173:9}

Как лучше всего хранить такие временные ряды для удобства манипулирования с помощью python? Я хотел бы выполнить множество агрегаций, а также запрашивать цену на определенную дату. Наконец, я буду выполнять некоторые регрессии с фиксированным эффектом и не понимаю, как лучше всего хранить эти временные ряды, чтобы моя работа по программированию стала сравнительно проще. Я мог бы хранить как таблицу с 273 столбцами (каждый за день) и строками, соответствующими 8,5 тыс. продуктов. Я искал модуль pandas, который может помочь мне в этом, но есть ли лучший способ? Спасибо!


person harshal.c    schedule 09.11.2015    source источник
comment
панды в сочетании с numpy, вероятно, были бы хорошим вариантом.   -  person SirParselot    schedule 09.11.2015
comment
@SirParselot Я придерживался мнения, что сами панды по умолчанию в значительной степени полагаются на numpy, но есть ли конкретное использование numpy, которое вы видите здесь? Спасибо!   -  person harshal.c    schedule 09.11.2015
comment
Pandas часто использует numpy, а я нет, но это потому, что я действительно не знаю, что вы будете делать со своими данными. Я просто предположил, что вы будете делать много вычислений, а numpy оптимизирован для таких вещей.   -  person SirParselot    schedule 09.11.2015
comment
@harshal дайте некоторые подробности о списке названий продуктов   -  person WoodChopper    schedule 09.11.2015
comment
@WoodChopper Список названий продуктов — это просто идентификатор для каждого продукта, то есть 8,5 тыс. разных идентификаторов.   -  person harshal.c    schedule 10.11.2015


Ответы (2)


Вы можете использовать dict of dicts и преобразовать его в кадр данных pandas, а также использовать numpy для выполнения вычислений. Ваш первый ключ будет product, а внутренний dict будет тем, который у вас уже есть, но он не будет печатать в предложенном вами формате, но все, что вам нужно сделать, это перенести его, так что для быстрого примера

import pandas as pd

d = {'Product1': {1:10, 45:15, 173:9}, 'Product2': {1:11, 100:50, 173:10}}
df = pd.DataFrame(d).T
print df

          1    45   100  173
Product1   10   15  NaN    9
Product2   11  NaN   50   10
person SirParselot    schedule 09.11.2015
comment
Да, это то, что я имел в виду под таблицей, просто это будет чрезвычайно разреженная таблица, поскольку это не тот случай, когда цена каждого продукта меняется на 45-й день, все изменения цен на товары независимы, и я ожидаю такого рода кадра данных, чтобы получить 273 столбца (общее количество дней). Но все равно Спасибо! - person harshal.c; 09.11.2015
comment
@harshal.c Я обновил свой ответ, чтобы показать, что он может работать с отсутствующими данными. - person SirParselot; 09.11.2015

8,5 тыс. продуктов и 270+ дней. Я бы рекомендовал такой фреймворк данных,

price_dic = {1: 10, 2: 11, 3: 12, 5: 15}

df = pd.DataFrame({'days': pd.Series(price_dic.keys(),index=range(len(price_dic))),'price': pd.Series(price_dic.values(),index=range(len(price_dic)))})

df['prod_name'] = "Knote"

df
Out[80]: 
   days  price prod_name
0     1     10     Knote
1     2     11     Knote
2     3     12     Knote
3     5     15     Knote

df['Date'] = pd.to_datetime("Feb. 1, 2015") + pd.to_timedelta(df.days,'D')

df
Out[82]: 
   days  price prod_name       Date
0     1     10     Knote 2015-02-02
1     2     11     Knote 2015-02-03
2     3     12     Knote 2015-02-04
3     5     15     Knote 2015-02-06

Обновлять:

Просмотр списка и получение окончательного Dataframe со всем содержимым,

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

product_list = [1001,1002,1003]

y_dict = [{1: 10, 2: 11, 3: 12, 5: 15},
            {1: 10, 3: 11, 6: 12, 8: 15},
            {1: 90, 2: 100, 7: 120, 9: 100}]

start_dt_list = ['Feb 05 2015','Feb 01 2015','Feb 06 2015']

fdf = pd.DataFrame(columns =['P_ID','Date','Price','Days'])

Out[73]: 
Empty DataFrame
Columns: [P_ID, Date, Price, Days]
Index: []

for pid,j ,st_dt in zip(product_list, y_dict,start_dt_list):
    df = pd.DataFrame({'P_ID' : pd.Series([pid]*len(j)) ,
                    'Date' : pd.Series([pd.to_datetime(st_dt)]*len(j)),
                    'Price': pd.Series(j.values(),index=range(len(j))),
                    'Days': pd.Series(j.keys(),index=range(len(j)))
                    })
    fdf = fdf.append(df,ignore_index=True)


fdf.head(2)
Out[75]: 
        Date  Days  P_ID  Price
0 2015-02-05     1  1001     10
1 2015-02-05     2  1001     11

fdf['Date'] = fdf['Date'] + pd.to_timedelta(fdf.Days,'D')

fdf
Out[77]: 
         Date  Days  P_ID  Price
0  2015-02-06     1  1001     10
1  2015-02-07     2  1001     11
2  2015-02-08     3  1001     12
3  2015-02-10     5  1001     15
4  2015-02-09     8  1002     15
5  2015-02-02     1  1002     10
6  2015-02-04     3  1002     11
7  2015-02-07     6  1002     12
8  2015-02-07     1  1003     90
9  2015-02-08     2  1003    100
10 2015-02-15     9  1003    100
11 2015-02-13     7  1003    120
person WoodChopper    schedule 09.11.2015