简体   繁体   English

python雅虎财务格式

[英]python yahoo finance format

so I did this: 所以我这样做了:

def get_quotes(ticker:str, start_date:datetime.date, end_date:datetime.date)->list:
'''Downloads the quotes from Yahoo finance'''


start_month = str(start_date.month-1)
start_day   = str(start_date.day)
start_year  = str(start_date.year)

end_month   = str(end_date.month-1)
end_day     = str(end_date.day)
end_year    = str(end_date.year)

try:
    list = []
    quote = 'http://ichart.yahoo.com/table.csv?s='+ticker+'&a'+start_month+'&b='+start_day+"&c="+start_year+'&d='+end_month+'&e='+ end_day +'&f='+end_year+'&g=d'
    response = urllib.request.urlopen(quote) 
    data = response.read()
    string_data = data.decode(encoding='utf-8')
    lines = string_data.splitlines()
    for x in lines:
        data = [y for y in x.split(',')]
        list.append(data[0:5])
    return list

except URLError:
    print('Page not found! Please enter a valid ticker')

But the resulting list is: [['Date', 'Open', 'High', 'Low', 'Close'], ['2011-10-10', '26.58', '26.97', '26.47', 但结果列表是:[['日期','开放','高','低','关闭'],['2011-10-10','26 .58','26 .97','26 .47',
'26.94'], ['2011-10-07', '26.34', '26.51', '26.20', '26.25'], ['2011-10-06', '25.90', '26.40', '25.70', '26.34']] '26 .94'],['2011-10-07','26 .34','26 .51','26 .20','26 .25'],['2011-10-06','25 .90','26 .40','25 .70 ','26 .34']]

when it should be: ['Date', 'Open', 'High', 'Low', 'Close'], ['2011-10-10', '26.58', '26.97', '26.47', '26.94'], ['2011-10-07', '26.34', '26.51', '26.20', '26.25'], ['2011-10-06', '25.90', '26.40', '25.70', '26.34'] 它应该是:['日期','开放','高','低','关闭'],['2011-10-10','26 .58','26 .97','26 .47','26 .94 '',['2011-10-07','26 .34','26 .51','26 .20','26 .25'],['2011-10-06','25 .90','26 .40','25 .70', '26 0.34' ]

Can i eliminate the double list somehow? 我能以某种方式消除双重名单吗?

Is this what you're looking for? 这是你在找什么?

rows = ['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', '2012-11-27,660.17,675.00,658.00,670.71,2508700,670.71']

def format_rows(rows, gap):
    split_rows = [row.split(',') for row in rows]
    # Splits each row up, by comma
    column_lengths = [max(col_len) for col_len in zip(*[map(len, row) for row in split_rows])]
    # Finds the maximum size of each column

    for row in split_rows:
        col_lengths = zip(row, column_lengths)
        print ''.join(col.ljust(col_length + gap, ' ') for (col, col_length) in col_lengths)
        # Prints out the data, making sure there's a minimum of "gap" spaces 
        # between each column

Doing format_rows(rows, 4) will result in the following table being printed out, with a gap of 4 spaces between each column: 执行format_rows(rows, 4)将导致打印出下表,每列之间有4个空格:

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
2012-11-27    660.17    675.00    658.00    670.71    2508700    670.71

You can modify the code so it returns a string instead by doing this: 您可以修改代码,以便通过执行以下操作返回字符串:

def format_rows(rows, gap):
    split_rows = [row.split(',') for row in rows]
    # Splits each row up, by comma
    column_lengths = [max(col_len) for col_len in zip(*[map(len, row) for row in split_rows])]
    # Finds the maximum size of each column

    output = []
    for row in split_rows:
        col_lengths = zip(row, column_lengths)
        output.append(''.join(col.ljust(col_length + gap, ' ') for (col, col_length) in col_lengths))
    return '\n'.join(output)

Edit: 编辑:

If you want to only include the first n rows, you could use the below function and call format_rows(rows, 4, 5) . 如果只想包含前n行,可以使用下面的函数并调用format_rows(rows, 4, 5) In essence, we're truncating each row to the first five before printing it. 实质上,我们在打印之前将每一行截断为前五行。

def format_rows(rows, gap, limit):
    split_rows = [row.split(',') for row in rows]
    # Splits each row up, by comma
    column_lengths = [max(col_len) for col_len in zip(*[map(len, row) for row in split_rows])]
    # Finds the maximum size of each column

    for row in split_rows:
        col_lengths = zip(row, column_lengths)[:limit]
        # Prints out only the first `limit` columns

        print ''.join(col.ljust(col_length + gap, ' ') for (col, col_length) in col_lengths)
        # Prints out the data, making sure there's a minimum of "gap" spaces 
        # between each column

With this you can easily customize the appearance, even though it's "less automatic" than Michael's solution: 有了这个,您可以轻松自定义外观,即使它比迈克尔的解决方案“更不自动”:

lines = [x.split(',') for x in a]
for line in lines:
    print "{0[0]:<10} {0[1]:<6} {0[2]:<6} {0[3]:<6} {0[4]:<6} {0[5]:<7} {0[6]:<6}".format(line)

Result: 结果:

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

Want to display the first columnn centered, all the others right aligned, a large gap in the last one and omit the open column? 想要显示第一列中心,所有其他列右对齐,最后一列中的大间隙并省略打开列? just a minor change to the format string: 只是对格式字符串的一个小改动:
"{0[0]:^10} {0[2]:>6} {0[3]:>6} {0[4]:>6} {0[5]:>7} {0[6]:>12}"
(See the format string syntax ) (参见格式字符串语法

And you get: 你得到:

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

There are really many ways to do this if you just want your output to look pretty then as the two responses have pointed out you can do that quite easily. 如果您只是希望输出看起来很漂亮,那么有很多方法可以做到这一点,因为两个响应已经指出您可以很容易地做到这一点。 If you just want a generality then your code as everything it needs you'd just have to 如果你只是想要一般性,那么你的代码就像它需要的一切你只需要

for x in lines:
    print x

However if you want to generate a list of lines you'd have to do the following: 但是,如果要生成行列表,则必须执行以下操作:

lst = []

for x in lines:
    data = [y for y in x.split(',')]
    lst.append(data)

for x in lst:
    print x

['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']
['2012-11-27', '660.17', '675.00', '658.00', '670.71', '2508700', '670.71']
['2012-11-26', '666.44', '667.00', '659.02', '661.15', '2204600', '661.15']
['2012-11-23', '669.97', '670.00', '666.10', '667.97', '922500', '667.97']

but for simple pretty output you get you get rid of the date, open line and do this: 但是对于简单漂亮的输出你可以让你摆脱日期,打开线并执行此操作:

print('Date         Open     High     Low      Closee    Volume     Adj Close')
del lines[0]
for x in lines:
    data = [y for y in x.split(',')]
    print("{0}   {1}   {2}   {3}   {4}   {5}    {6}".format(*data))

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
2012-11-27   660.17   675.00   658.00   670.71   2508700    670.71
2012-11-26   666.44   667.00   659.02   661.15   2204600    661.15

Hope this helps. 希望这可以帮助。 Though LeartS has his formatting far better best practice style. 虽然LeartS的格式远远好于最好的练习风格。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM