68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
# report.py
|
|
|
|
from . import fileparse
|
|
from .stock import Stock
|
|
from .portfolio import Portfolio
|
|
from . import tableformat
|
|
|
|
def read_portfolio(filename, **opts):
|
|
'''
|
|
Read a stock portfolio file into a list of dictionaries with keys
|
|
name, shares, and price.
|
|
'''
|
|
with open(filename) as lines:
|
|
return Portfolio.from_csv(lines, **opts)
|
|
|
|
def read_prices(filename, **opts):
|
|
'''
|
|
Read a CSV file of price data into a dict mapping names to prices.
|
|
'''
|
|
with open(filename) as lines:
|
|
return dict(fileparse.parse_csv(lines, types=[str,float], has_headers=False, **opts))
|
|
|
|
def make_report(portfolio, prices):
|
|
'''
|
|
Make a list of (name, shares, price, change) tuples given a portfolio list
|
|
and prices dictionary.
|
|
'''
|
|
rows = []
|
|
for s in portfolio:
|
|
current_price = prices[s.name]
|
|
change = current_price - s.price
|
|
summary = (s.name, s.shares, current_price, change)
|
|
rows.append(summary)
|
|
return rows
|
|
|
|
def print_report(reportdata, formatter):
|
|
'''
|
|
Print a nicely formated table from a list of (name, shares, price, change) tuples.
|
|
'''
|
|
formatter.headings(['Name','Shares','Price','Change'])
|
|
for name, shares, price, change in reportdata:
|
|
rowdata = [ name, str(shares), f'{price:0.2f}', f'{change:0.2f}' ]
|
|
formatter.row(rowdata)
|
|
|
|
def portfolio_report(portfoliofile, pricefile, fmt='txt'):
|
|
'''
|
|
Make a stock report given portfolio and price data files.
|
|
'''
|
|
# Read data files
|
|
portfolio = read_portfolio(portfoliofile)
|
|
prices = read_prices(pricefile)
|
|
|
|
# Create the report data
|
|
report = make_report(portfolio, prices)
|
|
|
|
# Print it out
|
|
formatter = tableformat.create_formatter(fmt)
|
|
print_report(report, formatter)
|
|
|
|
def main(args):
|
|
if len(args) != 4:
|
|
raise SystemExit('Usage: %s portfile pricefile format' % args[0])
|
|
portfolio_report(args[1], args[2], args[3])
|
|
|
|
if __name__ == '__main__':
|
|
import sys
|
|
main(sys.argv)
|