度数分布表
できた
$ 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(