Life is Like a Boat

忘備録や経済、投資、プログラミングに関するメモやtipsなど

いい加減に覚えたい、よく使うPandas APIレファンレンス1

Pandasで毎回似たような操作するのに、「あれ、この前やったのに、なんだったっけ」と思い出せずに古いJupyter Notebookを検索しています。

いい加減覚えたいのでBlog記事にすることで記憶力を向上させたいと思いますw

生データ(.csv)でこんなデータセットがあったとします。

col1 col2 col3
0 東京 3 x
1 神奈川 4
2 東京 3

col1で東京 が2つあります。1行目のcol3にはxという値があり、3行目には何もありません。1行目の東京を残したい場合にはdrop_duplicatesを使い、col1に基づいた重複としてあげたいので、引数にsubset='col1'と渡してあげます。

df.drop_duplicates(subset='col1', inplace=True)

col1 col2 col3
0 東京 3 x
1 神奈川 4

df.drop_duplicates(subset='col1', keep='last', inplace=True)

keep='last'を渡すと、この場合、3行目がキープされます。

col1 col2 col3
1 神奈川 4
2 東京 3

df.drop_duplicates(subset='col1', keep=False, inplace=True) keep=Falseだと全部の重複がドロップされます。

col1 col2 col3
1 神奈川 4

期待通り神奈川だけが残ってますね。

社会課題をビジネスで解決するスタートアップメモ

先週、千葉県幕張メッセでIT 技術とエレクトロニクスの展示会、シーテックが開催されました。 金曜日のプログラムに、社会課題をビジネスで解決するスタートアップ10社を紹介するセッションがあり、見に行ってきました。

このセッションの目的としては、三菱総研が主催したビジネス・アクセラレーション・プログラム2018に参加した10社が来場者の前で5分間ピッチするというものです。

限られた時間で自社の魅力を来場者に理解してもらうという登壇者のプレゼン能力が参考になりました。

個人的には、AI人事が売りのミライセルフが気になりました。人材採用市場という市場規模の大きさとAI採用による人材サービスがポイントで、すでに蓄積された社内データとの連携など導入支援をうまくクリアすれば、ストックビジネス的に儲けられるのではないかと思います。

下記は登壇した10社のメモです。

OUTSENSE

  • 人が宇宙に住む時代がくる。折り紙を応用して家を折り畳んで広がる技術を宇宙開発に生かす。
  • ソガメ折り-> 紙から剛体にできる。
  • 三次元展開、一点に一方向の力を加えるだけで展開できる。
  • 収納性が高く堅固、モバイルハウスや仮設住居、次世代テントに応用できる。
  • 受託モデルで収益を上げる。

ゴイク電池

  • 電池診断技術を使ったエネルギーマネジメント
  • 電池の容量を計る、劣化度合いの判定をする。1秒で診断できる速さが売り。
  • EV化が進むと自社技術の市場規模が広がる。

Drone Future Aviation

  • 運べないをなくす。生産年齢人口の減少とEC物流の増加が追い風になる。
  • GRIFF135というドローンの独占販売権を保有。 同ドローンは30kgペイロード。
  • YAPEという二輪駆動の陸のドローンを開発。日本郵便と共同で実証試験。
  • 当面ドローンの販社として儲ける。

MAMORIO

  • 世界最小クラスの紛失防止IoTデバイスで「なくすをなくす」何かをなくして悲しむ人がいない世界を目指す
  • 紛失物は年間2000万件
  • デバイスから一定距離離れると通知
  • みんなで探すクラウドトラッキング機能。 ユーザが増えれば増えるほど見つかりやすいネットワーク効果を狙っている。
  • 公共施設の遺失物センターに設置することで紛失物が通知されやすい
  • MAMORIOオフィスコンソールを使い社内備品の管理をする。

ユカイ工学

  • ロボットが実現する高齢者の生き生きとした毎日を実現
  • BOCCO コミュニケーションロボットによる高齢者見守りと情報発信
  • 使用例として、真夏なのにエアコンがついていない、熱中症が疑われるケース。室温センサーとロボットをセットで使う事で介護する側のスマホに通知する。
  • 遠隔地のオペレーターが年寄りに話しかける活用案もある。

トリプル・ダブリュー・ジャパン

  • 排泄予測デバイスの開発
  • 膀胱の大きさをモニタリング 排泄ケア業務の効率化
  • 介護の現場でオムツ使用料減やトイレ誘導の空振りが減ったなど目立った効果があった。

ミライセルフ

  • AI人事時代を目指す。社会全体の適材適所を目指す。
  • AI人事はデータドリブン。属人的な採用をなくし、高コストな採用ミスをなくす。
  • 適性検査により、社風にマッチした人を紹介する求人サービス
  • 適正化された社内配属モデルでの運用

ノーニューフォークスタジオ

  • 歩行解析を行うスマートフットウェアORPHE TRACKの開発
  • センサーが靴の中に入っている。ソール内部に搭載できる。
  • 歩いた一歩の距離、角度など歩行データを収集。応用例として、ランニングフォームの指導やランニングマシンでVRと組み合わせたケースがある。
  • 歩くことを資産にする-> 医療費削減につながる。行動ログを取得し、ノルマ達成したらコインを発行
  • 沖電気社員が実験中。情報銀行と組み合わせて、歩行データを資産化する実証実験の予定。

マッシュルーム

  • Voxという商品名のスマホ制御型の宅配ボックス
  • 捺印不要、全てスマホでコントロールする
  • マッシュルーム社自身が荷主になって発送手続きもする
  • 同社のスマホでの認証技術が元になっている。
  • ソーラーセルで給電する。ネットワーク敷設不要。4000~5000円で設置
  • 活用例はクリーニングの受け渡し、レンタルシェアなど。ネットスーパーと組むことも考えているらしい。

T-ICU

  • 専門医チームによる遠隔集中治療支援ソリューション
  • 全国的な集中治療専門医の不足、さらにICUは大都市部に偏在している。このため、診療レベルの差が大きい。
  • サポートセンターに専門医が待機。バイタル情報や電子カルテ、モニタなどからアドバイスを返す。30のICUを一人で管理することが可能。アメリカで先行事例あり。

安川電機メモ

安川電機が、アナリスト向け説明会のQAを公表しています。

https://www.yaskawa.co.jp/wp-content/uploads/2018/10/QAFY18_2Q_J.pdf

受け答えを読んで、総じてアウトルックはやや強気に感じました。先週発表された決算の数字でも売り込まれる様子はないので、この辺が底値圏ではないかなと思います。 以下QAから気になった点のまとめ。

  • 中国ロボット市場
    • 自動車産業用ロボットでは直接的な競合となる中国メーカーはない。日欧の主要メーカー間の競争で価格下落は発生していない。
    • 自動車の溶接、塗装、ピッキング等の当社が強みを持っている部分での利益率が高い。
    • 中国で顧客の資金繰りの問題で前金が払われず売上が3,4Qにずれ込んでいる。金融緩和の効果で資金繰りが良くなってくるとみている。
    • 製造業における人件費の上昇がロボット化を進める。小型ロボットの価格と現地の直接工員の年収が一致してきた。ロボットを稼働させると周辺装置のコストを含めて2年で投資回収できる。=> 大きな調整は入らないとみている。
  • ACサーボ
    • スマホによる電子決済の世界的な広がり、中華スマホのインドへの輸出拡大、底割れする可能性は見出せない。
    • 半導体向けは5Gに向けたメモリの投資が始まれば11月から年明けにかけて受注回復が期待できる。
    • 受注は19年度2Q頃にはプラスに転じる見込み

ACサーボシステムの理論と設計の実際―基礎からソフトウェアサーボまで (モータエレクトロニクスシリーズ)

ACサーボシステムの理論と設計の実際―基礎からソフトウェアサーボまで (モータエレクトロニクスシリーズ)

  • 作者: 杉本英彦,小山正人,玉井伸三
  • 出版社/メーカー: 総合電子出版社
  • 発売日: 1990/01
  • メディア: 単行本
  • 購入: 1人 クリック: 36回
  • この商品を含むブログを見る

Puppeteerを使って決算発表日をスクレイピングする

3Qの決算発表に向けて色々と準備を進めているところです。

今回は、どの企業がいつ決算を発表するか確実に把握しておきたいです。したがって、どこからかデータを事前に取り込んでおく必要があります。

どのサイトがいいかなとポチポチ経済サイトを見ていたところ、日経が決算発表スケジュールをこんな感じでまとめています。

決算発表スケジュール :企業業績・財務 :マーケット :日経電子版 f:id:nerimplo:20181013205930p:plain

決算種別も書いてあります。よさげなので、Puppeteerを使ってスクレイピングしてみました。

まぁPythonでもできるんですが、最近JavaScriptを書く機会が減ってしまい、リハビリも兼ねてます。

npm installl して node run.js yyyymmdd 例えば、2018年10月15日に決算発表する企業を知りたければ、20181015とします。

実行後、run.jsと同じディレクトリにnikkei_earnings_release_date_20181015.csvが作成されているはずです。

ちなみに、PuppeteerはヘッドレスChromeまたはChromiumを制御するためのハイレベルなAPIを提供するNodeライブラリです。

例えば、

  • スクリーンショットやPDFの生成
  • Webサイトスクレイプ
  • フォームテストの自動化などブラウザを使うテストの自動化

のようなことができます。開発はChrome DevTools のチームが行なっているので、開発の永続性、メンテの質など高く信頼できると思います。

package.json

{
  "name": "EarningsReleaseDateScrapper",
  "version": "0.0.1",
  "description": "",
  "main": "run.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "moment": "^2.20.1",
    "puppeteer": "git://github.com/GoogleChrome/puppeteer.git"
  },
  "devDependencies": {
    "csv": "^3.1.0",
    "csv-writer": "^1.0.0",
    "gulp-env": "^0.4.0",
    "node-env-file": "^0.1.8"
  }
}

run.js

const puppeteer = require('puppeteer');
const fs = require('fs')
const {promisify} = require('util');
const moment = require('moment')
const createCsvWriter = require('csv-writer').createObjectCsvWriter;


const NIKKEI_EARNINGS_URL = "https://www.nikkei.com/markets/kigyo/money-schedule/kessan/?ResultFlag=1&kwd=&KessanMonth=&SearchDate1=2018%E5%B9%B407&SearchDate2=31"
const FAKE_USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/41.0.2228.0 Safari/537.36';


async function go_to_url(page, url) {
    await page.goto(url);
    await page.waitFor(1500);
    return page;
}


async function hasNextPage(page) {
    const pageIndexBoxTop = await page.evaluate(() => {
        return document.querySelector('div.pageIndexBoxTop');
    })

    const hasNextPageLink = await page.evaluate(()=>{
        return document.querySelector('div.pageIndexBoxTop li.nextPageLink a')
    })

    return pageIndexBoxTop && hasNextPageLink;
}

async function scrape_table(page, date) {
    const data = await page.evaluate((date) => {
        return Array.from(document.querySelectorAll('div.m-artcle table tr.tr2')).map((e)=>{
            return [date].concat(Array.from(e.querySelectorAll('td')).map((e)=>{return e.textContent}))
        })
    }, date)
    return data
}

async function click_next_page(page) {
    const nxtPageArrow = await page.$('div.pageIndexBoxTop li.nextPageLink a');
    await nxtPageArrow.click();
    await page.waitFor(3000);
    return page;
}

async function WriteDataToCSV(path, records) {
    const csvWriter = await createCsvWriter({
        path: path,
        header: [0,1,2,3,4,5,6,7,8]
    });

    await csvWriter.writeRecords(records)       // returns a promise
        .then(() => {
            console.log('...Done');
        });
}



(async () => {

    const d = process.argv[2]

    if (d.length != 8) {
        console.log('yyyymmdd形式で日付を入力してください')
        return;
    }

    const year = d.substring(0,4)
    const month = d.substring(4,6)
    const day = d.substring(6,8)

    const NIKKEI_EARNINGS_URL = `https://www.nikkei.com/markets/kigyo/money-schedule/kessan/?ResultFlag=1&kwd=&KessanMonth=&SearchDate1=${year}%E5%B9%B4${month}&SearchDate2=${day}`


    let dataList = []
    const browser = await puppeteer.launch({headless: false});
    let page = await browser.newPage();
    page = await go_to_url(page, NIKKEI_EARNINGS_URL);
    let data = await scrape_table(page, d)

    dataList = dataList.concat(data)

    let flag = await hasNextPage(page);
    while (flag) {
        page = await click_next_page(page)
        data = await scrape_table(page, d)
        dataList = dataList.concat(data)
        flag = await hasNextPage(page);
    }

    console.log(dataList)

    await WriteDataToCSV('./nikkei_earnings_release_date_'+ d +'.csv', dataList);


    await browser.close()


})()

Puppeteer入門 スクレイピング+Web操作自動処理プログラミング

Puppeteer入門 スクレイピング+Web操作自動処理プログラミング

ペッパーは壮大なおもちゃだった

tech.nikkeibp.co.jp

  • ファーストユーザーの更新はゼロ。
  • 故障が多く、運用負担多い
  • 広告塔としての物珍しさがなくなった

これが現実だと思います。ユーザーが使い続けようと思っていないプロダクトだというのは、大変残念な状況です。

開発チームを解散して、せっかくSoftbankが買収したBoston Dynamicsがあるので、そのロボットを福島原発に投入するだとか、人ができないことをさせる方向性に変えたほうがいいんじゃないでしょうか。

PythonからPepperを動かせるハッカソンなどを開催したり、開発側は盛り上げに必死だった記憶があります。しかし、この結果を見ると、壮大な金かかるおもちゃでした。

個人的な思い出は、去年頃、京都駅の地下荷物預け所にあるペッパーに対して 「俺はau使っているが、なんでソフトバンクがauよりいいか言ってみろ」 と言ったら、目真っ赤にされた時です。

Pepperプログラミング 基本動作からアプリの企画・演出まで

Pepperプログラミング 基本動作からアプリの企画・演出まで

SBIのポートフォリオから銘柄名と前日比をスクレイピングするスニペット

まずコードから

Array.from(document.querySelectorAll('div.middleAreaM2 table:nth-of-type(4) > tbody > tr:nth-of-type(2) table tr')).filter((e, idx) => {
    return idx != 0
}).map((e) => {
    return Array.from(e.querySelectorAll('td')).filter((e, idx) => {
        return idx == 1 || idx == 7
    })
}).map((e) => {
    return e.map((e) => {
        return e.textContent
    })
}).map((e) => {
    return e[0] + '(' + e[1] + '%)'
}).join('\n')

結果はこんな感じ。

5301 東海カーボ(-5.78%)
4004 昭電工(-5.58%)
5310 東洋炭素(-5.22%)
5304 SECカーボン (-4.98%)
5302 日本カーボ(-4.15%)

実行するにはSBI証券にアクセスして、

  • SafariだとDevelop -> Web Inspector
  • ChromeだとView -> Developer -> Developer Tools

でコンソールを立ち上げ、上記のコードをコピペして実行できます。

f:id:nerimplo:20181011112303p:plain

map, filter, reduceの高階関数を使うと、色々捗ること多いので、使い方忘れないように頭の体操がてら定期的に復習してます。

書き慣れてないと途中でなにやってるかわからないと思います。

参考Qiita
配列の要素に対する処理には繰り返し構文よりも高階関数を使ってみよう

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

  • 作者: Ethan Brown,武舎広幸,武舎るみ
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2017/01/20
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る

確かな力が身につくJavaScript「超」入門 (確かな力が身につく「超」入門シリーズ)

確かな力が身につくJavaScript「超」入門 (確かな力が身につく「超」入門シリーズ)

自分のLineにPythonからメッセージを送る

まざさんのPythonからSlackに日経先物の手口を送るというブログ記事を読んでいました。 https://www.mazarimono.net/entry/2018/10/05/teguchi

Slackではないですが、前にPythonからLineメッセージを送る実験をやったのを思い出しました。

Line Developersからトークンを取得すれば意外に簡単にできた覚えがあります。

下記URLはその取得方法をまとめたものです。

プロバイダーからチャネルを作成するところが肝だと思います。

以下サンプルコードです。

LINE_ACCESS_TOKENとLINE_USER_IDの環境変数を用意して、TextSendMessageでメッセージ内容のオブジェクトを作り、自分(line_user_id)にpush_messageで送信する感じです。

.env.json

{
  "LINE_ACCESS_TOKEN":"LINE_ACCESS_TOKEN",
  "LINE_USER_ID":"YOUR_LINE_USER_ID"
}

run.py

from linebot import LineBotApi
from linebot.models import TextSendMessage
from linebot.exceptions import LineBotApiError


import json
with open('./.env.json') as f:
    env = json.load(f)

if 'LINE_ACCESS_TOKEN' and 'LINE_USER_ID' in env:
    line_bot_api = LineBotApi(env["LINE_ACCESS_TOKEN"])
    b = '\U0001F30D'
    line_bot_api.push_message(env["LINE_USER_ID"], TextSendMessage(text="おはよーぐると%s" % b))

f:id:nerimplo:20181005205326j:plain