2015-11-09 2 views
4

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

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

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

+1

панды в сочетании с NumPy, вероятно, будет хорошим вариантом. – SirParselot

+0

@SirParselot Я считал, что панды сами по себе полагаются на numpy по умолчанию, но есть ли конкретное использование numpy, которое вы видите здесь? Благодаря! –

+0

Pandas много использует numpy, но нет, но это потому, что я не знаю, что вы будете делать с вашими данными. Я просто предположил, что вы будете делать множество вычислений, а numpy оптимизирован для такого рода вещей. – SirParselot

ответ

3

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

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 
+0

Да, это то, что я имел в виду под столом, просто потому, что это будет очень редкая таблица, так как это не так, что цена каждого продукта меняется на 45-й день, все изменения цен на продукцию независимы, и я ожидаю, что это сортировать данные, чтобы в итоге получилось 273 столбца (общее количество дней). Но спасибо несметным! –

+0

@ harshal.c Я обновил свой ответ, чтобы показать, что он может справиться с отсутствующими данными. – SirParselot

1

8.5k продукты и 270+ дни я рекомендовал бы dataframe таким образом,

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 

Update:

список Treversing и получить окончательный dataframe со всем содержанием,

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

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 
+0

Спасибо за подробный ответ, с кодом! –

Смежные вопросы