在 python 中存储时间序列数据
Storage of timeseries data in python
我有从 2015 年 2 月 1 日到 2015 年 10 月 31 日期间大约 8.5k 产品的亚马逊价格数据。目前,它采用字典形式,键为从基准日期和价值作为从那天开始的新价格。例如,这里的价格从第 1 天开始为 10 美元,在第 45 天变为 15 美元,然后在第 173 天变为 9 美元,之后没有变化。
{1:10,
45:15,
.
.
.
173:9}
存储此类时间序列以便使用 python 轻松操作的最佳方法是什么?我想执行大量聚合,也想查询特定日期的价格。最后,我将执行一些固定效应回归并且对什么是存储这个时间序列的最佳方式感到困惑,这样我的编程工作就变得相对简单了。我可以存储为 table,其中包含 273 列(每列代表一天)和对应于 8.5k 产品的行。我一直在寻找可以帮助我做到这一点的 pandas 模块,但是有更好的方法吗?谢谢!
您可以使用字典中的字典并将其转换为 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
8.5k 产品和 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
我有从 2015 年 2 月 1 日到 2015 年 10 月 31 日期间大约 8.5k 产品的亚马逊价格数据。目前,它采用字典形式,键为从基准日期和价值作为从那天开始的新价格。例如,这里的价格从第 1 天开始为 10 美元,在第 45 天变为 15 美元,然后在第 173 天变为 9 美元,之后没有变化。
{1:10,
45:15,
.
.
.
173:9}
存储此类时间序列以便使用 python 轻松操作的最佳方法是什么?我想执行大量聚合,也想查询特定日期的价格。最后,我将执行一些固定效应回归并且对什么是存储这个时间序列的最佳方式感到困惑,这样我的编程工作就变得相对简单了。我可以存储为 table,其中包含 273 列(每列代表一天)和对应于 8.5k 产品的行。我一直在寻找可以帮助我做到这一点的 pandas 模块,但是有更好的方法吗?谢谢!
您可以使用字典中的字典并将其转换为 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
8.5k 产品和 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