【问题标题】:Add new column based on a list and sort date by newest根据列表添加新列并按最新排序日期
【发布时间】:2015-01-29 18:32:16
【问题描述】:

我是使用 python 编写代码的初学者。

我使用 Pandas 和他的 DataReader 编写了这个简单的脚本来从 yahoo Finance 检索多个股票结果:

import pandas as pd
from pandas.io.data import DataReader
from pandas import DataFrame

symbols_list = ['AAPL', 'TSLA', 'YHOO','GOOG', 'MSFT','GILD']

for ticker in symbols_list: 
r = DataReader(ticker, "yahoo", '2015-01-20')
cell= r[['Open','High','Low','Adj Close','Volume']]

print cell

使用此代码,我获得价格股票的日期+我在“cell= r[[....”中指定的其他列,如下所示:

                      Open    High     Low  Adj Close    Volume
         Date                                                   
         2015-01-20  107.84  108.97  106.50     108.72  49899900
         2015-01-21  108.95  111.06  108.27     109.55  48575900
         2015-01-22  110.26  112.47  109.72     112.40  53796400
         2015-01-23  112.30  113.75  111.53     112.98  46464800
         2015-01-26  113.74  114.36  112.80     113.10  55375900
                       Open    High     Low  Adj Close   Volume
         Date                                                  
         2015-01-20  193.87  194.12  187.04     191.93  4489400
         2015-01-21  189.55  198.68  189.51     196.57  4144000
         2015-01-22  197.00  203.24  195.20     201.62  4094100
         2015-01-23  200.29  203.50  198.33     201.29  3438600
         2015-01-26  201.83  208.62  201.05     206.55  3224500

我的问题是:如何在列中包含我在 symbol_list 中指定的代码? 最后一件事:我怎样才能颠倒日期的顺序?我希望它首先显示最新的(在我的示例中为 2015-01-26)。 下面我向您展示了一个我想要获得的示例(股票名称作为第一列,日期顺序倒置)

  TSLA 2015-01-26 201.83 208.62 201.05 206.55 3224500
  TSLA 2015-01-23 200.29 203.50 198.33 201.29 3438600
  TSLA 2015-01-22 197.00 203.24 195.20 201.62 4094100
  TSLA,2015-01-21 189.55 198.68 189.51 196.57 4144000
  TSLA 2015-01-20 193.87 194.12 187.04 191.93 4489400

  AAPL 2015-01-26 113.74 114.36 112.80 113.10 55375900
  AAPL 2015-01-23 112.30 113.75 111.53 112.98 46464800
  AAPL 2015-01-22 110.26 112.47 109.72 112.40 53796400
  AAPL 2015-01-21 108.95 111.06 108.27 109.55 48575900
  AAPL 2015-01-20 107.84 108.97 106.50 108.72 49899900

我尝试了一些在论坛上创建的东西,但都没有给我任何结果。 谢谢大家的考虑,希望有人能帮我解决这两个问题。

【问题讨论】:

  • 那么是在问如何拥有一个包含所有股票数据的 df?还是所有股票数据的字典?或者你可能想要一个panel

标签: python pandas


【解决方案1】:

更新代码已完成

在@EdChum 的宝贵帮助下,我已经完成了我的代码,并且我在这篇文章中的要求已经完全满足(再次感谢您的大力帮助)。 获取多个股票价格、一组列 + 股票代码以及反转日期(和股票代码)顺序的最终代码如下所示:

import datetime
import pandas as pd
from pandas import DataFrame
from pandas.io.data import DataReader
symbols_list = ['AAPL', 'TSLA', 'YHOO','GOOG', 'MSFT','ALTR','WDC','KLAC']

symbols=[]
for ticker in symbols_list: 
    r = DataReader(ticker, "yahoo", 
                   start=datetime.datetime(2014, 12, 30))
    # add a symbol column
    r['Symbol'] = ticker 
    symbols.append(r)
# concatenate all the dfs
df = pd.concat(symbols)
#define cell with the columns that i need
cell= df[['Symbol','Open','High','Low','Adj Close','Volume']]
#changing sort of Symbol (ascending) and Date(descending) setting Symbol as first column and changing date format
cell.reset_index().sort(['Symbol', 'Date'], ascending=[1,0]).set_index('Symbol').to_csv('stock.csv', date_format='%d/%m/%Y')

希望此代码对其他用户有所帮助。

【讨论】:

  • 很高兴为您提供帮助
  • 你知道为什么会这样吗:error: after 3 tries, Yahoo! did not return a 200 for url 'http://ichart.finance.yahoo.com/table.csv?s=GOOG&a=11&b=30&c=2014&d=2&e=27&f=2015&g=d&ignore=.csv'
  • 也许这会解决你的问题:stackoverflow.com/questions/23642194/…
【解决方案2】:

我想我明白你想要什么,我会将每个 df 附加到一个列表中并使用 concat 制作一个 df,对于每个 df,我们只需为每个符号添加一个新列:

In [54]:

from pandas.io.data import DataReader
symbols_list = ['AAPL', 'TSLA', 'YHOO','GOOG', 'MSFT','GILD']

symbols=[]
for ticker in symbols_list: 
    r = DataReader(ticker, "yahoo", '2015-01-20')
    # add a symbol column
    r['Symbol'] = ticker
    symbols.append(r)
# concatenate all the dfs
df = pd.concat(symbols)
df.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 30 entries, 2015-01-20 00:00:00 to 2015-01-26 00:00:00
Data columns (total 7 columns):
Open         30 non-null float64
High         30 non-null float64
Low          30 non-null float64
Close        30 non-null float64
Volume       30 non-null int64
Adj Close    30 non-null float64
Symbol       30 non-null object
dtypes: float64(5), int64(1), object(1)
memory usage: 1.9+ KB
In [55]:

df
Out[55]:
              Open    High     Low   Close    Volume  Adj Close Symbol
Date                                                                  
2015-01-20  107.84  108.97  106.50  108.72  49899900     108.72   AAPL
2015-01-21  108.95  111.06  108.27  109.55  48575900     109.55   AAPL
2015-01-22  110.26  112.47  109.72  112.40  53796400     112.40   AAPL
2015-01-23  112.30  113.75  111.53  112.98  46464800     112.98   AAPL
2015-01-26  113.74  114.36  112.80  113.10  55375900     113.10   AAPL
2015-01-20  193.87  194.12  187.04  191.93   4503200     191.93   TSLA
2015-01-21  189.55  198.68  189.51  196.57   4153000     196.57   TSLA
2015-01-22  197.00  203.24  195.20  201.62   4094100     201.62   TSLA
2015-01-23  200.29  203.50  198.33  201.29   3438600     201.29   TSLA
2015-01-26  201.83  208.62  201.05  206.55   3224500     206.55   TSLA
2015-01-20   46.79   47.89   46.77   47.63  15845900      47.63   YHOO
2015-01-21   47.60   48.38   47.32   48.18  16305100      48.18   YHOO
2015-01-22   48.43   49.08   48.01   48.89  12647400      48.89   YHOO
2015-01-23   48.74   49.23   48.63   48.95  14206100      48.95   YHOO
2015-01-26   49.57   49.79   49.07   49.44  18928700      49.44   YHOO
2015-01-20  511.00  512.50  506.02  506.90   2221800     506.90   GOOG
2015-01-21  507.25  519.28  506.20  518.04   2262500     518.04   GOOG
2015-01-22  521.48  536.33  519.70  534.39   2653600     534.39   GOOG
2015-01-23  535.59  542.17  533.00  539.95   2266800     539.95   GOOG
2015-01-26  538.53  539.00  529.67  535.21   1532400     535.21   GOOG
2015-01-20   46.30   46.65   45.57   46.39  36161900      46.39   MSFT
2015-01-21   45.94   46.14   45.48   45.92  39081100      45.92   MSFT
2015-01-22   46.38   47.14   46.08   47.13  35898000      47.13   MSFT
2015-01-23   47.36   47.39   46.80   47.18  26211600      47.18   MSFT
2015-01-26   47.00   47.13   46.24   47.01  39577800      47.01   MSFT
2015-01-20  101.14  104.05  100.15  103.78  18838100     103.78   GILD
2015-01-21  103.04  105.07  102.57  103.58  12312500     103.58   GILD
2015-01-22  104.14  105.18  101.56  105.14  12963100     105.14   GILD
2015-01-23  104.40  106.11  103.80  105.54   9566700     105.54   GILD
2015-01-26  104.87  107.77  104.87  107.11  10254600     107.11   GILD

度假村致电sort 并传递ascending=False

In [56]:

df.sort(ascending=False)
Out[56]:
              Open    High     Low   Close    Volume  Adj Close Symbol
Date                                                                  
2015-01-26  104.87  107.77  104.87  107.11  10254600     107.11   GILD
2015-01-26  201.83  208.62  201.05  206.55   3224500     206.55   TSLA
2015-01-26  538.53  539.00  529.67  535.21   1532400     535.21   GOOG
2015-01-26   49.57   49.79   49.07   49.44  18928700      49.44   YHOO
2015-01-26   47.00   47.13   46.24   47.01  39577800      47.01   MSFT
2015-01-26  113.74  114.36  112.80  113.10  55375900     113.10   AAPL
2015-01-23  104.40  106.11  103.80  105.54   9566700     105.54   GILD
2015-01-23   47.36   47.39   46.80   47.18  26211600      47.18   MSFT
2015-01-23  200.29  203.50  198.33  201.29   3438600     201.29   TSLA
2015-01-23  535.59  542.17  533.00  539.95   2266800     539.95   GOOG
2015-01-23   48.74   49.23   48.63   48.95  14206100      48.95   YHOO
2015-01-23  112.30  113.75  111.53  112.98  46464800     112.98   AAPL
2015-01-22  521.48  536.33  519.70  534.39   2653600     534.39   GOOG
2015-01-22   46.38   47.14   46.08   47.13  35898000      47.13   MSFT
2015-01-22  110.26  112.47  109.72  112.40  53796400     112.40   AAPL
2015-01-22   48.43   49.08   48.01   48.89  12647400      48.89   YHOO
2015-01-22  104.14  105.18  101.56  105.14  12963100     105.14   GILD
2015-01-22  197.00  203.24  195.20  201.62   4094100     201.62   TSLA
2015-01-21  507.25  519.28  506.20  518.04   2262500     518.04   GOOG
2015-01-21  189.55  198.68  189.51  196.57   4153000     196.57   TSLA
2015-01-21   47.60   48.38   47.32   48.18  16305100      48.18   YHOO
2015-01-21  103.04  105.07  102.57  103.58  12312500     103.58   GILD
2015-01-21   45.94   46.14   45.48   45.92  39081100      45.92   MSFT
2015-01-21  108.95  111.06  108.27  109.55  48575900     109.55   AAPL
2015-01-20  101.14  104.05  100.15  103.78  18838100     103.78   GILD
2015-01-20  107.84  108.97  106.50  108.72  49899900     108.72   AAPL
2015-01-20   46.30   46.65   45.57   46.39  36161900      46.39   MSFT
2015-01-20   46.79   47.89   46.77   47.63  15845900      47.63   YHOO
2015-01-20  193.87  194.12  187.04  191.93   4503200     191.93   TSLA
2015-01-20  511.00  512.50  506.02  506.90   2221800     506.90   GOOG

更新

如果您想保留股票代码分组,然后按日期排序,则需要以下内容。在这里,我必须重置索引,以便“日期”再次成为常规列,然后传递它将按该顺序处理的列列表,最后我必须再次设置索引:

In [44]:

df.reset_index().sort(['Symbol', 'Date'], ascending=False).set_index('Date')
Out[44]:
              Open    High     Low   Close     Volume  Adj Close Symbol
Date                                                                   
2015-01-27   49.14   49.28   47.66   47.99   44813600      47.99   YHOO
2015-01-26   49.57   49.79   49.07   49.44   18928700      49.44   YHOO
2015-01-23   48.74   49.23   48.63   48.95   14206100      48.95   YHOO
2015-01-22   48.43   49.08   48.01   48.89   12647400      48.89   YHOO
2015-01-21   47.60   48.38   47.32   48.18   16305100      48.18   YHOO
2015-01-20   46.79   47.89   46.77   47.63   15845900      47.63   YHOO
2015-01-27  204.42  208.03  203.30  205.98    2777700     205.98   TSLA
2015-01-26  201.83  208.62  201.05  206.55    3224500     206.55   TSLA
2015-01-23  200.29  203.50  198.33  201.29    3438600     201.29   TSLA
2015-01-22  197.00  203.24  195.20  201.62    4094100     201.62   TSLA
2015-01-21  189.55  198.68  189.51  196.57    4153000     196.57   TSLA
2015-01-20  193.87  194.12  187.04  191.93    4503200     191.93   TSLA
2015-01-27   42.95   43.20   42.11   42.66  169112700      42.66   MSFT
2015-01-26   47.00   47.13   46.24   47.01   42525500      47.01   MSFT
2015-01-23   47.36   47.39   46.80   47.18   26211600      47.18   MSFT
2015-01-22   46.38   47.14   46.08   47.13   35898000      47.13   MSFT
2015-01-21   45.94   46.14   45.48   45.92   39081100      45.92   MSFT
2015-01-20   46.30   46.65   45.57   46.39   36161900      46.39   MSFT
2015-01-27  529.97  530.70  518.19  518.63    1897300     518.63   GOOG
2015-01-26  538.53  539.00  529.67  535.21    1532400     535.21   GOOG
2015-01-23  535.59  542.17  533.00  539.95    2266800     539.95   GOOG
2015-01-22  521.48  536.33  519.70  534.39    2653600     534.39   GOOG
2015-01-21  507.25  519.28  506.20  518.04    2262500     518.04   GOOG
2015-01-20  511.00  512.50  506.02  506.90    2221800     506.90   GOOG
2015-01-27  105.94  107.02  104.86  105.03   10334500     105.03   GILD
2015-01-26  104.87  107.77  104.87  107.11   10254600     107.11   GILD
2015-01-23  104.40  106.11  103.80  105.54    9566700     105.54   GILD
2015-01-22  104.14  105.18  101.56  105.14   12963100     105.14   GILD
2015-01-21  103.04  105.07  102.57  103.58   12312500     103.58   GILD
2015-01-20  101.14  104.05  100.15  103.78   18838100     103.78   GILD
2015-01-27  112.42  112.48  109.03  109.14   91929200     109.14   AAPL
2015-01-26  113.74  114.36  112.80  113.10   55615000     113.10   AAPL
2015-01-23  112.30  113.75  111.53  112.98   46464800     112.98   AAPL
2015-01-22  110.26  112.47  109.72  112.40   53796400     112.40   AAPL
2015-01-21  108.95  111.06  108.27  109.55   48575900     109.55   AAPL
2015-01-20  107.84  108.97  106.50  108.72   49899900     108.72   AAPL

【讨论】:

  • 是的,这正是我想做的:但是当我粘贴你的代码并尝试它时,我得到了这个结果:文件“”,第 15 行 ^ SyntaxError: invalid syntax 为什么?我正在使用你的指令,我正在使用 pandas 0.15.1
  • 这一行&lt;class 'pandas.core.frame.DataFrame'&gt;不是代码,它是df.info()的输出所以忽略它,代码的关键位是:symbols=[] for ticker in symbols_list: r = DataReader(ticker, "yahoo", '2015-01-20') # add a symbol column r['Symbol'] = ticker symbols.append(r) # concatenate all the dfs df = pd.concat(symbols)df.sort(ascending=False)
  • 真是个白痴:它现在工作得很好,我真的很抱歉。一个问题:为什么当我写 df.sort(ascending=False) 时,程序不仅会反转日期的顺序,还会创建一组代码?当您在排序之前发布代码(升序 = false)时,程序有一个我需要的顺序(AAPL、AAPL 等等......)。但是在那行代码之后,符号列表不是按股票代码分组的,而是按日期分组的。 (GILD、TSLA、GOOG、YHOO等...不按股票代码分组)
  • @Andrea 如果您想按代码名称排序,然后按日期排序,您可以像这样传递多个列:df.sort(['Symbol', df.index], ascending=False) 我认为应该可以,
  • @Andrea 我已经更新了我的答案以满足您的最后一个要求
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2015-07-20
  • 2012-02-09
  • 2018-03-31
  • 2019-09-25
  • 2015-08-12
相关资源
最近更新 更多