Javascriptの多次元配列

簡単ですね。

<script type="text/javascript">
var array =  { name: 'ジャパンリアルエステイト投資法人'};
console.log( array.name );

var reit =  { name: 'ジャパンリアルエステイト投資法人',
				price: '552,000',
				rate: 3.28
				};
console.log(reit.price)

var reit =  { name: 'ジャパンリアルエステイト投資法人',
				price: {
					investment: 578000,
					NAV: 501776
				}
			};
console.log(reit.price.NAV)
</script>

google map api

すご

<!DOCTYPE html>
<head>
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no" >
	<meta http-equiv="content-type" content="text/html; charset=UTF-8">
	<title>Using Google Maps</title>
	<style>
	#map {
		height: 100%;
	}
	html, body {
		height: 100%;
		margin: 0;
		padding: 0;
	}
	</style>
</head>
<body>
	<div id="map"></div>

	<script>
		var customLabel = {
			restaurant: {
				label: 'R'
			},
			bar: {
				label: 'B'
			}
		};

		function initMap(){
			var map = new google.maps.Map(document.getElementById('map'),{
				center: new google.maps.LatLng(-33.863276, 151.207977),
				zoom: 12
			});
			var infoWindow = new google.maps.InfoWindow;

			downloadUrl('mapmaker.php', function(data){
				var xml = data.responseXML;
				var markers = xml.documentElement.getElementsByTagName('marker');
				Array.prototype.forEach.call(markers, function(markerElem){
					var name = markerElem.getAttribute('name');
					var address = markerElem.getAttribute('address');
					var type = markerElem.getAttribute('type');
					var point = new google.maps.LatLng(
						parseFloat(markerElem.getAttribute('lat')),
						parseFloat(markerElem.getAttribute('lng')));

					var infowincontent = document.createElement('div');
					var strong = document.createElement('strong');
					strong.textContent = name
					infowincontent.appendChild(strong);
					infowincontent.appendChild(document.createElement('br'));

					var text = document.createElement('text');
					text.textContent = address
					infowincontent.appendChild(text);
					var icon = customLabel[type] || {};
					var marker = new google.maps.Marker({
						map: map,
						position: point,
						label: icon.label
					});
					marker.addListener('click', function(){
						infoWindow.setContent(infowincontent);
						infoWindow.open(map, marker);
					});
				});
			});
		}

function downloadUrl(url, callback){
	var request = window.ActiveXObject ?
		new ActiveXObject('Microsoft.XMLHTTP') :
		new XMLHttpRequest;

	request.onreadystatechange = function(){
		if (request.readyState == 4){
			request.onreadystatechange = doNothing;
			callback(request, request.status);
		}
	};

	request.open('GET', url, true);
	request.send(null);
}

function doNothing(){}
</script>
<script async defer
src = "https:maps.googleapis.com/maps/api/js?key=hogehoge&callback=initMap">
</script>
</body>
</html>

php5以上でCall to undefined function domxml_new_doc()

domxml_new_docがundefinedと出てしまった。

[vagrant@localhost map]$ php -v
PHP 5.6.27 (cli) (built: Oct 14 2016 14:06:54)

phpのversionは、5.6

php4.0からサポートされているのに何で?と思ったが、以下のようにphp5以上はDOM extensionを使えとのこと。
It will, however, never be released with PHP 5, and will only be distributed with PHP 4. If you need DOM XML support with PHP 5 you can use the DOM extension. This domxml extension is not compatible with the DOM extension.

こちらのDom Object Model
http://us3.php.net/manual/ja/book.dom.php

new DOMDocument(), createElement, appendChild, setAttribute, saveXMLに修正したら問題なく表示されました。

<?php
require("phpsqlajax_dbinfo.php");

$doc = new DOMDocument("1.0");

$node = $doc->createElement("makers");
$parnode = $doc->appendChild($node);

$connection =mysql_connect('localhost', $username, $password);
if (!$connection){
	die('Not connected : ' . mysql_error());
}

$db_selected = mysql_select_db($database, $connection);
if (!$db_selected){
	die ('Can\'t use db:' . mysql_error());
}

$query = "SELECT * FROM markers WHERE 1";
$result = mysql_query($query);
if(!$result){
	die('Invalid query:' . mysql_error());
}

header("Content-type: text/xml");

while ($row = @mysql_fetch_assoc($result)){
	$node = $doc->createElement("marker");
	$newnode = $parnode->appendChild($node);
	$newnode->setAttribute("name", $row['address']);
	$newnode->setAttribute("lat", $row['lat']);
	$newnode->setAttribute("lng", $row['lng']);
	$newnode->setAttribute("type", $row['type']);
}

$xmlfile = $doc->saveXML();
echo $xmlfile;
?>
<makers>
<marker name="580 Darling Street, Rozelle, NSW" lat="-33.861034" lng="151.171936" type="restaurant"/>
<marker name="76 Wilford Street, Newtown, NSW" lat="-33.898113" lng="151.174469" type="bar"/>
<marker name="Greenwood Plaza, 36 Blue St, North Sydney NSW" lat="-33.840282" lng="151.207474" type="bar"/>
<marker name="7A, 2 Huntley Street, Alexandria, NSW" lat="-33.910751" lng="151.194168" type="bar"/>
<marker name="16 Foster Street, Surry Hills, NSW" lat="-33.879917" lng="151.210449" type="bar"/>
<marker name="43 Macpherson Street, Bronte, NSW" lat="-33.906357" lng="151.263763" type="restaurant"/>
<marker name="60-64 Reservoir Street, Surry Hills, NSW" lat="-33.881123" lng="151.209656" type="restaurant"/>
<marker name="60 Riley Street, Darlinghurst, NSW" lat="-33.874737" lng="151.215530" type="restaurant"/>
</makers>

地図データを入れる

CREATE TABLE google.markers (
	id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	name VARCHAR(60) NOT NULL,
	address VARCHAR(80) NOT NULL,
	lat FLOAT(10, 6) NOT NULL,
	lng FLOAT(10, 6) NOT NULL,
	type VARCHAR(30) NOT NULL
) ENGINE = MYISAM;

INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Love.Fish', '580 Darling Street, Rozelle, NSW', '-33.861034', '151.171936', 'restaurant');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Young Henrys', '76 Wilford Street, Newtown, NSW', '-33.898113', '151.174469', 'bar');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Hunter Gatherer', 'Greenwood Plaza, 36 Blue St, North Sydney NSW', '-33.840282', '151.207474', 'bar');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('The Potting Shed', '7A, 2 Huntley Street, Alexandria, NSW', '-33.910751', '151.194168', 'bar');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Nomad', '16 Foster Street, Surry Hills, NSW', '-33.879917', '151.210449', 'bar');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Three Blue Ducks', '43 Macpherson Street, Bronte, NSW', '-33.906357', '151.263763', 'restaurant');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Single Origin Roasters', '60-64 Reservoir Street, Surry Hills, NSW', '-33.881123', '151.209656', 'restaurant');
INSERT INTO markers (`name`, `address`, `lat`, `lng`, `type`) VALUES ('Red Lantern', '60 Riley Street, Darlinghurst, NSW', '-33.874737', '151.215530', 'restaurant');

where 1 は無条件で全データを抽出という意味。

mysql> select * from markers where 1;
+—-+————————+———————————————–+————+————+————+
| id | name | address | lat | lng | type |
+—-+————————+———————————————–+————+————+————+
| 1 | Love.Fish | 580 Darling Street, Rozelle, NSW | -33.861034 | 151.171936 | restaurant |
| 2 | Young Henrys | 76 Wilford Street, Newtown, NSW | -33.898113 | 151.174469 | bar |
| 3 | Hunter Gatherer | Greenwood Plaza, 36 Blue St, North Sydney NSW | -33.840282 | 151.207474 | bar |
| 4 | The Potting Shed | 7A, 2 Huntley Street, Alexandria, NSW | -33.910751 | 151.194168 | bar |
| 5 | Nomad | 16 Foster Street, Surry Hills, NSW | -33.879917 | 151.210449 | bar |
| 6 | Three Blue Ducks | 43 Macpherson Street, Bronte, NSW | -33.906357 | 151.263763 | restaurant |
| 7 | Single Origin Roasters | 60-64 Reservoir Street, Surry Hills, NSW | -33.881123 | 151.209656 | restaurant |
| 8 | Red Lantern | 60 Riley Street, Darlinghurst, NSW | -33.874737 | 151.215530 | restaurant |
+—-+————————+———————————————–+————+————+————+
8 rows in set (0.00 sec)

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%なので、割安ということです。。

なにこれ?