min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

ドル円為替レートの度数分布表

度数分布表

できた

$ cat myKINRIbloom04Freq.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-


import pandas as pd
import pandas_datareader as web

import matplotlib.pyplot as plt
# %matplotlib inline
import matplotlib.font_manager as fm
# plt.rcParams['font.family']='Droid Sans Japanese'
import japanize_matplotlib

from matplotlib import rcParams
rcParams['figure.figsize']=15,10
rcParams['font.size']=15
import sys
import os
import math

#import cv2
#from PIL import Image, ImageFont, ImageDraw
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
import numpy as np

import datetime
from datetime import datetime as dt
#-----------------------------------
import subprocess
from collections import Counter
# import matplotlib.pyplot as plt  # 追加: グラフ描画用ライブラリ
#-----------------------------------

# cdしないとcronで/rootに溜まっちゃう!
# スクリプトディレクトリを取得
script_directory = os.path.dirname(os.path.abspath(__file__))

# スクリプトディレクトリにカレントディレクトリを変更
os.chdir(script_directory)
#os.chdir('/media/WD30EZRX/PT3/')

# 現在の日時を取得
#execution_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
myTIMEE = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
myARG0 = os.path.basename(__file__)

# print(f"引数: {sys.argv[1]}")
# #print(sys.argv[1])

# myARG1 = sys.argv[1]

# #if len(sys.argv) != 2:
# if len(sys.argv) <= 1:
#         print(f"Usage: python {sys.argv[0]} 20220101(start date) 20220501(end 省略可")
#         sys.exit()

print('-------------------------------------------------------------')
print('myKINRIbloom.txt にあるドル円為替レートデータの平均値を求める')
print('-------------------------------------------------------------')
print('Pythonからはじめる数学入門 p68 平均mean、中央値median、最頻値mode、度数分布表')
print('-------------------------------------------------------------')

#def calculate_meann_rate(filename):
#def calculate_mediann_rate(filename):
def calculate_modee_rate(filename):
    rates = []
    skipped_count = 0  # スキップされた行をカウントする変数
    median = 0

    with open(filename, 'r') as file:
        for line in file:
            try:
                # 行の右側の数値部分(為替レート)を取り出してリストに追加
                rate = float(line.split()[1])
                # rates配列に突っ込む
                rates.append(rate)
            except (IndexError, ValueError):
                # 行に数値がない場合、スキップ
                skipped_count += 1
                continue

    if rates:
        table = Counter(rates)
        print('myKINRIbloom.txtからとった為替レートの度数分布表')
        print('-------------------------------------------------------------')
        print('ドル円 出現回数')
        print(f"ドル円\t出現回数")
        print('----------------')
        for num in table.most_common(10):
            #print('{0}\t{1}'.format(num[0], num[1]))
            print('{0}円\t{1}回'.format(num[0], num[1]))
        print('----------------')
        print('max(rates配列)')
        print(f"{max(rates)}円")
        print('----------------')
        print('min(rates配列)')
        print(f"{min(rates)}円")
        print('----------------')
        print('範囲')
        print(f"{max(rates) - min(rates)}円")
        print('----------------')

        # 棒グラフを描画して保存
        plot_histogram(table)

#MODE    if rates:
#MODE        print('冒頭で from collection import Counter 必要')
#MODE        print('---------------------------------------------')
#MODE        c = Counter(rates)
#MODE        # c.most_common()
#MODE        # cM = c.most_common()
#MODE
#MODE        print('ほしい最頻値の数を決める')
#MODE        wants = 10
#MODE
#MODE        print(f"最頻値 {wants} 個を表示する")
#MODE        print('---------------------------------------------')
#MODE        # cM = c.most_common()
#MODE        cM = c.most_common(wants)
#MODE        return cM
#MODE    else:
#MODE        return None, 0, skipped_count, median


#    if rates:
#        print('中央値を見つけるにはあらかじめソートが必要')
#        print('------------------------------------------')
#        rates.sort()
#
#        N = len(rates)
#        if N % 2 == 0:
#            print('rates配列の長さNが2で割り切れる場合つまり')
#            print('為替141円、150円...の全件数が偶数個 の場合は')
#            print('真ん中にある2つを足して割った数が中央値median')
#            print('---------------------------------------------')
#            m1 =  N/2
#            m2 = (N/2) + 1
#            print('Pythonリストは0オリジンなので、添字としてmを使うには1を引く')
#            print('---------------------------------------------')
#            m1 = int(m1) -1
#            m2 = int(m2) -1
#            print('中央値を計算')
#            median = *1
    print('''
    values, counts = zip(*table.items())
    では
        100円が5回、101円が12回、102円が8回
        table = {100: 5, 101: 12, 102: 8}
    の場合
        valuesは[100, 101, 102]
        countsは[5, 12, 8]
    になります。
    ''')


    # データの範囲を取得
    min_table = int(min(table))
    max_table = int(max(table))

    # 1円単位のビンを生成
    # bins = np.arange(min_table, max_table + 1, 1)
    binss = np.arange(min_table, max_table + 1, 1)

    # グラフを描画
    plt.figure(figsize=(10, 6))

    ## 棒グラフのプロット
    ## for i in range(len(values)):
    ##     color = 'red' if counts[i] > 11 else 'blue'  # 出現回数が11を超えている棒は赤、それ以外は青
    ##     plt.bar(values[i], counts[i], width=1, color=color, edgecolor='black')


    # 棒グラフのプロット
    print('---------------------------------------')
    print('binssを変えると棒の高さが変わるらしい!')
    print('---------------------------------------')
    #OKK # plt.bar(values, counts, color='blue')
    #OKK # plt.hist(table, bins=20, color='blue', edgecolor='black')  # ビン数を調整
    #OKK plt.hist(table, bins=300, color='blue', edgecolor='black')  # ビン数を調整
    # plt.hist(values, bins=bins, weights=counts, color='blue', edgecolor='black', alpha=0)  # 一旦透明でプロット
    print('plt.hist は度数(ある程度まとめられた値、例えば130円が100回、131円が200回なら、130-131円の度数で300回みたいな')
    print('---------------------------------------')

    plt.hist(values, bins=binss, weights=counts, color='blue', edgecolor='black', alpha=0.5)  # 一旦透明でプロット

    # 出現回数が11を超えている棒の色を変更
    print('plt.bar は個々のbar、例えば130.1円が10回、130.12円が20回…みたいな細かい1本1本')
    print('---------------------------------------')
    for i in range(len(values)):
        # if counts[i] > 2000: # 2000を超えてるのは度数であって、個々のbarじゃない
        if counts[i] > 120:
            #OKK plt.bar(values[i], counts[i], width=1, color='red', edgecolor='black')
            plt.bar(values[i], counts[i], width=1, color='red', edgecolor='black')
            # 吹き出しコメントをバーの上に表示
            #OKK plt.text(values[i], counts[i] + 0.5, f'{values[i]}円', ha='center', fontsize=8, color='black')
            # 適度にバーから離した位置に表示
            #plt.text(values[i], counts[i] + 0.5, f'{values[i]}円 - {counts[i]}回', ha='center', fontsize=8, color='black')
            plt.text(values[i], counts[i] + 0.8, f'{values[i]}円\n{counts[i]}回', ha='center', fontsize=8, color='black')

        #OKK else:
        #OKK     plt.bar(values[i], counts[i], width=1, color='blue', edgecolor='black')

                                

 

    # グラフのタイトルとラベルを設定
    plt.title('為替レートの度数分布(myKINRIbloom.txt)')
    plt.xlabel('ドル円為替レート')
    plt.ylabel('出現回数')
    # plt.xticks(range(min_rate, max_rate + 1, 1))  # x軸の目盛りを1円単位に設定
    # plt.xticks(range(min_table, max_table + 1, 1))  # x軸の目盛りを1円単位に設定
    plt.xticks(range(min_table, max_table + 1, 1), fontsize=8)

    # x軸の刻みを調整する
    # plt.xticks(rotation=45, ha='right')
    plt.xticks(rotation=60, ha='right')

    # グラフをPNGとして保存
    plt.tight_layout()  # レイアウトを自動調整

    plt.grid(True)
    # plt.legend()

    kawacom = ''
    kawacom = f'{datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")} ({myARG0})'

    #kawacom =  datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S') + ' \n(' + myARG0 + ')'
    #@ kawacom = mySOURCE + '\n' + datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S') + ' \n(' + myARG0 + ')'
    
    ## plt.xlabel(kawacom)
    # コメントをx軸の欄外に追加
    # plt.figtext(0.5, -0.2, kawacom, ha="center", fontsize=10)
    plt.figtext(0.5, 0.01, kawacom, ha="center", fontsize=10)


    myOUT='myKINRIbloom04F.png'
    plt.savefig(myOUT)
    print(f"度数分布表の棒グラフを{myOUT}  に保存しました。")
    print('---------------------------------------')
    # plt.savefig('myKINRIbloom04F.png')
    # print("度数分布表の棒グラフを ' に保存しました。")


# 実行例
filename = 'myKINRIbloom.txt'
print('分析対象: ' + filename)
#OKK # meann = calculate_meann_rate(filename)
#OKK # meann, cnt, skipped_cnt = calculate_meann_rate(filename)
#OKK # meann, cnt, skipped_cnt, mediann = calculate_meann_rate(filename)
#OKK # meann, cnt, skipped_cnt, mediann = calculate_mediann_rate(filename)
#OKK meann, cnt, skipped_cnt, mediann, modee = calculate_modee_rate(filename)
#OKK 
#OKK # if meann is not None:
#OKK if mediann is not None:
#OKK     # print('--------------------------------')
#OKK     print(f"読込み件数: {cnt} 件")
#OKK     print(f"データなし: {skipped_cnt} 件")
#OKK     print(f"為替レートの中央値: {mediann:.2f}")
#OKK     print('--------------------------------')
#OKK else:
#OKK     print("データが見つかりませんでした。")

modee = calculate_modee_rate(filename)
print(modee)

# bash_command =  'cat myKINRIbloom.txt | tail -n 3'
bash_command = 'head -n 2 myKINRIbloom.txt; tail -n 3 myKINRIbloom.txt'

# bashコマンドを実行して、その結果を表示
try:
    # result = subprocess.run(['bash', '-c', 'cat myKINRIbloom.txt | tail -n 3'], capture_output=True, text=True)
    result = subprocess.run(['bash', '-c', bash_command], capture_output=True, text=True)
    # print("\ncat myKINRIbloom.txt | tail -n 3 の結果:")
    print(f"\n {bash_command} の結果:")
    print(result.stdout)
except Exception as e:
    print(f"コマンドの実行中にエラーが発生しました: {e}")

 

 

1,000万円を超えたbitcoinを少しだけどもらえるURL

https://bitflyer.com/invitation?id=l50e5ljw&lang=ja-JP

ハピタスからポイントもらえるURL

その買うを、もっとハッピーに。|ハピタス

 

*1:rates[m1] + rates[m2]) /2)
#            # return None, 0, skipped_count, median
#            # return None, len(rates), skipped_count, median
#        else:
#            print('rates配列の長さNが2で割り切れないつまり')
#            print('為替141円、150円...の全件数が奇数個 の場合は')
#            print('ど真ん中の数が中央値')
#            print('---------------------------------------------')
#            print('Pythonリストは0オリジンなので、添字としての中央値は全体の長さN+1 /2')
#            print('---------------------------------------------')
#            m = (N+1)/2
#            print('Pythonリストは0オリジンなので、添字としてmを使うには1を引く')
#            print('---------------------------------------------')
#            m = int(m) -1
#            median = rates[m]
#        return None, len(rates), skipped_count, median
#
#    else:
#        return None, 0, skipped_count, median


    # # リストが空でなければ平均を計算
    # if rates:
    #     meann_rate = sum(rates) / len(rates)
    #     # return meann_rate
    #     # return meann_rate, len(rates)
    #     return meann_rate, len(rates), skipped_count
    # else:
    #     # return None
    #     return None, 0, skipped_count

def plot_histogram(table):
    # 度数分布表のデータを分離
    values, counts = zip(*table.items(