Git Product home page Git Product logo

poe-currency-flip-planner's People

Contributors

1480c1 avatar dependabot-preview[bot] avatar dependabot[bot] avatar github-actions[bot] avatar ikelso avatar imgbotapp avatar maximumstock avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

poe-currency-flip-planner's Issues

How does it work?

So just found this and i have no idea at all how to use it. I never used Python and and step by step or video guide would help.

Datamine average lifetime of offers

Third party trading sites like poe.trade seem to provide vastly different offers than pathofexile.com/trade.
Apparently, the former need to do indexing first, which the latter does not.
Therefore, when requesting data from both sites at the same time, pathofexile.com/trade will provide more recent data than others.

Idea: Each item pair should have an average offer lifetime. Depending on these lifetimes, it might be beneficial to schedule certain item pair offer requests for a specific backend implementation, ie. more frequently changing data via pathofexile.com/trade and rarely changing data via poe.trade.

UX of presented conversions

Most conversions we end up displaying to the user contain similar sellers and make it really annoying if one of them doesn't answer. I think it might be more desirable to get a list of completely independent conversions.

Use data analysis results to avoid unprofitable trading hops

Currently, the offer fetching performance is rather slow, taking about 150s using the first 13 currencies in src/constants.py#currencies (equaling 156 requests). This is waaay to much to actually use this tool. Ideally, support for a larger variety of currencies (eg. league-specific currencies, maps, etc.) would be desirable. But at the moment this is simply not possible.

However, this shows that most profitable conversions focus around a few currency pairs, such as buying Chaos for Regrets.

-> Try to reduce number of API requests by limiting irrelevant currency pairs

  •  Manually for now
  •  Concept for dynamic regulation in the background

Temp hardcore leagues not working properly

When searching for example on temp hardcore league such as "Hardcore Metamorph" no results are returned. If you use softcore instead "Metamorph" everything works fine and lots of offers appears

Configurable bounds (per item) for trade volume

Background

We need some kind of interface to configure how much of a given currency should be tradable for a given session/graph query in order to...

  1. avoid trades that go over the respective character inventory capacity (eg. 12x5x10 for Chaos Orbs)
  2. avoid generating trading paths which a user does not have the amount of currency for

Initial Idea

  • Add way to respect maximum stack sizes per item
    • Add a new file that specifies maximum stack sizes per currency/item
    • Have some generic class as interface to it
    • Incorporate maximum stack sizes when finding conversions
  • Add way to configure minimum/maximum stock sizes
    • Config file config/config.json with suitable format
    • Need a robust parser for the format
    • Incorporate minimum/maximum stock sizes when finding conversions
  • Limit conversion size based on available item capital
    • Let user specify assets in config.json
    • Incorporate asset specs when finding conversions
  • Derive pair filter from config file
  • Add proper documentation

Interactive CLI with fine-grained controls

Idea: Don't let PathFinder do its whole thing every time the CLI starts up. Instead, separate offer fetching, traversal and post-processing from each other and let users specify what to do, eg. traversing twice before refreshing specific offers

Analyse poe.ninja dumps

poe.ninja provides historical economy data dumps that provide conversion rates between currencies per day. Based on the high confidence rates we can analyse which graph edges are profitable. This should complement previous self-collected data insights.

Errors

Currently getting errors for running on either poetrade or poeofficial.

Fetching Delirium offers for 114 pairs
Filter: Enabled
Backend: poetrade
Spent 43.64s fetching offers
Spent 0.0s building the graph
Checking for profitable conversions...
Traceback (most recent call last):
File "D:/bt stuff/poe-currency-flip-planner-master (3)/poe-currency-flip-planner-master/cli.py", line 114, in
p.run(2)
File "D:\bt stuff\poe-currency-flip-planner-master (3)\poe-currency-flip-planner-master\src\pathfinder.py", line 147, in run
self._find_profitable_paths(max_transaction_length)
File "D:\bt stuff\poe-currency-flip-planner-master (3)\poe-currency-flip-planner-master\src\pathfinder.py", line 120, in _find_profitable_paths
paths = graph.find_paths(self.graph, c, c, self.user_config, max_transaction_length)
File "D:\bt stuff\poe-currency-flip-planner-master (3)\poe-currency-flip-planner-master\src\core\graph.py", line 53, in find_paths
if edge["stock"] < minimum or edge["stock"] > maximum:
TypeError: '>' not supported between instances of 'int' and 'NoneType'
Process finished with exit code 1

It isn't making any .pickle files for some reason

$:~/dev/poe-currency-flip-planner$ sudo sh run_collector.sh 
Fetching Delve offers for 17 currencies - 272 pairs
^CTraceback (most recent call last):
  File "data_analysis/collector.py", line 30, in <module>
    run()
  File "data_analysis/collector.py", line 22, in run
    p.run(3)
  File "/home/$$$$/dev/poe-currency-flip-planner/src/pathfinder.py", line 57, in run
    self.offers = self.backend.fetch_offers(self.league, currency_combinations)
  File "/home/$$$$/dev/poe-currency-flip-planner/src/backends/poeofficial.py", line 15, in fetch_offers
    offers = list(map(lambda x: x, futures))
  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 586, in result_iterator
    yield fs.pop().result()
  File "/usr/lib/python3.6/concurrent/futures/_base.py", line 427, in result
    self._condition.wait(timeout)
  File "/usr/lib/python3.6/threading.py", line 295, in wait
    waiter.acquire()
KeyboardInterrupt

It isn't making any .pickle files for some reason

[Suggestion]Looking for smaller trades

Hi,

Great script. How can we edit it so we are looking at smaller trade rather than in the hundreds? I would like to start small and build up, but most of the trades are 300+ chaos trades.

_build_graph doesn't wait for backend task to finish processing

I think this is the issue, correct me if I'm wrong.

e.g. running cli.py --currency "Chaos Orb" currently outputs on my MacBook Pro:

Fetching Delirium offers for 120 pairs | Filters Enabled
Spent 27.77s fetching offers
Spent 0.0s building the graph
Checking for profitable conversions...
Spent 0.0s finding paths

But if I run in debug mode and wait for the background task scheduled in PathFinder._fetch I get results below.

I think that PathFinder._build_graph should wait until the PathFinder.backend_pool has finished running the fetch job.

Fetching Delirium offers for 120 pairs | Filters Enabled
Spent 59.98s fetching offers
Spent 0.0s building the graph
Checking for profitable conversions...
Checking Chaos Orb -> 51 Conversions
Checking Jagged Fossil -> 2 Conversions
Checking Serrated Fossil -> 10 Conversions
Checking Shuddering Fossil -> 1 Conversions
Spent 208.14s finding paths


	153 Chaos Orb -> 174 Chaos Orb: 21 Chaos Orb
		@SC_WayoftheRoad Hi, I'd like to buy your 6 Gilded Divination Scarab for 153 Chaos Orb in Delirium. (0.0455x)
		@fast_legs Hi, I'd like to buy your 174 Chaos Orb for 6 Gilded Divination Scarab in Delirium. (29.0x)


	52 Chaos Orb -> 66 Chaos Orb: 14 Chaos Orb
		@BoTemplar Hi, I'd like to buy your 13 Serrated Fossil for 52 Chaos Orb in Delirium. (0.25x)
		@LostSoul_Not_AFK Hi, I'd like to buy your 66 Chaos Orb for 13 Serrated Fossil in Delirium. (5.1x)


	69 Chaos Orb -> 78 Chaos Orb: 9 Chaos Orb
		@BallguardianDelirium Hi, I'd like to buy your 9 Shuddering Fossil for 69 Chaos Orb in Delirium. (0.1429x)
		@Delirium_Shocker Hi, I'd like to buy your 78 Chaos Orb for 9 Shuddering Fossil in Delirium. (8.75x)


	19 Chaos Orb -> 25 Chaos Orb: 6 Chaos Orb
		@I_like_them_juicy Hi, I'd like to buy your 5 Serrated Fossil for 19 Chaos Orb in Delirium. (0.3077x)
		@PathofPunch Hi, I'd like to buy your 25 Chaos Orb for 5 Serrated Fossil in Delirium. (5.0x)


	16 Chaos Orb -> 20 Chaos Orb: 4 Chaos Orb
		@TheOncomingPlague Hi, I'd like to buy your 4 Serrated Fossil for 16 Chaos Orb in Delirium. (0.25x)
		@trankvilizator Hi, I'd like to buy your 20 Chaos Orb for 4 Serrated Fossil in Delirium. (5.0x)

excluded_traders does not handle non-standard characters

If you try to use russian characters in excluded_traders.txt you receive the following error:

Traceback (most recent call last):
File "cli.py", line 83, in
excluded_traders = [x.strip() for x in f.readlines()]
File "c:\users\byrdc\appdata\local\programs\python\python37\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 159: character maps to

I assume this would happen with any non-standard unicode character such as korean characters as well.

Rework error handling + integration test via cli.py module

The current error handling situation is a bit weird. A consistent exception strategy from the backend implementations upwards would be appropriate, I guess. The cli.py module should also act as a means of integration test which can be added to the test modules.

change to hc

Is there any way to change it to work for hardcore?

Filter conversions with very low profitability

I know this might be silly as to why someone wouldn't want to see this type of transaction, but sometimes one might only profit 1-5 of a given currency. Depending on the number of transactions a user specifies, this can sometimes not be worthwhile. I don't know if this is filtered out already for lower currencies. For higher currencies like Divines, Exalted, Ancient orbs, etc, it might be worthwhile but for smaller currencies not so much.
With my previously misconfigured pair_filter I was getting transactions for Vaal Orbs that would only profit 1-2 per trade, in bulk exchanges.
I don't know if that's something to look into in the future. Would be difficult to limit that for smaller currencies but also consider it for higher ones.
I thought of something like, if the number of interactions (hops) is greater than the amount you profit by, then the trade is really not worth doing.

Originally posted by @HiPoEGH in #25 (comment)

Dockerize + Poetry

I hate the deployment situation right now. The whole jsonpickle incident could have been avoided by Docker I think. Also, Poetry it is.

  • Switch to Poetry
  • Setup Docker + docker-compose

Cli.py Error

I keep getting an error with the latest repository (cmd cli.py), even when using no arguments.
2020-05-01 11_38_28-C__Windows_System32_cmd exe - pipenv  shell

Compare data fetching speed of backend implementations

Currently, poe.trade supports a much higher fetching concurrency than pathofexile.com/trade (5 requests per 5 seconds). However, the latter seems to filter out (some) obvious price-fixing offers, which is not the case for poe.trade.

If poe.trade supports a considerable speedup compared to pathofexile.com/trade, it might be efficient to use the former, while adding some way to filter out price-fixing offers locally.

How to use pathfinder.py as external lib?

Hey I want to use this in my own small project. I just want to output the cli stuff on a website and let Flask expose an API and the API-endpoint call pathfinder.run().
I managed to get my setup rdy and imported your project as git submodule in its own folder within the project.
However it seems to mess up everything with the absolute paths.

client
  client stuff
server
  app.py (calls pathfinder.py)
  poecfp (your project as git submodule)
    cli.py
    src
      pathfinder.py
      ...

When I run everything, your commons.py says No such file or directory: 'config/excluded_traders.txt'

I just don't know, how to do it properly. Maybe you can give me an advise on how to use your pathfinder.py as an external 3rd party lib in my own project.

EDIT: btw I used Docker to setup everything. So i have NOT used any python virtual environments.

Prioritize less lucrative but more reliable conversions

Currently, after finding a list of profitable conversions, that list is sorted by total winnings. The higher the rank in the sorted list, the higher the amount of "good" conversion rates. The better the conversion rate, the riskier the transaction. However, the goal should be to provide reliable, low- to medium-reward instead of unreliable, high reward trades.

Idea: Introduce an additional edge weight that counteracts high-reward but possibly high-risk trades. The worse an offer's conversion rate is, the higher this weight is.

Ideally, this pushes the final conversions that are presented to the user towards the more reliable although less lucrative side. Overall I think this is desirable. Some interesting data mining can and has to be done here before implementing this.

Trade logging uses conversion currencies not Edge currencies.

Leads to trades such as

18 Chaos Orb -> 25 Chaos Orb: 7 Chaos Orb
        @CalliNoPantsMeta Hi, I'd like to buy your 5 Chaos Orb for 18 Chaos Orb in Delirium. (0.3333x)
        @CallItRegret Hi, I'd like to buy your 25 Chaos Orb for 5 Chaos Orb in Delirium. (5.0x)

Fix below in cli.py:log_conversion:

def log_conversion(c):
    logging.info("\t{} {} -> {} {}: {} {}".format(c["starting"], c["from"], c["ending"],
                                                  c["to"], c["winnings"], c["to"]))
    for t in c["transactions"]:
        logging.info("\t\t@{} Hi, I'd like to buy your {} {} for {} {} in {}. ({}x)".format(
            t.contact_ign,
            t.received,
            t.want,
            t.paid,
            t.have,
            t.league,
            t.conversion_rate,
        ))
    logging.info("\n")

no such file or directory

i have 0 experience with python and coding overall, maybe ive done something wrong while installing something but i had this issue while running cli.py:

PS C:\Users\Demetr> python C:\Users\Demetr\Desktop\poe\poe-currency-flip-planner-master\cli.py
Traceback (most recent call last):
File "C:\Users\Demetr\Desktop\poe\poe-currency-flip-planner-master\cli.py", line 85, in
p = PathFinder(league, chosen_currencies, backend, excluded_traders,
File "C:\Users\Demetr\Desktop\poe\poe-currency-flip-planner-master\src\pathfinder.py", line 52, in init
self.pair_filter = load_pair_filter()
File "C:\Users\Demetr\Desktop\poe\poe-currency-flip-planner-master\src\items.py", line 11, in load_pair_filter
with open("assets/pair_filter.json", "r") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'assets/pair_filter.json'

not sure what i was doing wrong, but i couldnt install pipenv and maybe its something to do with this, seemed to work fine tho after editing paths to "C:/Users/Demetr/Desktop/poe/poe-currency-flip-planner-master/assets/pair_filter.json" in 3 files

Not working for me

Hey,

I just wanted to try this out but. The cli.py work.

But I can't run the .sh.

Thank you ^^"

Error: Rate limited during

Getting this error

(poe-currency-flip-planner) root@ubuntu:~/poe-currency-flip-planner# python cli.py --league hardcore
Fetching hardcore offers for 120 pairs
Filter: Enabled
Backend: poeofficial
Rate limited during: Chaos Orb -> Ancient Orb
Rate limited during: Chaos Orb -> Aetheric Fossil
Rate limited during: Chaos Orb -> Awakened Sextant
Rate limited during: Chaos Orb -> Simple Sextant
Rate limited during: Awakened Sextant -> Chaos Orb
Rate limited during: Jeweller's Orb -> Blessed Orb
Rate limited during: Aetheric Fossil -> Chaos Orb
Rate limited during: Blessed Orb -> Chaos Orb
Rate limited during: Chromatic Orb -> Chaos Orb
Rate limited during: Divine Orb -> Chaos Orb
Rate limited during: Cartographer's Chisel -> Chaos Orb
Rate limited during: Gilded Divination Scarab -> Chaos Orb
Rate limited during: Jeweller's Orb -> Chaos Orb
Rate limited during: Gemcutter's Prism -> Chaos Orb
Rate limited during: Jagged Fossil -> Chaos Orb
Rate limited during: Orb of Alchemy -> Chaos Orb
Rate limited during: Potent Alchemical Resonator -> Chaos Orb
Rate limited during: Orb of Alteration -> Chaos Orb
Rate limited during: Potent Chaotic Resonator -> Chaos Orb
Rate limited during: Orb of Scouring -> Chaos Orb
Rate limited during: Orb of Regret -> Chaos Orb
Rate limited during: Orb of Fusing -> Chaos Orb
Rate limited during: Regal Orb -> Chaos Orb
Rate limited during: Orb of Chance -> Chaos Orb
Rate limited during: Chaos Orb -> Jagged Fossil
Rate limited during: Chaos Orb -> Orb of Annulment
Rate limited during: Chaos Orb -> Gilded Divination Scarab
Rate limited during: Vaal Orb -> Chaos Orb
Rate limited during: Shuddering Fossil -> Chaos Orb
Rate limited during: Serrated Fossil -> Chaos Orb
Rate limited during: Simple Sextant -> Chaos Orb
Rate limited during: Chaos Orb -> Encrusted Fossil
Rate limited during: Jeweller's Orb -> Cartographer's Chisel
Rate limited during: Chaos Orb -> Cartographer's Chisel
Rate limited during: Chromatic Orb -> Cartographer's Chisel
Rate limited during: Gemcutter's Prism -> Cartographer's Chisel
Rate limited during: Orb of Alchemy -> Cartographer's Chisel
Rate limited during: Orb of Alteration -> Cartographer's Chisel
Rate limited during: Orb of Regret -> Cartographer's Chisel
Rate limited during: Orb of Fusing -> Cartographer's Chisel
Rate limited during: Orb of Alchemy -> Chromatic Orb
Rate limited during: Orb of Fusing -> Chromatic Orb
Rate limited during: Chaos Orb -> Chromatic Orb
Rate limited during: Cartographer's Chisel -> Chromatic Orb
Rate limited during: Exalted Orb -> Chromatic Orb
Rate limited during: Orb of Alteration -> Chromatic Orb
Rate limited during: Orb of Chance -> Chromatic Orb
Rate limited during: Jeweller's Orb -> Chromatic Orb
Rate limited during: Cartographer's Chisel -> Exalted Orb
Rate limited during: Vaal Orb -> Chromatic Orb
Rate limited during: Regal Orb -> Chromatic Orb
Rate limited during: Chaos Orb -> Divine Orb
Rate limited during: Chaos Orb -> Exalted Orb
Rate limited during: Gemcutter's Prism -> Exalted Orb
Rate limited during: Chromatic Orb -> Exalted Orb
Rate limited during: Blessed Orb -> Exalted Orb
Rate limited during: Chaos Orb -> Regal Orb
Rate limited during: Cartographer's Chisel -> Regal Orb
Rate limited during: Orb of Annulment -> Exalted Orb
Rate limited during: Orb of Fusing -> Exalted Orb
Rate limited during: Orb of Alchemy -> Exalted Orb
Rate limited during: Chaos Orb -> Serrated Fossil
Rate limited during: Chaos Orb -> Prime Sextant
Rate limited during: Orb of Chance -> Exalted Orb
Rate limited during: Chaos Orb -> Gemcutter's Prism
Rate limited during: Orb of Scouring -> Exalted Orb
Rate limited during: Exalted Orb -> Jeweller's Orb
Rate limited during: Regal Orb -> Exalted Orb
Rate limited during: Chromatic Orb -> Jeweller's Orb
Rate limited during: Orb of Regret -> Exalted Orb
Rate limited during: Chaos Orb -> Harbinger's Orb
Rate limited during: Chaos Orb -> Jeweller's Orb
Rate limited during: Orb of Alteration -> Jeweller's Orb
Rate limited during: Cartographer's Chisel -> Orb of Alchemy
Rate limited during: Orb of Alchemy -> Jeweller's Orb
Rate limited during: Orb of Fusing -> Jeweller's Orb
Rate limited during: Chromatic Orb -> Orb of Alchemy
Rate limited during: Jeweller's Orb -> Orb of Alchemy
Rate limited during: Orb of Alteration -> Orb of Alchemy
Rate limited during: Chaos Orb -> Orb of Alchemy
Rate limited during: Orb of Transmutation -> Orb of Alchemy
Rate limited during: Orb of Chance -> Orb of Alchemy
Rate limited during: Gemcutter's Prism -> Orb of Alteration
Rate limited during: Orb of Fusing -> Orb of Alchemy
Rate limited during: Exalted Orb -> Orb of Alteration
Rate limited during: Chromatic Orb -> Orb of Alteration
Rate limited during: Chaos Orb -> Orb of Alteration
Rate limited during: Jeweller's Orb -> Orb of Alteration
Rate limited during: Orb of Transmutation -> Orb of Alteration
Rate limited during: Orb of Scouring -> Orb of Alteration
Rate limited during: Orb of Alchemy -> Orb of Alteration
Rate limited during: Orb of Alchemy -> Orb of Chance
Rate limited during: Orb of Fusing -> Orb of Alteration
Rate limited during: Chaos Orb -> Orb of Chance
Rate limited during: Orb of Scouring -> Orb of Chance
Rate limited during: Vaal Orb -> Orb of Alteration
Rate limited during: Exalted Orb -> Orb of Fusing
Rate limited during: Chaos Orb -> Orb of Fusing
Rate limited during: Chaos Orb -> Orb of Regret
Rate limited during: Vaal Orb -> Orb of Fusing
Rate limited during: Cartographer's Chisel -> Orb of Regret
Rate limited during: Vaal Orb -> Orb of Chance
Rate limited during: Chromatic Orb -> Orb of Fusing
Rate limited during: Orb of Alteration -> Orb of Fusing
Rate limited during: Orb of Alteration -> Orb of Scouring
Rate limited during: Orb of Fusing -> Orb of Scouring
Rate limited during: Orb of Regret -> Orb of Scouring
Rate limited during: Orb of Alteration -> Orb of Regret
Rate limited during: Chaos Orb -> Orb of Transmutation
Rate limited during: Chaos Orb -> Potent Chaotic Resonator
Rate limited during: Chaos Orb -> Orb of Scouring
Rate limited during: Chaos Orb -> Potent Alchemical Resonator
Rate limited during: Chaos Orb -> Shuddering Fossil
Rate limited during: Cartographer's Chisel -> Vaal Orb
Rate limited during: Orb of Alteration -> Regal Orb
Rate limited during: Orb of Alchemy -> Vaal Orb
Rate limited during: Chaos Orb -> Vaal Orb
Rate limited during: Exalted Orb -> Vaal Orb
Rate limited during: Orb of Alteration -> Vaal Orb
Rate limited during: Orb of Fusing -> Vaal Orb
Failed to fetch offers for 120 pairs
Traceback (most recent call last):
  File "cli.py", line 114, in <module>
    p.run(3)
  File "/root/poe-currency-flip-planner/src/pathfinder.py", line 143, in run
    self._fetch()
  File "/root/poe-currency-flip-planner/src/pathfinder.py", line 97, in _fetch
    self.offers = self._filter_traders(self.offers, self.excluded_traders)
  File "/root/poe-currency-flip-planner/src/pathfinder.py", line 75, in _filter_traders
    offers[idx]["offers"],
TypeError: 'NoneType' object is not subscriptable
(poe-currency-flip-planner) root@ubuntu:~/poe-currency-flip-planner#

Add integration tests

Somehow not having jsonpickle installed wasn't detected in any CI runs of the last 30 days, which majorly sucks. The cli and data collector components should be tested via CI as well.

Error on installation

I tried to install your 'poe-currency-flip-planner' using Kali Linux, did according to the instructions, but when entering pip install -r requirements.txt return error. I on Win 10, python is installed. I attached the part of the output where the error appears.
error.txt

Rework "pair filters" to trading presets

Currently, we can either request data for:

  • all items (~3800 reqs)
  • only items marked as currency
  • only items marked as currency filtered by assets/pair_filter.json (default)

This is not what we want. Ideally, there is an easy way to build custom presets on what item pairs to use. I think most items are easily grouped, eg. maps, fossils, essences, etc. Maybe this is even too sophisticated as most elements of each group are worthless, but let'ss see.

requirements.txt update - add deserialize

Clean python install doesn't necessarily have deserialize :

On a clean python 3.7 on debian buster, for instance with this Dockerfile :

FROM python:3.7-buster
RUN git clone https://github.com/maximumstock/poe-currency-flip-planner.git
RUN cd poe-currency-flip-planner ; pip install -r requirements.txt

You still have to pip install deserialize :

root@174e58b83184:/poe-currency-flip-planner# python cli.py --league "Harvest"
Traceback (most recent call last):
  File "cli.py", line 5, in <module>
    from src.config.user_config import UserConfig
  File "/poe-currency-flip-planner/src/config/user_config.py", line 8, in <module>
    from src.trading import StackSizeHelper
  File "/poe-currency-flip-planner/src/trading/__init__.py", line 1, in <module>
    from .items import Item, ItemList, UnknownBackendException, UnsupportedItemException
  File "/poe-currency-flip-planner/src/trading/items.py", line 24, in <module>
    import deserialize
ModuleNotFoundError: No module named 'deserialize'
root@174e58b83184:/poe-currency-flip-planner# pip install deserialize
Collecting deserialize
  Downloading deserialize-1.8.0-py3-none-any.whl (15 kB)
Installing collected packages: deserialize
Successfully installed deserialize-1.8.0
root@174e58b83184:/poe-currency-flip-planner# python cli.py --league "Harvest"
Fetching Harvest offers for 120 pairs

Start collecting data gain

We need some more league data for bulk trades to infer edge profitablity. A comparison with previous league's datasets should be easy as well, in order to see if they differ in terms of which edges remain profitable throughout a league.

slice indices must be integers or None or have an __index__ method

Spent 10.8s finding paths
Traceback (most recent call last):
  File "cli.py", line 49, in <module>
    log_conversions(p.results, currency, limit)
  File "cli.py", line 10, in log_conversions
    for c in conversions[currency][:limit]:
TypeError: slice indices must be integers or None or have an __index__ method

Fixed by Changing

for c in conversions[currency][:limit]:

def log_conversions(conversions, currency, limit):
    for c in conversions[currency][:limit]:
        log_conversion(c)

to
make the slice use an int.

def log_conversions(conversions, currency, limit):
    for c in conversions[currency][:int(limit)]:
        log_conversion(c)

Ran with

python cli.py --limit 10 --league "Betrayal" --currency "Exalted Orb"

Python 3.8 support

The current version specified in requirements.txt of typed-ast unfortunately doesn't build on current 3.8.

I ran in docker for ease of reproducability, here's the Dockerfile :

FROM python:3.8-buster
RUN git clone https://github.com/maximumstock/poe-currency-flip-planner.git
RUN cd poe-currency-flip-planner ; pip install -r requirements.txt

And the error is

    ast3/Python/ast.c:22:1: error: conflicting types for ‘_PyObject_FastCall’
     _PyObject_FastCall(PyObject *func, PyObject *const *args, int nargs)
     ^~~~~~~~~~~~~~~~~~
    In file included from /usr/local/include/python3.8/abstract.h:837,
                     from /usr/local/include/python3.8/Python.h:147,
                     from ast3/Python/ast.c:6:
    /usr/local/include/python3.8/cpython/abstract.h:145:1: note: previous definition of ‘_PyObject_FastCall’ was here
     _PyObject_FastCall(PyObject *func, PyObject *const *args, Py_ssize_t nargs)
     ^~~~~~~~~~~~~~~~~~
    error: command 'gcc' failed with exit status 1
    ----------------------------------------

From looking at various error reports all over e.g. python/typed_ast#124 and ethereum/py-evm#1872, I guess this indicates a requirement to update both typed-ast and mypy.

Changing 3.8 to 3.7 works fine, at least for build.

Analyse some data

Idea: Top 10 profitable edges per league per day/week among the latest league datasets we have.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.