Skip to content

Commit

Permalink
Add option to save portfolio to csv (#54)
Browse files Browse the repository at this point in the history
* Add option to save portfolio to csv
- add portfolio_to_csv method to Portfolio class
- extend argument parsing with path option for saving csv
- portfolio_to_csv executes after get() method when path for saving csv is provided

* use output_path only in csv function
* rm whitespace

---------

Co-authored-by: marzzzello <[email protected]>
  • Loading branch information
tilidev and marzzzello authored Mar 21, 2024
1 parent 4e3f141 commit dc3b72d
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
10 changes: 8 additions & 2 deletions pytr/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,13 +94,16 @@ def formatter(prog):
parser_dl_docs.add_argument('--universal', help='Platform independent file names', action='store_true')
# portfolio
info = 'Show current portfolio'
parser_cmd.add_parser(
parser_portfolio = parser_cmd.add_parser(
'portfolio',
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
parents=[parser_login_args],
help=info,
description=info,
)
parser_portfolio.add_argument(
'-o', '--output', help='Output path of CSV file', metavar='OUTPUT', type=Path
)
# details
info = 'Get details for an ISIN'
parser_details = parser_cmd.add_parser(
Expand Down Expand Up @@ -214,7 +217,10 @@ def main():
elif args.command == 'details':
Details(login(phone_no=args.phone_no, pin=args.pin, web=not args.applogin), args.isin).get()
elif args.command == 'portfolio':
Portfolio(login(phone_no=args.phone_no, pin=args.pin, web=not args.applogin)).get()
p = Portfolio(login(phone_no=args.phone_no, pin=args.pin, web=not args.applogin), args.output)
p.get()
if args.output is not None:
p.portfolio_to_csv()
elif args.command == 'export_transactions':
export_transactions(args.input, args.output, args.lang)
elif args.version:
Expand Down
14 changes: 14 additions & 0 deletions pytr/portfolio.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,20 @@ async def portfolio_loop(self):
else:
print(f"unmatched subscription of type '{subscription['type']}':\n{preview(response)}")

def portfolio_to_csv(self, output_path):
positions = self.portfolio['positions']
csv_lines = []
for pos in sorted(positions, key=lambda x: x['netSize'], reverse=True):
csv_lines.append(
f"{pos['name']};{pos['instrumentId']};{float(pos['averageBuyIn']):.2f};{float(pos['netValue']):.2f}"
)

with open(output_path, 'w', encoding='utf-8') as f:
f.write('Name;ISIN;avgCost;netValue\n')
f.write('\n'.join(csv_lines))

print(f'Wrote {len(csv_lines) + 1} lines to {self.output_path}')

def overview(self):
# for x in ['netValue', 'unrealisedProfit', 'unrealisedProfitPercent', 'unrealisedCost']:
# print(f'{x:24}: {self.portfolio[x]:>10.2f}')
Expand Down

0 comments on commit dc3b72d

Please sign in to comment.