mysqlでのfloat

floatは4バイト、Dobuleは8バイト

mysql> CREATE TABLE google.float_test (
    -> id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> num FLOAT(10, 2)
    -> ) ENGINE = MYISAM;
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO float_test (num) VALUES (1.0), (1.1),(1.11),(1.111);
Query OK, 4 rows affected (0.13 sec)
Records: 4  Duplicates: 0  Warnings: 0

データを確認

mysql> select * from float_test;
+----+------+
| id | num  |
+----+------+
|  1 | 1.00 |
|  2 | 1.10 |
|  3 | 1.11 |
|  4 | 1.11 |
+----+------+
4 rows in set (0.00 sec)
CREATE TABLE google.float_test (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	num FLOAT(6, 2)
) ENGINE = MYISAM;

INSERT INTO float_test (num) VALUES (1.0), (10.1),(100.11),(1000.111);

mysql> select * from float_test;
+----+---------+
| id | num     |
+----+---------+
|  1 |    1.00 |
|  2 |   10.10 |
|  3 |  100.11 |
|  4 | 1000.11 |
+----+---------+
4 rows in set (0.00 sec)

どうやらfloat(n.y) のnは全体の桁数、yは小数点以下の桁数ですね。

mysqlでENGINE = MYSAMを指定しない場合

tableを作ります。

CREATE TABLE google.MYISAM (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR (60) NOT NULL
) ENGINE = MYISAM;

CREATE TABLE google.NONE_MYISAM (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR (60) NOT NULL
);
mysql> show tables;
+------------------+
| Tables_in_google |
+------------------+
| MYISAM           |
| NONE_MYISAM      |
+------------------+
2 rows in set (0.00 sec)

こちらのコマンドで、ストレージエンジンにMYISAMが使われているか、確認できます。

mysql> SELECT
    -> TABLE_SCHEMA,
    -> TABLE_NAME,
    -> ENGINE
    -> FROM
    -> information_schema.TABLES
    -> WHERE
    -> TABLE_SCHEMA NOT IN(
    ->
Display all 770 possibilities? (y or n)
    -> 'information_schema',
    ->
Display all 770 possibilities? (y or n)
    -> 'performance_schema',
    ->
Display all 770 possibilities? (y or n)
    -> 'mysql'
    -> );

以下のように、MYISAMを指定しない場合は、InnoDBのエンジンが使われていますね。

mysql> drop table MYISAM, NONE_MYISAM;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
Empty set (0.00 sec)

ENGINE = MYSAMとは

MYSAMとは、ストレートエンジンのこと。データの保存処理を行っており、MySQLでは「InnoDB」と「MyISAM」が有名。
MySQL5.5以上は、InnoDBがデフォルト。

違いは、InnoDBは対象のレコードに対してロックを行い、MyISAMは対象のテーブルに対してロックを行う。

まず、バージョン確認。

[vagrant@localhost map]$ mysql -v
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.34 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Reading history-file /home/vagrant/.mysql_history
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql 5.6.34です。

続いて、databaseを作ります。

create database google;
use google;

ここで、テーブルを作る際に、MYISAMを指定します。

CREATE TABLE google.makers (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR (60) NOT NULL
) ENGINE = MYISAM;

財務諸表から、メガバンクのPearson分析をPHPでしてみる

全銀協の平成28年度「全国銀行資本金、店舗数、銀行代理業者数、役職員数一覧表」、「銀行別諸比率表」から、
みずほ、MUFJ、SMBC、りそなのピアソン相関。
項目は、資本金(単位10億), 国内本支店,出張所,海外支店, 海外出張所, 役員数,職員数,預貸率,預証率,経常利益,利益率
$mizuho = [1404,471,45,25,17,20,24957,60.5,26.5,6.4,24.4];
$mufj = [1711,685,67,33,39,25,31694,55.9,29.0,6.2,28.1];
$smbc = [1770,506,431,18,20,29,27904,64.1,20.7,11.6,38.5];
$risona = [279,275,72,0,0,10,9788,72.3,12.5,10.8,36.2];

require_once 'vendor/autoload.php';

use Phpml\Math\Statistic\Correlation;

/*
資本金(単位10億), 国内本支店,出張所,海外支店, 海外出張所, 役員数,職員数,預貸率,預証率,経常利益,利益率
*/

$mizuho = [1404,471,45,25,17,20,24957,60.5,26.5,6.4,24.4];
$mufj = [1711,685,67,33,39,25,31694,55.9,29.0,6.2,28.1];
$smbc = [1770,506,431,18,20,29,27904,64.1,20.7,11.6,38.5];
$risona = [279,275,72,0,0,10,9788,72.3,12.5,10.8,36.2];

$mizuho_mufj = Correlation::pearson($mizuho, $mufj);
echo 'みずほ MUFJ: '.$mizuho_mufj.'<br>';
$mizuho_smbc = Correlation::pearson($mizuho, $smbc);
echo 'みずほ SMBC: '.$mizuho_smbc.'<br>';
$mizuho_risona = Correlation::pearson($mizuho, $risona);
echo 'みずほ りそな: '.$mizuho_risona.'<br>';
$mufj_smbc = Correlation::pearson($mufj, $smbc);
echo 'MUFJ SMBC: '.$mufj_smbc.'<br>';
$mufj_risona = Correlation::pearson($mufj, $risona);
echo 'MUFJ りそな: '.$mufj_risona.'<br>';
$smbc_risona = Correlation::pearson($smbc, $risona);
echo 'SMBC りそな: '.$smbc_risona.'<br>';
?>

結果はこちら。

みずほ・MUFJはお互いに似ており、SMBCはみずほと、りそなはMUFJと似ていると出た。
まーイメージ通りでしょうか。。。

Pearson statistic

相関係数は、Excelでやりましたが、まあ一応。

<?php

require_once 'vendor/autoload.php';

use Phpml\Math\Statistic\Correlation;

$x = &#91;43, 21, 25, 42, 57, 59&#93;;
$y = &#91;99, 65, 79, 75, 87, 82&#93;;

$pearson = Correlation::pearson($x, $y);
echo $pearson;
?>

PHP・複合線形回帰で伊藤忠商事の適正PERを計算してみた

伊藤忠商事(8001)の適正PERを、競合の売上、純利益との相関から、linear regressionで計算したいと思います。

まず、データセット。
銘柄名,売上,純利益,PER ※単位:10億円

丸紅:8002,7100,155, 6.79%
三菱商事:8058, 6400,440, 9.73%
三井物産:8031, 4300, 306,7.63%
双日:2768, 1500, 40, 7.76%

伊藤忠商事:8001, 4800, 352, ?(実際は7.7%)

<?php

require_once 'vendor/autoload.php';

use Phpml\Regression\LeastSquares;

$samples = &#91;&#91;7100, 155&#93;,
            &#91;6400, 440&#93;,
            &#91;4300,306&#93;,
            &#91;1500, 40&#93;,
			&#93;;
$targets = &#91;6.79,
			9.73,
			7.63,
			7.76&#93;;

$regression = new LeastSquares();
$regression->train($samples, $targets);
echo $regression->predict([4800, 352]);
?>


8.8ぐらいあってもいいと言ってますね。実際は、本日時点で7.7%なので、割安ということです。。

なにこれ?

PHPで複合線形回帰 Complex linear regression

まずはチュートリアル。値の距離を計算するロジックですね。これは好きです。

<?php

require_once 'vendor/autoload.php';

use Phpml\Regression\LeastSquares;

$samples = &#91;&#91;73676, 1996&#93;,
			&#91;77006, 1998&#93;,
			&#91;10565, 2000&#93;,
			&#91;146088, 1995&#93;,
			&#91;15000, 2001&#93;,
			&#91;65940, 2000&#93;,
			&#91;9300, 2000&#93;,
			&#91;93739, 1996&#93;,
			&#91;153260, 1994&#93;,
			&#91;17764, 2002&#93;,
			&#91;57000, 1998&#93;,
			&#91;15000, 2000&#93;&#93;;
$targets = &#91;2000,
			2750,
			15500,
			960,
			4400,
			8800,
			7100,
			2550,
			1025,
			5900,
			4600,
			4400&#93;;

$regression = new LeastSquares();
$regression->train($samples, $targets);
echo $regression->predict([60000, 1996]);
?>

ダウ・ドル円のデータを使い、KNearestNeighborsで日経を予想

NYダウとドル円の前日比の動きを受けて、翌日の日経がどのように変化したかを見たいと思います。
ダウ、ドル円、日経の前日比の時系列データを用意します。
ここでは、2/1から、2/9まで。
ダウ
日付、始値、高値、安値、終値、前日比、前日比%
2018年2月10日 24,190.9 330.44 +1.38% 23,360.289 24,382.138 735,033,934
2018年2月9日 23,860.458 – -4.15% 23,849.228 24,903.679 657,504,273
2018年2月8日 24,893.349 -19.42 -0.08% 24,785.439 25,293.96 504,623,230
2018年2月7日 24,912.771 567.02 +2.33% 23,778.738 24,946.23 823,936,440
2018年2月6日 24,345.751 – -4.6% 23,923.88 25,520.531 714,449,396
2018年2月3日 25,520.96 -665.75 -2.54% 25,490.66 26,061.791 522,877,741
2018年2月2日 26,186.708 37.32 +0.14% 26,014.439 26,306.701 410,622,631
2018年2月1日 26,149.39 72.50 +0.28% 26,050.978 26,338.029 471,203,651

ドル円
日付、始値、高値、安値、終値、前日比、前日比%
18/02/13 108.60 108.79 107.42 107.80 -0.99 -0.9 0
18/02/09 108.75 109.30 108.05 108.79 +0.06 +0.1 0
18/02/08 109.59 109.78 108.59 108.73 -0.88 -0.8 0
18/02/07 109.55 109.72 108.92 109.61 +0.04 0.0 0
18/02/06 109.23 109.65 108.45 109.57 +0.27 +0.2 0
18/02/05 110.10 110.29 109.14 109.30 -0.83 -0.8 0
18/02/02 109.29 110.48 109.25 110.13 +0.86 +0.8 0
18/02/01 109.17 109.75 109.11 109.27 +0.10 +0.1 0

日経平均
日付、始値、高値、安値、終値、前日比、前日比%
18/02/13 21,633.34 21,679.20 21,211.53 21,244.68 -137.94 -0.6 1,962,390,000
18/02/09 21,507.74 21,510.30 21,119.01 21,382.62 -508.24 -2.3 2,137,480,000
18/02/08 21,721.57 21,977.03 21,649.70 21,890.86 +245.49 +1.1 1,820,420,000
18/02/07 22,001.29 22,353.87 21,627.13 21,645.37 +35.13 +0.2 2,336,290,000
18/02/06 22,267.00 22,277.45 21,078.71 21,610.24 -1,071.84 -4.7 3,155,710,000
18/02/05 22,921.16 22,967.69 22,659.43 22,682.08 -592.45 -2.5 1,881,890,000
18/02/02 23,361.67 23,367.96 23,122.45 23,274.53 -211.58 -0.9 1,702,440,000
18/02/01 23,276.10 23,492.77 23,211.12 23,486.11 +387.82 +1.7

それで、NYダウが+1.38%、ドル円が-0.9動いたときに、翌日nikkeiがどうなるかKNearestNeighborsで算出

<?php

require_once 'vendor/autoload.php';

use Phpml\Classification\KNearestNeighbors;

/* 
ダウ
2018年2月10日	24,190.9	330.44	+1.38%	23,360.289	24,382.138	735,033,934
2018年2月9日	23,860.458	-	-4.15%	23,849.228	24,903.679	657,504,273
2018年2月8日	24,893.349	-19.42	-0.08%	24,785.439	25,293.96	504,623,230
2018年2月7日	24,912.771	567.02	+2.33%	23,778.738	24,946.23	823,936,440
2018年2月6日	24,345.751	-	-4.6%	23,923.88	25,520.531	714,449,396
2018年2月3日	25,520.96	-665.75	-2.54%	25,490.66	26,061.791	522,877,741
2018年2月2日	26,186.708	37.32	+0.14%	26,014.439	26,306.701	410,622,631
2018年2月1日	26,149.39	72.50	+0.28%	26,050.978	26,338.029	471,203,651

ドル円
日付、始値、高値、安値、終値、前日比、前日比%
18/02/13	108.60	108.79	107.42	107.80	-0.99	-0.9	0
18/02/09	108.75	109.30	108.05	108.79	+0.06	+0.1	0
18/02/08	109.59	109.78	108.59	108.73	-0.88	-0.8	0
18/02/07	109.55	109.72	108.92	109.61	+0.04	0.0	0
18/02/06	109.23	109.65	108.45	109.57	+0.27	+0.2	0
18/02/05	110.10	110.29	109.14	109.30	-0.83	-0.8	0
18/02/02	109.29	110.48	109.25	110.13	+0.86	+0.8	0
18/02/01	109.17	109.75	109.11	109.27	+0.10	+0.1	0

日経平均
日付、始値、高値、安値、終値、前日比、前日比%
18/02/13	21,633.34	21,679.20	21,211.53	21,244.68	-137.94	-0.6	1,962,390,000
18/02/09	21,507.74	21,510.30	21,119.01	21,382.62	-508.24	-2.3	2,137,480,000
18/02/08	21,721.57	21,977.03	21,649.70	21,890.86	+245.49	+1.1	1,820,420,000
18/02/07	22,001.29	22,353.87	21,627.13	21,645.37	+35.13	+0.2	2,336,290,000
18/02/06	22,267.00	22,277.45	21,078.71	21,610.24	-1,071.84	-4.7	3,155,710,000
18/02/05	22,921.16	22,967.69	22,659.43	22,682.08	-592.45	-2.5	1,881,890,000
18/02/02	23,361.67	23,367.96	23,122.45	23,274.53	-211.58	-0.9	1,702,440,000
18/02/01	23,276.10	23,492.77	23,211.12	23,486.11	+387.82	+1.7

*/

$dow_usyen = &#91;&#91;0.28, 0.1&#93;,&#91;0.14, 0.86&#93;,&#91;-2.54, -0.8&#93;,&#91;-4.6, 0.2&#93;,&#91;2.33, 0&#93;,&#91;-0.08, 0.8&#93;,&#91;4.15,0.1&#93;&#93;;
$nikkei = &#91;'-0.9', '-2.5', '-4.7', '0.2', '1.1', '-2.3','-0.6'&#93;;

$classifier = new KNearestNeighbors();
$classifier->train($dow_usyen, $nikkei);

echo $classifier->predict([1.38, -0.9]);


アルゴリズムでは、-0.9が近いと言っています。。。
なにこれ!

phpでKNearestNeighbors

まずはチュートリアルから。

<?php

require_once 'vendor/autoload.php';

use Phpml\Classification\KNearestNeighbors;

$sample = &#91;&#91;1, 3&#93;,&#91;1, 4&#93;,&#91;2, 4&#93;,&#91;3, 1&#93;, &#91;4,1&#93;, &#91;4, 2&#93;&#93;;
$labels = &#91;'a', 'a', 'a', 'b', 'b', 'b'&#93;;

$classifier = new KNearestNeighbors();
$classifier->train($sample, $labels);

echo $classifier->predict([3, 2]);


これ、ほんまかいな?

php-ai/php-ml

composerでphp-ai/php-mlをインストール。
ちなみに、php-ai/php-mlはphp7.1でないと入れられないようです。

[vagrant@localhost ml]$ composer require php-ai/php-ml
Using version ^0.6.2 for php-ai/php-ml
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing php-ai/php-ml (0.6.2): Downloading (100%)
Writing lock file
Generating autoload files

これは。。。興奮しますね。