0

当我打开雅虎财经的历史股票报价时,我想下载和操作一个 csv 文件。

简要了解 csv 文件的外观:

Date,Open,High,Low,Close,Volume,Adj Close
2012-11-30,691.31,699.22,685.69,698.37,3163600,698.37
2012-11-29,687.78,693.90,682.00,691.89,2776500,691.89
2012-11-28,668.01,684.91,663.89,683.67,3042000,683.67

我想创建一个代码来删除单词“open, High, Low, Close, Volume, Adj”和它下面的数据,并添加两个新列,给我:

Date        Close    [Insert new column here] [Another column]
2012-11-30  698.37      ---some data----       ---some data----
2012-11-29  691.89      ---some data----       ---some data----
2012-11-28  683.67      ---some data----       ---some data----

我是使用 Python 的初学者,所以我在编写这段代码时遇到了一些麻烦。如果有人可以帮助我,我将非常感激。

到目前为止,这就是我所拥有的,尽管它并没有按照我想要的方式工作。

def _download_url(url):
    response = None
    try:
        response = urllib.request.urlopen(url)
        content_bytes=response.read()
        content_string=content_bytes.decode(encoding='utf-8')
        data = io.StringIO(content_string)
        mycsv=csv.reader(data)
        for row in mycsv:
            if row:
                print(row[0],row[6])

这段代码打印出来(一瞥):

Date Adj Close
2012-11-30 698.37
2012-11-29 691.89
2012-11-28 683.67
2012-11-27 670.71

这是我想要的,但我想删除“Adj”并添加两个新列。谢谢你!

4

3 回答 3

0

DictReader我碰巧是in 类的忠实粉丝csv,因为它消除了解析csvs 的所有猜测(不再有索引!):

mycsv = csv.DictReader(data)
print('{:<11} {:<8} {:<12} {:<12}'.format('Date', 'Close', 'Col1', 'Col2'))
for row in mycsv:
    print('{:<11} {:<8} {:<12} {:<12}'.format(row['Date'], row['Adj Close'], '123', '456')

第一个print打印出标题行,第二个print打印出每一行(请注意,这DictReader将为您使用 CSV 中的标题行)。使用{:<11} {:<8} {:<12} {:<12}指定大小的整齐固定列格式化您的数据。

于 2013-02-16T06:46:32.820 回答
0

在创建之前data,调整content_string以删除“Adj”:

content_string=content_bytes.decode(encoding='utf-8')
content_string = content_string.replace('Adj ', '')
data = io.StringIO(content_string)

至于添加列,由您在print语句中执行。

于 2013-02-16T06:39:13.547 回答
0

如果您还没有对自己的设计感兴趣,我建议您查看pandas。它使这样的事情比其他方式容易得多。获取数据:

>>> from pandas.io.data import DataReader
>>> apple = DataReader("AAPL",  "yahoo")
>>> apple
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 786 entries, 2010-01-04 00:00:00 to 2013-02-15 00:00:00
Data columns:
Open         786  non-null values
High         786  non-null values
Low          786  non-null values
Close        786  non-null values
Volume       786  non-null values
Adj Close    786  non-null values
dtypes: float64(5), int64(1)
>>> apple[:5]
              Open    High     Low   Close    Volume  Adj Close
Date                                                           
2010-01-04  213.43  214.50  212.38  214.01  17633200     210.90
2010-01-05  214.60  215.59  213.25  214.38  21496600     211.26
2010-01-06  214.38  215.23  210.75  210.97  19720000     207.90
2010-01-07  211.75  212.00  209.05  210.58  17040400     207.52
2010-01-08  210.30  212.00  209.06  211.98  15986100     208.90

添加新列:

>>> apple["new_column"] = apple["Open"]/apple["Volume"]**0.3 + 5
>>> apple[:5]
              Open    High     Low   Close    Volume  Adj Close  new_column
Date                                                                       
2010-01-04  213.43  214.50  212.38  214.01  17633200     210.90    6.430066
2010-01-05  214.60  215.59  213.25  214.38  21496600     211.26    6.354936
2010-01-06  214.38  215.23  210.75  210.97  19720000     207.90    6.389032
2010-01-07  211.75  212.00  209.05  210.58  17040400     207.52    6.433440
2010-01-08  210.30  212.00  209.06  211.98  15986100     208.90    6.451164

只选择我们想要的列:

>>> new = apple[["Close", "new_column"]]
>>> new[:5]
             Close  new_column
Date                          
2010-01-04  214.01    6.430066
2010-01-05  214.38    6.354936
2010-01-06  210.97    6.389032
2010-01-07  210.58    6.433440
2010-01-08  211.98    6.451164

等等。

于 2013-02-18T19:27:40.040 回答