Coder Social home page Coder Social logo

axel3rd / mpg-coach-bot Goto Github PK

View Code? Open in Web Editor NEW
21.0 21.0 8.0 5.59 MB

MPG (Mon Petit Gazon) coach bot, to automate and optimize weekly actions

Home Page: https://axel3rd.github.io/mpg-coach-bot/

License: MIT License

Java 5.48% Shell 0.02% Batchfile 0.01% HTML 94.50%
bot java mon-petit-gazon mpg

mpg-coach-bot's People

Contributors

axel3rd avatar dependabot[bot] avatar emilienmottet avatar mansuydejean avatar

Stargazers

 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

mpg-coach-bot's Issues

Use player's team for removing out players during mercato

During mercatos, the team is currently not used to verify out players ; only name & position used (position for all championship except L2).
To have better result, this name should be used to verify if players are really out.
It is not implemented because only TeamId are in mercato API.
Team name (to use for mapping in injured/suspended player) should be got in other API.

Support transition status (preparation, end of season, terminated, ...)

Describe the bug

When no more match are available in MPG season (Plus de match disponible. in Coach screen), this exception occurs:

========== League Name ==========
Exception in thread "main" javax.ws.rs.ProcessingException: Error reading entity from input stream.
        at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:889)
        at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808)
        at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:321)
        at org.glassfish.jersey.client.InboundJaxrsResponse$1.call(InboundJaxrsResponse.java:115)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
        at org.glassfish.jersey.internal.Errors.process(Errors.java:229)
        at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:389)
        at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:264)
        at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:112)
        at org.blondin.mpg.AbstractClient.call(AbstractClient.java:117)
        at org.blondin.mpg.AbstractClient.get(AbstractClient.java:63)
        at org.blondin.mpg.root.MpgClient.getCoach(MpgClient.java:42)
        at org.blondin.mpg.Main.process(Main.java:48)
        at org.blondin.mpg.Main.main(Main.java:40)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Root name 'success' does not match expected ('data') for type [simple type, class org.blondin.mpg.root.model.Coach]
 at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@f9af83; line: 1, column: 2]
        at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
        at com.fasterxml.jackson.databind.DeserializationContext.reportMappingException(DeserializationContext.java:1234)
        at com.fasterxml.jackson.databind.ObjectReader._unwrapAndDeserialize(ObjectReader.java:1693)
        at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1580)
        at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:964)
        at org.glassfish.jersey.jackson.internal.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:838)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:257)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:236)
        at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:156)
        at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1091)
        at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
        ... 14 more

A clear and concise description of what the bug is, with a copy/paste of Java exception if present.

Join debug files

The result of GET /league/[yourLeagueId]/coach is (in this case):

{"success":"noMoreGames"}

Expected behavior

It should not crash, but normal exist with correct message.

Transaction proposal feature throw NPE when used in normal mode

When MPG league is in normal mode and the transaction proposal feature is used, the endpoint /league/KJVB6L7C/transfer/buy response is:

{
    "success": false,
    "error": "normalMode",
    "code": 833
}

So no players and there is a fail with:

java.lang.NullPointerException
	at org.blondin.mpg.Main.removeOutPlayers(Main.java:292)
	at org.blondin.mpg.Main.processGames(Main.java:173)
	at org.blondin.mpg.Main.processLeague(Main.java:90)

No blank on substitutes' bench

Currently, there is 2 substitutes by lines (1 for goalkeeper).
When you have not enough players (injured, suspended, really not enough), there are some blank on substitutes' bench.

In this case, they should be completed by valid users.
The most efficient player(s) should be used in this case.

In case of 5-4-1 and if the best player is an attacker, it is not the best strategy ; A defender or middlefield would be better.
But it is more complicated to implement and decide of one sustainable strategy ...

Trim player name

When player has no first or last name (ex: Neymar), the getName could have space (start or end, see Player.java). A trim should be implemented.
In addition, use StringUtils.defaultIfBlack, better than if.

"Winning chance" usage in the statistical model

Suggestion: what about using the winning chance % from MPGStat to adjust the efficiency?

for example: player.matchs / championshipDays * player.average * (1 + player.goals() * efficiency.coeff * (50%/(1-winning chance) (not sure the math is right).

maybe 1+ln((50%/(1-winning chance)) would be better

Basically, efficiency is unchanged if the winning chance is 50/50. It decreases if eff is lower than 50% and increases if eff is higher than 50%.

Let me know what you think!

Cheers!

JDK 11 compatibility

Currently it is not compatible with JDK 11 because javax.activation package is not in JDK 9

Option to enable/disable tactical substitutes

When you have not many substitutes, the tactical substitutes could be dangerous.
Some (selected) players will be replaced, and you can have rotaldo as result.

So an option should be implemented to disable that (but with default value for change as currently):

tactical.substitutes = true

Eff. = 0

Describe the bug

Hello,

Maybe nothing or something that will correct itself later today but eff. is 0 for all my EPL players this morning.

Optimized team:
+---+---------------------+------+----+
| P | Player name | Eff. | Q. |
+---+---------------------+------+----+
| G | Fabianski Lukasz | 0.00 | 25 |
| G | Heaton Tom | 0.00 | 18 |
| G | Rui Patrício | 0.00 | 15 |
+---+---------------------+------+----+
| D | Diop Issa | 0.00 | 21 |
| D | Pieters Erik | 0.00 | 13 |
| D | Guilbert Frederic | 0.00 | 13 |
| D | Vestergaard Jannik | 0.00 | 12 |
| D | Cuco Martina | 0.00 | 12 |
| D | Stearman Richard | 0.00 | 12 |
| D | Kiko Femenía | 0.00 | 11 |
| D | Holebas José | 0.00 | 10 |
| D | Engels Björn | 0.00 | 10 |
| D | Angeliño | 0.00 | 9 |
| D | Cédric Soares | 0.00 | 9 |
| D | Dawson Craig | 0.00 | 6 |
+---+---------------------+------+----+
| M | Ndombele Tanguy | 0.00 | 22 |
| M | Kovacic Mateo | 0.00 | 13 |
| M | Fornals Pablo | 0.00 | 13 |
| M | Djenepo Moussa | 0.00 | 12 |
| M | Trossard Leandro | 0.00 | 11 |
| M | Zinchenko Oleksandr | 0.00 | 10 |
| M | Mount Mason | 0.00 | 10 |
| M | Jota | 0.00 | 7 |
| M | James Daniel | 0.00 | 1 |
+---+---------------------+------+----+
| A | Jiménez Raúl | 0.00 | 28 |
| A | Deulofeu Gerard | 0.00 | 18 |
| A | Wesley | 0.00 | 12 |
| A | Giroud Olivier | 0.00 | 10 |
| A | El Ghazi Anwar | 0.00 | 9 |
| A | Drmic Josip | 0.00 | 8 |
+---+---------------------+------+----+

Join debug files

Depending your championship, join data files set in attachment.

  1. The MPG JSon Response of these Request on https://api.monpetitgazon.com (use the browser network monitor - F12, see wiki Get MPG data for opening a bug for more details):
  • From home : GET /user/dashboard
  • From coach: GET /league/[yourLeagueId]/coach
  • From transfer : GET /league/[yourLeagueId]/transfer/buy
  1. The Players statistics data, one JSon from:
  1. The Players statistics time update data : https://www.mpgstats.fr/json/leagues.json

  2. The Injury / Suspended data, one full HTML from:

Expected behavior

A clear and concise description of what you expected to happen.

If problem on update team feature, please join the Request and Response of POST /league/[yourLeagueId]/coach when you save your team in MPG.

Crash on intermediate mercato step

During intermediate mercato step where MPG ask you to fill the name/acronym/stage information for your, mpg-coach-not fails with a 403.

In this case, the mercato endpoint is not accessible.

Auto-update team

With #2 & #1 implemented, an auto update can be done.

In configuration, an update=[true|false] (default false if not exist) properties should be implemented.

Technically, this is a POST on /league/[leagueId]/coach with content:

{
    "playersOnPitch": {
        "1": "player_42713",
        "2": "player_93605",
        ...
        "17": "player_219873",
        "18": null               <-- if no player seletect
    },
    "composition": 343,
    "tacticalsubstitutes": [
        {
            "subs": "player_183779",
            "start": "player_52782",
            "rating": 3
        },
        {
            "subs": "player_47654",
            "start": "player_213198",
            "rating": 3
        }
        ... until 5
    ],
    "bonusSelected": {
      ... should be investiguated --> should be the same as user selection
    },
    "matchId": "mpg_match_KLGXSSUG_1_6_4",
    "realday": 9
}

Domino's Ligue 2 injured/suspended players support

Domino's Ligue 2 is new in MPG (#76). For other league, the best third-part website for injured/suspended players is http://www.equipeactu.fr/blessures-et-suspensions/fodbold/ (#1).

It exists for L2 (http://www.equipeactu.fr/blessures-et-suspensions/fodbold/france/ligue-2), but currently empty.

=> We should stay tuned on this website, and if no data after some L2 days, a switch should be done on other website for L2 (perhaps injured/suspended information from MPG itself, but seems not really up2date information this past year).

Sell & Buy players proposal

With efficiency calculation we can propose:

  • To sell players who have a very bad score
  • Buy some players to optimize team (with current funds + potential sale)

Injured/Suspended Premiere-League players fix

Currently, the injured/suspended premiere league player link used is: http://www.equipeactu.fr/blessures-et-suspensions/fodbold/angleterre/championship

See bug_report.md or combination in code:

client.setUrl(StringUtils.defaultString(urlOverride, "http://www.equipeactu.fr/blessures-et-suspensions/fodbold/"));

LIGUE_1("france/ligue-1"), LIGUE_2("france/ligue-2"), PREMIER_LEAGUE("angleterre/championship"), LIGA("espagne/primera-division"),

This link is invalid, http://www.equipeactu.fr/blessures-et-suspensions/fodbold/angleterre/premier-league should be used.

Not understand how not detected before 😭 !

Update release process

-B (Maven batch mode) should be added in last command, to use defaults options (for version, tag name, ...)

EquipeActu URLs have moved in https

On SeriaA championship, execption:

Exception in thread "main" java.lang.UnsupportedOperationException: Unsupported status code: 301 Moved Permanently / Content: <!DOCTYPE HTML PUBLITF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://www.equipeactu.fr/blessures-et-suspensions/fodbold/italie/serie-a">here</a>.</p>
</body></html>

Mercato suggest

When league is in preparation (status 1, #39), suggest should be provided for mercato ; by line based on efficiency.

For cotation, https://api.monpetitgazon.com/mercato/1 (for French championship)

Some player are not found in stats

========== Rock on the grass ==========
Out: Thauvin Florian - SUSPENDED - 16/12: Marseille-Bordeaux - Points de sanction
Exception in thread "main" java.lang.UnsupportedOperationException: Player can't be found in stats: Oyongo Ambroise
        at org.blondin.mpg.stats.model.Championship.getPlayer(Championship.java:46)
        at org.blondin.mpg.Main.calculateEfficiency(Main.java:115)
        at org.blondin.mpg.Main.process(Main.java:55)
        at org.blondin.mpg.Main.main(Main.java:40)

Update fail after weekend

After the weekend, when team substitutes are reseted, the update fail with :

Exception in thread "main" java.lang.UnsupportedOperationException: Unsupported status code: 400 Bad Request / Content: {"error":"badRequest"}
        at org.blondin.mpg.AbstractClient.call(AbstractClient.java:124)
        at org.blondin.mpg.AbstractClient.post(AbstractClient.java:85)
        at org.blondin.mpg.AbstractClient.post(AbstractClient.java:81)
        at org.blondin.mpg.root.MpgClient.updateCoach(MpgClient.java:95)
        at org.blondin.mpg.Main.updateTeamWithRetry(Main.java:188)
        at org.blondin.mpg.Main.processGames(Main.java:164)
        at org.blondin.mpg.Main.processLeague(Main.java:90)
        at org.blondin.mpg.Main.process(Main.java:68)
        at org.blondin.mpg.Main.main(Main.java:59)

It is strange, because if you save you team on MPG as it is ... and execute mpg-coach-bot with update, it works.

Cannot launch miss variables

Hey there,

I'm not very comfortable with java application, I put my credentials in mpg.properties and I tried to launch your sh script :

$ ./mpg-coach-bot.sh 
./mpg-coach-bot.sh: ligne 3: ${project.artifactId}-${project.version}.jar : mauvaise substitution

I couldn't found any .jar anywhere and I don't know what these variables should contain 👍
${project.artifactId}-${project.version}.

Thanks for helping, I probably miss something.

Don't fail when player not found in MPG stats

Linked to #76, when league start and not datas exist in MPG stats, this error occurs:

Exception in thread "main" org.blondin.mpg.root.exception.PlayerNotFoundException: Player can't be found in stats: Tramoni Matteo
        at org.blondin.mpg.stats.model.Championship.getPlayer(Championship.java:57)
        at org.blondin.mpg.Main.calculateEfficiency(Main.java:338)
        at org.blondin.mpg.Main.processGames(Main.java:150)
        at org.blondin.mpg.Main.processLeague(Main.java:90)
        at org.blondin.mpg.Main.process(Main.java:68)
        at org.blondin.mpg.Main.main(Main.java:59)

come back of #35 ?

Proxy support

It would be useful to have proxy support in the properties

  • http proxy : host , port, username, password
  • httpS proxy : host , port, username, password

The best would be to relay the properties to the JVM (although I don't know how to do so)

Italien Serie-A support

Describe the bug

Exception in thread "main" javax.ws.rs.ProcessingException: Error reading entity from input stream.
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:865)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:784)
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:297)
at org.glassfish.jersey.client.InboundJaxrsResponse$1.call(InboundJaxrsResponse.java:91)
at org.glassfish.jersey.internal.Errors.process(Errors.java:292)
at org.glassfish.jersey.internal.Errors.process(Errors.java:274)
at org.glassfish.jersey.internal.Errors.process(Errors.java:205)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:365)
at org.glassfish.jersey.client.InboundJaxrsResponse.runInScopeIfPossible(InboundJaxrsResponse.java:240)
at org.glassfish.jersey.client.InboundJaxrsResponse.readEntity(InboundJaxrsResponse.java:88)
at org.blondin.mpg.AbstractClient.call(AbstractClient.java:131)
at org.blondin.mpg.AbstractClient.get(AbstractClient.java:69)
at org.blondin.mpg.root.MpgClient.getDashboard(MpgClient.java:70)
at org.blondin.mpg.Main.process(Main.java:63)
at org.blondin.mpg.Main.main(Main.java:59)
Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of org.blondin.mpg.root.model.ChampionshipType, problem: Championship type not supported: 5
at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 221] (through reference chain: org.blondin.mpg.root.model.Dashboard["leagues"]->java.util.ArrayList[0]->org.blondin.mpg.root.model.League["championship"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1608)
at com.fasterxml.jackson.databind.DeserializationContext.handleInstantiationProblem(DeserializationContext.java:1073)
at com.fasterxml.jackson.databind.deser.std.FactoryBasedEnumDeserializer.deserialize(FactoryBasedEnumDeserializer.java:146)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:286)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245)
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27)
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
at com.fasterxml.jackson.databind.ObjectReader._unwrapAndDeserialize(ObjectReader.java:1703)
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1571)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:965)
at org.glassfish.jersey.jackson.internal.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:838)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:233)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:212)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:132)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1071)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:850)
... 14 more
Caused by: java.lang.UnsupportedOperationException: Championship type not supported: 5
at org.blondin.mpg.root.model.ChampionshipType.getNameByValue(ChampionshipType.java:23)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at com.fasterxml.jackson.databind.introspect.AnnotatedMethod.callOnWith(AnnotatedMethod.java:122)
at com.fasterxml.jackson.databind.deser.std.FactoryBasedEnumDeserializer.deserialize(FactoryBasedEnumDeserializer.java:138)
... 32 more

Join debug files

Depending your championship, join data files set in attachment.

  1. The MPG JSon Response of these Request on https://api.monpetitgazon.com (visible via F12 in your browser):
  • From home : GET /user/dashboard
  • From coach: GET /league/[yourLeagueId]/coach
  • From transfer : GET /league/[yourLeagueId]/transfer/buy
  1. The Players statistics data, one JSon from:
  1. The Players statistics time update datas : https://www.mpgstats.fr/json/leagues.json

  2. The Injury / Suspended data, one full HTML from:

Expected behavior

A clear and concise description of what you expected to happen.

If problem on update team feature, please join the Request and Response (visible via F12 in your browser) of POST /league/[yourLeagueId]/coach when you save your team in MPG.

Updating team fails due to tactical composition (attackers & defenders switch)

Describe the bug

Exception in thread "main" java.lang.UnsupportedOperationException: Unsupported status code: 403 Forbidden / Content: {"success":false,"error":"goodTry","code":839}
at org.blondin.mpg.AbstractClient.call(AbstractClient.java:124)
at org.blondin.mpg.AbstractClient.post(AbstractClient.java:85)
at org.blondin.mpg.AbstractClient.post(AbstractClient.java:81)
at org.blondin.mpg.root.MpgClient.updateCoach(MpgClient.java:95)
at org.blondin.mpg.Main.updateTeamWithRetry(Main.java:190)
at org.blondin.mpg.Main.processGames(Main.java:166)
at org.blondin.mpg.Main.processLeague(Main.java:90)
at org.blondin.mpg.Main.process(Main.java:68)
at org.blondin.mpg.Main.main(Main.java:59)

Join debug files

Depending your championship, join data files set in attachment.

  1. The MPG JSon Response of these Request on https://api.monpetitgazon.com (visible via F12 in your browser):
  • From home : GET /user/dashboard
  • From coach: GET /league/[yourLeagueId]/coach
  • From transfer : GET /league/[yourLeagueId]/transfer/buy
  1. The Players statistics data, one JSon from:
  1. The Players statistics time update datas : https://www.mpgstats.fr/json/leagues.json

  2. The Injury / Suspended data, one full HTML from:

Expected behavior

A clear and concise description of what you expected to happen.

If problem on update team feature, please join the Request and Response (visible via F12 in your browser) of POST /league/[yourLeagueId]/coach when you save your team in MPG.

Efficiency recent focus throw bad stats when season started

The recent focus efficiency (8 days by default : #44) has problem when season starts (e.g: current day < number of focused days).
The previous season days are used in this case (=> mainly 0 for L2 #76).

=> In this case, we should focus on real days of season (=> get the current day and do the substraction). Until focused days < current season day, the result should be the same as if focus efficiency option not used.

Options on the efficiency algorithm

Why not having options at run-time to tweak the efficiency algorithm :

  • setting a different goal multiplier
  • using only the grades from a defined number of the past games

Skip Champions League (can't be supported now)

Champions League will be supported one day (#112), but without dedicated part in thirt-part website (stats, ...), it can't be supported now.
But bot should not crash when users's leagues contain a Champions League

Crash with 'notGoodStatus' when Mercato is ending

When last round mercato is ending (you have validate the round, but but another player), fails with:

java.lang.UnsupportedOperationException: Unsupported status code: 403 Forbidden / Content: {"success":false,"error":"notGoodStatus","code":801}
	at org.blondin.mpg.AbstractClient.call(AbstractClient.java:123)
	at org.blondin.mpg.AbstractClient.get(AbstractClient.java:73)
	at org.blondin.mpg.AbstractClient.get(AbstractClient.java:61)
	at org.blondin.mpg.root.MpgClient.getMercato(MpgClient.java:80)
	at org.blondin.mpg.Main.processMercatoLeague(Main.java:99)
	at org.blondin.mpg.Main.processLeague(Main.java:88)
	at org.blondin.mpg.Main.process(Main.java:69)
	at org.blondin.mpg.Main.main(Main.java:60)
``

Focus on recent efficiency

On branch 1.2-SNAPSHOT for #40, the coefficient is strange

MpgStats is:

image

MPG Datas for infos:

image

And calulation is:

image

Verratti scoring should be reviewed too ...

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.