【问题标题】:best way to organise multiple dataframes组织多个数据框的最佳方法
【发布时间】:2019-09-24 07:18:02
【问题描述】:

我是 python 新手,正在尝试学习如何使用数据框。我读到使用股票数据是一个很好的项目来掌握它们。

所以我找到了一些从 1990 年到 2010 年的每日股票数据。每只股票有 5 列,

日期、开盘价、最高价、最低价和收盘价

所以我正在尝试研究组织数据的最佳方式。

假设我有多只股票的数据。最好将它们全部合并到一个大数据框中还是将数据框堆叠在一起?还是我缺少另一种方法?

【问题讨论】:

  • 你打算如何保存它?在 sql DB 中?
  • 保存在dict :-) 我通常做的,如果你想做一些时间序列ana,只要pd.concat(d),你就会有一个多索引数据框,然后'跨度>
  • 取决于你想用它做什么。我可以想象使用pd.concat 将它们附加到axis=0 之上,因此彼此叠加,同时添加一个名为stock 的新列,它指示每行属于哪个股票。
  • MultiIndex of (Stock, Date) 看起来很自然,如果你有记忆的话。
  • @mHelpMe 那么您可以只使用to_sqlappend 吗?您已经有了可以在以后过滤任何连接的日期(例如,拉出最新记录的最大日期)

标签: python pandas dataframe


【解决方案1】:

假设您有三只股票,分别名为 S1S2S3,并且 每个都有一个数据框:

import pandas as pd

## create some fake data in format described by OP... 
stock_names = ['S1', 'S2', 'S3']

df1 = pd.DataFrame({
  'date': ['2019-05-05', '2019-05-06'],
  'openp': [100, 110], 'highp': [115, 120], 
  'lowp': [100, 105], 'closep': [110, 120]
})
df2 = pd.DataFrame({
  'date': ['2019-05-05', '2019-05-06'],
  'openp': [110, 120], 'highp': [125, 130], 
  'lowp': [110, 115], 'closep': [120, 130]
})
df3 = pd.DataFrame({
  'date': ['2019-05-05', '2019-05-06'],
  'openp': [120, 130], 'highp': [135, 140], 
  'lowp': [120, 125], 'closep': [130, 140]
})

这里有几种存储数据的方法(包括 OP 提到的两种)。

## scenario 1: store the dfs in a list that you can iterate over 
##             (can only access stocks by index, not name) 
df_list = [df1, df2, df3]


## scenario 2: dict of data frames -- just a better version of scenario 1 
##             (access a stock by its name, e.g. `df_dict['S1']`) 
df_dict = dict(zip(stock_names, [df1, df2, df3]))


## scenario 3: single data frame, with 'stock' field to track where rows came from. 
##             (nice bc you can do grouped aggregations easily)
stacked_df = pd.concat(
  [df.assign(stock = stock) for df, stock in zip(df_list, stock_names)])

根据我的经验,场景 3 通常(但不总是!)最好使用, 因为它与pd.DataFrame.groupby()pd.DataFrame.aggregate() 方法配合得很好。如果您在交互式外壳中进行探索性数据分析,则非常方便(另请参阅the pandas split-apply-combine user guide)。

这里有一个例子说明为什么场景 3 可以很好——直接同时计算每只股票的平均开盘价和收盘价(当然可以在其他场景中完成,只是不使用这种 groupby-aggregate 链)。

(stacked_df
  .groupby(['stock'])
  .aggregate({'openp': pd.np.mean, 'closep': pd.np.mean}))

##        openp  closep
## stock       
## S1       105     115
## S2       115     125
## S3       125     135

您也可以使用其他感兴趣的聚合函数按多列分组,或按日期分组等。

【讨论】:

  • pd.concat 接受一个 keys 参数,所以你可以这样做:pd.concat([df.set_index('date') for df in df_list], keys=stock_names)
  • 确实,好点子!我怀疑它也更有效率。 imo 生成的 MultiIndex 可能有点令人困惑(股票名称是行索引而不是列的一部分)——尽管这主要是个人喜好问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2011-06-16
相关资源
最近更新 更多