我对python很陌生,并试图学习如何使用dataframes。我读到使用股票数据是一个很好的项目来掌握他们。
所以我发现了一些从1990年到2010年的每日股票数据。每只股票有5列,
日期,开放价格,高价格,低价和收盘价
因此,我正在努力解决什么是最好的方式来组织数据。
假设我有多只股票的数据。最好是将它们合并成一个大的数据帧,还是将数据文件堆在一起呢?还是我错过了另一种方法?
发布于 2019-05-06 17:23:04
假设您有三个股票,名为S1、S2和S3,并且已经有了每个股票的数据框架:
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()方法。在交互式shell中进行探索性数据分析非常方便(也请参阅熊猫拆分-申请-组合用户指南)。
下面是一个例子,说明为什么场景3可以很好地同时计算股票的平均开盘价和收盘价(当然可以在其他情况下完成,只是不使用这种按组聚合的链)。
(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您也可以使用其他感兴趣的聚合函数按多列进行分组,也可以按日期等分组。
https://stackoverflow.com/questions/56008838
复制相似问题