paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

GTAオンラインの極秘貨物の利益率をpythonでグラフ化する グラフ化偏

前回そろえたデータをmatplotlibでグラフ化したいと思います。

データ

貨物数ごとの売却額、利益等まとめられています。
元々あったデータをCSV化したものです。

長いので抜粋。

PS C:\Users\tsuru\tools\cargo-profits> cat '.\special cargo profits.csv' -head 5
Crates,Sell,PPC (Price per crate),Profit @ 2k PC,Profit @ 4k PC,Profit @ 6k PC,Time @ 2k,Time @ 4k,Time @ 6k,PPH @ 2k,PPH @ 4k,PPH @ 6k
1,10000,10000,8000,6000,4000,5:00,7:00,8:00,92664,50633,29162
2,22000,11000,18000,14000,10000,13:00,7:00,8:00,80838,118143,72904
3,36000,12000,30000,24000,18000,22:00,17:00,8:00,83565,83624,131227
4,52000,13000,44000,36000,28000,30:00:00,17:00,19:00,88829,125436,86331

グラフ化対象

前回も書きましたが

  • Crates(箱数)
  • Sell(売却額)
  • Profit @ xk(利益)
  • PPH @ xk(1時間当たりの利益)

を出します。

仕入れ数ごと(1個、2個、3個)に上記を出すので3つのグラフを作成します。

コード

50行以内に収まったので全部張ります。
3つのグラフを一気に出したかったので、保存することにしました。

  • profits.py
import csv
import matplotlib.pyplot as plt

with open('special cargo profits.csv' , 'r') as f:
    reader = csv.DictReader(f)
    data = [x for x in reader]

def Aggregate(key):
    item = []
    for i in data:
        item.append(int(i[key])) # Convert integer
    return item

def Create_graph(profit, pph, filename=None):
    fig = plt.figure()
    ax1 = fig.add_subplot()
    # Add second axes
    ax2 = ax1.twinx()

    l1 = ax1.bar(Cr, Se, color='orange')
    l2 = ax1.plot(Cr, profit, color='red')
    l3 = ax2.plot(Cr, pph)

    # Add legend [f:id:paloma69:20210403132835p:plain]and labels
    plt.legend((l1[0],l2[0],l3[0]), ('Sell','Profit','Profit Per Hour'))
    plt.title('Special cargo profits at {}'.format(filename))
    ax1.set_xlabel('Crates')
    ax1.set_ylabel('Sells and profits ($)')
    ax2.set_ylabel('Profits Per Hour ($)')

    # For auto scale
    plt.tight_layout()

    plt.savefig('{}.png'.format(filename))

Cr = Aggregate('Crates')
Se = Aggregate('Sell')
Pr6 = Aggregate('Profit @ 6k PC')
Ph6 = Aggregate('PPH @ 6k')
Pr4 = Aggregate('Profit @ 4k PC')
Ph4 = Aggregate('PPH @ 4k')
Pr2 = Aggregate('Profit @ 2k PC')
Ph2 = Aggregate('PPH @ 2k')

Create_graph(Pr6, Ph6, '6k purchase')
Create_graph(Pr4, Ph4, '4k purchase')
Create_graph(Pr2, Ph2, '2k purchase')

実行

上記を実行すると3つのグラフが作成されます。

PS C:\Users\tsuru\tools\cargo-profits> ls


    ディレクトリ: C:\Users\tsuru\tools\cargo-profits


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2021/04/02     23:50           1309 profits.py
-a----       2021/03/26     23:32           1401 special cargo profits.csv
PS C:\Users\tsuru\tools\cargo-profits> python .\profits.py
PS C:\Users\tsuru\tools\cargo-profits> ls


    ディレクトリ: C:\Users\tsuru\tools\cargo-profits


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2021/04/03     11:33          52959 2k purchase.png
-a----       2021/04/03     11:33          51299 4k purchase.png
-a----       2021/04/03     11:33          51554 6k purchase.png
-a----       2021/04/02     23:50           1309 profits.py
-a----       2021/03/26     23:32           1401 special cargo profits.csv

グラフ

作成できたところで各グラフを見てみましょう。
仕入れ数を増やすごとに1個当たりの仕入れ値が上がります。
売却額も売る個数によって高くなっていきます。

1時間当たりの利益が今回の比較対象になります。
ソロ売りの貨物9個を比較します。

1個ずつ仕入れ: 仕入れ値は1個あたり$2000

売値に対して利益が高いです。
1時間当たりの利益は波がありますね。
これは集荷ミッションの度にクールタイムがあるので1個ずつで溜めると中々の時間がかかります。 9個売りだと$92500ちょい下の利益率です。

f:id:paloma69:20210403133825p:plain

2個ずつ仕入れ: 仕入れ値は1個あたり$4000

2個ずつ仕入れだと同じく偶数個ずつ売っていけば1時間当たりの利益が上がりますね。
9個売りだとタイミングが悪く$115000付近の利益ですね。

f:id:paloma69:20210403133836p:plain

3個ずつ仕入れ: 仕入れ値は1個あたり$6000

3個だと売価に対する利益はだいぶ下がりますが、1時間当たりの利益はそこそこですね。
集められるスピードが効いています。
9個売りだと仕入れ数との関係で波がトップに来ていて$140000ほどの利益になります。

f:id:paloma69:20210403133848p:plain

まとめ

1時間当たりの利益で比較した場合は集める時間の少ない3個仕入れが効率が良いようです。
とは言っても攻略サイト等で研究されつくしており、今回わざわざ検証するようなことでもないのですが、久しぶりにmatplotlibを触りたくなったので今回の記事を思いつきました。

2軸目を使って棒グラフと折れ線を出力させるというのがテーマにありましたが、意外と手こずらずに作成することができました。
いちおうExcelで予行練習もしましたが、期待通りのグラフが作成できてよかったですw
今思い返すと2軸目も単位を揃えた方がよりいいグラフになったと思いますが、とりあえず今回はこの辺で。

2軸目はfigure関数が肝ですね。この他にも複数のグラフを一度に出力などもできるみたいなのでまた機会があれば触ってみます。

おまけ

極秘貨物で儲けるとオフィスが散らかってきます。
だいぶ売ったのでいい感じに散らかってきましたw

f:id:paloma69:20210403132943p:plain

参考サイト

Matplotlib-2軸グラフの書き方 | ブログ一覧 | DATUM STUDIO株式会社

【Python】Matplotlibで複数のグラフを並べよう!│Python初心者の備忘録