読者です 読者をやめる 読者になる 読者になる

Mukku John Blog

取り組んでいること を つらつら と

Power BI Desktop 1月アップデートの内容

Power BI DesktopのUpdateがされたので、試してみました。

powerbi.microsoft.com

どうやら、今年から月末アップデートではなく、
月初めくらいのアップデートになったみたいです。

レポート

レポート部分でのアップデートは4つです。

  • 列見出しのワードラップ
  • ブランク時の条件付き書式
  • 最も古い日付や最近の日付での集計
  • バイルレポートのGA

列見出しのワードラップ

テーブルコントロールの列見出しにワードラップ機能が追加されました。
機能を有効にしておくと、勝手に折り返してくれます。

機能を無効 機能を有効
f:id:MukkuJohn:20170111212712p:plain f:id:MukkuJohn:20170111212812p:plain


ワードラップ機能を有効にするには、書式タブ -> 列見出し -> 右端での折り返し です。
f:id:MukkuJohn:20170111212918p:plain:w300

ブランク時の条件付き書式

テーブルコントロールや、マトリックスコントロールの行列内で
空白の値がある場合に、条件付き書式が設定できるようになりました。

設定なし 設定あり
f:id:MukkuJohn:20170111214045p:plain:h300 f:id:MukkuJohn:20170111214054p:plain:h300


機能を使うには、フィールド -> 設定するフィールド(列)の▽ -> 条件付き書式 です。
f:id:MukkuJohn:20170111214440p:plain:w300


条件付き書式のダイアログの右側で、空白の値に対する書式を設定できます。
f:id:MukkuJohn:20170111214532p:plain:w300

最も古い日付や最近の日付での集計

日付型の最近や最遅で集計が選択できるようになりました。RFM分析がしやすくなったかな?
(テキスト型も選択できるようになってますが、どんな時にうれしい機能なのかさっぱり?)

こんな感じです。
f:id:MukkuJohn:20170111221527p:plain:w300

機能を使うには、フィールド -> 設定するフィールド(列)の▽ です。
f:id:MukkuJohn:20170111221603p:plain:w300

バイルレポートのGA

バイル向けのレイアウト機能がGAされました。

表示タブから選択して、グラフを配置できる機能ですね。
f:id:MukkuJohn:20170111221836p:plain:w300

このグリッド上で、グラフを配置していきます。
f:id:MukkuJohn:20170111221925p:plain:w300


バイルレポートを利用するケースに出会わないですね。
提案機会も無いし、、、。

データコネクタ

1個増えて、1個は機能追加ですね。

Visual Studio Team Service

これ、実際に使う人がいるから増えたんでしょうが、
VSTS上で、クエリから作成する可視化機能で十分な気がしなくもないです。

タスクやバックログの確認を、Power BI側でするシーンが分からないです。

f:id:MukkuJohn:20170111223227p:plain:w300

選択すると、まだ開発中ですと。
f:id:MukkuJohn:20170111223323p:plain:w300

続行すると、アカウントやプロジェクトの情報を求められます。
f:id:MukkuJohn:20170111223343p:plain:w300

SQL Server フェールオーバー サポート

あれ? 今まで無かったってことは、
フェールオーバーするとデータ更新できなくなったんでしょうか。

接続のダイアログを確認すると、一番下にチェックボックスが増えています。
f:id:MukkuJohn:20170111223408p:plain:w300

クエリ編集

SQL Databaseに対して、DirectQueryモードでレポート作っていると
クエリ編集しないんですよね。

機能追加は1個です。

  • Nested Listの展開

Nested Listの展開

これのコメント欄で質問している方がいたので助かりました。
powerbi.microsoft.com

ODataに対して使う時はあるけど、なかなか出会わないなぁ。
1つのフィールドで、こんな形式になっているデータです。

{
 {1,{0,1}},
 {2,{0,1,2}},
 {3,{0,1,2,3}
}

上の形式のデータを、クエリ編集の列見出しから、簡単に展開できるようになりました。
展開を選びます。
f:id:MukkuJohn:20170111230152p:plain:w300

そうすると、リストの最初のデータが展開されます。
f:id:MukkuJohn:20170111230256p:plain:w300

さらに、特定の文字で、リスト内の値を抽出できます。
カンマで抽出します。
f:id:MukkuJohn:20170111230427p:plain:w300

こんな感じですね。
f:id:MukkuJohn:20170111230446p:plain:w300



新年明け初回のアップデートは、量があまり無かったですね。

Power BI Desktop 11月アップデートの内容

Power BI DesktopのUpdateがされたので、試してみました。
powerbi.microsoft.com

レポート

レポート部分での機能追加は、6つあります。
順に追ってみていきます。

  • ドロップダウンスライサ
  • 階層軸
  • マトリックスの条件付き書式
  • 表と行列の列の書式
  • 軸ラベルとタイトルの色の設定
  • バイルレポートのスクロール

ドロップダウンスライサ

スライサにカテゴリ値をマッピングした時のUIは、チェックボックスだけでしたが、
ドロップダウンが追加されました。これでレポートがすっきりします。


スライサの右上で、ドロップダウンを選ぶと、UIが変わります。

f:id:MukkuJohn:20161129125004p:plain:w300 f:id:MukkuJohn:20161129125356p:plain:w300

こんな感じで使えます。(左がチェックボックスのスライサ/右がドロップダウンのスライサ)
f:id:MukkuJohn:20161129125531p:plain:w300

階層軸

ドリルダウンするときに、上の階層のラベルを表示する機能が追加されました。

今までは、下の階層にドリルダウンすると、上の階層が何だっけ?な状態でした。
(左から右にドリルダウンしています。お菓子カテゴリに含まれる商品です。)

f:id:MukkuJohn:20161129131503p:plain f:id:MukkuJohn:20161129131516p:plain


設定をONにすると、上の階層のラベルを表示できるようになりました。
f:id:MukkuJohn:20161129131711p:plain

設定する箇所は、書式 ⇒ 軸 ⇒ ラベルの結合です。
ここをオフにします。(初期値はオンのままです。)
f:id:MukkuJohn:20161129131936p:plain:w300


日付を軸に設定した時は、何月の何日だっけ?って迷子にならなくなりました。
f:id:MukkuJohn:20161129132331p:plain:w500:h200

マトリックスの条件付き書式

マットリックス内の値に基づいた、条件付き書式が設定できるようになりました。

Excelからの置き換えを意識すると、だいたい登場する表です。
f:id:MukkuJohn:20161129135549p:plain:w200:h300

値にマッピングしている項目を選んで、条件付き書式を選びます。
f:id:MukkuJohn:20161129135806p:plain:h400

この画面で設定します。
f:id:MukkuJohn:20161129134338p:plain:w400:h300

デフォルトですと、最小値から最大値にかけて色が変わっていくように設定しますが、
特定の値から特定の値にかけても設定ができます。


画面内の左右逆方向という不思議な日本語のチェックボックスですが、
英語のUIですと、Divergingとなっていました。

チェックをつけることで、中央値が置かれるので、
中央値から、「最小値に向けて」と「最大値に向けて」を分けて設定します。
f:id:MukkuJohn:20161129134935p:plain:w400:h300

設定すると、こんな見映えになります。
f:id:MukkuJohn:20161129135945p:plain:w200:h300

条件付き書式を削除するときは、設定するときと同じように、
値にマッピングしている項目を選んで、条件付き書式の削除を選びます。
f:id:MukkuJohn:20161129140141p:plain:h400

表と行列の列の書式

表の列ごとに、フォントの色背景色が指定できるようになりました。
また、それぞれの列で、ヘッダー行や合計行に適用するか否かを指定できます。

こんな表です。(さっきはマトリックスを使っていましたが、これは表を使っています。)
f:id:MukkuJohn:20161129141207p:plain:w200:h300

設定は書式 ⇒ 列の書式設定 です。ここで列ごとに設定をしていきます。
f:id:MukkuJohn:20161129141708p:plain:h400


こんな感じで、列ごとにフォントの色と背景色が指定できて、
さらに、ヘッダ行と合計行に適用するかどうかも指定できます。
f:id:MukkuJohn:20161129141942p:plain:w200:h300

軸ラベルとタイトルの色の設定

ほとんどのグラフで、軸ラベルの文字色とタイトルの文字色が別々に指定できる
ようになりました。
(色の設定よりかは、文字を大きくしたいんだけど、、、)

こんな感じです。
f:id:MukkuJohn:20161129142553p:plain:w400:h300

設定は、書式 ⇒ です。
f:id:MukkuJohn:20161129142604p:plain:w200:h300

バイルレポートのスクロール

バイル向けのプレビュー画面で、レイアウトを確認する時に、
スクロールしてグラフを配置できるようになりました。

バイル向けのプレビュー画面はここの、レイアウトを変更を選びます。
f:id:MukkuJohn:20161129143159p:plain:w350:h200

そして、このプレビュー画面上で、スクロールできますと。
f:id:MukkuJohn:20161129143241p:plain:w200:h300

分析系

アップデートは、3つです。

クラスタリング

散布図で自動的にクラスタを見つけてくれます。

プレビュー機能ですので、オプションで設定をしておきます。
クラスタリングのところです。)
f:id:MukkuJohn:20161129144616p:plain:w400:h350

クラスタリング機能を有効にしたら、散布図の右上の…のところです。
ここでクラスターの自動検索が行えます。
f:id:MukkuJohn:20161129145054p:plain

選ぶと、クラスタという味気ないダイアログが開きます。
クラスターの数が指定できますが、ここは自動で進みます。
f:id:MukkuJohn:20161129145150p:plain

そうすると、このようにクラスタリングされます。
f:id:MukkuJohn:20161129145344p:plain

フィールドリストには、クラスタリングされたフィールドが追加されています。
f:id:MukkuJohn:20161129145529p:plain:w350:h450

このフィールドの…から、クラスタリングの編集が行えます。
f:id:MukkuJohn:20161129145717p:plain:w350:h500


また、クラスタという味気ないダイアログが開きます。
ここで、クラスターの数を変更して、再度クラスタリングが行えます。
f:id:MukkuJohn:20161129150031p:plain

クラスターの数を3個に変更してみました。
f:id:MukkuJohn:20161129150227p:plain


3軸以上でクラスタリングを行いたい場合は、表を基に行うことができます。
こんな表ですね。
f:id:MukkuJohn:20161129151344p:plain:w300:h300

同じように右上の…から、クラスターの自動検索を選びます。
f:id:MukkuJohn:20161129151405p:plain

同じようにクラスターのフィールドが追加されます。
f:id:MukkuJohn:20161129151506p:plain:w350:h350


新しく追加されたクラスターのフィールドは、さらに分析を進める上で役立ちます。
Power BI Blogでは箱ひげ図のCustom Visualを使っています。

こんな感じですね。クラスタリングされたカテゴリごとの馬力の箱ひげ図です。
R: Motor Trend Car Road Testsデータセットを使っています。
f:id:MukkuJohn:20161129152150p:plain

予測

プレビュー機能からGAされました。またPower BI Serviceで使えるようになっています。

階層軸で使用したこのデータは、毎月5日までのデータしかありません。
f:id:MukkuJohn:20161129154547p:plain

5日以降は、予測値を表示させます。
f:id:MukkuJohn:20161129155016p:plain
データポイントをマウスオーバーすると、予測値や上限値、下限値が表示されます。

設定は、分析のところにあります。
予測の範囲や、信頼区間、色の塗りつぶしなどが指定できます。
f:id:MukkuJohn:20161129155102p:plain:w300:h600

グループの作成UI

先月追加されたグループですが、作成するUIが2か所増えています。
1つ目が、モデリングタブです。
f:id:MukkuJohn:20161129155546p:plain

2つ目が、データ/ドリルタブです。
f:id:MukkuJohn:20161129155617p:plain

データコネクタ

アップデートは、4つです。

  • SparkへのDirect Query(プレビュー)
  • ODataフィードのパフォーマンス向上
  • バイナリ結合の強化
  • Azure Analysis Services

SparkへのDirect Query

Sparkに対して、Direct Queryモードが追加されました。
ただ、プレビュー機能なので、Power BI Serviceからは使用できません。

ODataフィードのパフォーマンス向上

どうやら、ODataの扱いを変えたため、Power BI側に取得するデータ量が少なくなり、
トランザクションが効率的になりました。と。

う~ん、ODataフィードを使っているレポートがあるんだけど、効果を体感できるくらいなのかな。
Power BI Desktop更新してしまったら、以前がどんなだったかも分からない。

バイナリ結合の強化

このリリース前は、各ファイルを1つのテーブルに結合する時に、
ヘッダ行があるテキストファイルかCSVファイルしか対象としてなかったのかな。

ExcelファイルとテキストファイルとCSVファイルの結合を試してみましたが、
エラーになってできませんでした。。。

テキストファイルとCSVファイルの結合はできたんですが、、、
う~む。


Azure Analysis Services

先月発表されたこのサービスに対するコネクタが増えました。
azure.microsoft.com

日本リージョンでは使えないので、まだまだかな。

Webページ

Webページからインポートして作成したデータセットのデータを、
Gatewayを介さずに更新できるように頑張っているみたいです。


クエリ編集

アップデートは、3つです。

  • function Authoring
  • %データタイプ
  • クエリの依存関係ダイアログ

function Authoring

バイナリ結合時に自動的に作られるクエリやクエリから作成される関数ですが、
それらの間で依存関係が作成されるので、クエリを実行すると、関数も更新されるっぽい。

。。。Excelファイルを含めたバイナリ結合上手くいかなかったからなぁ。
このあたりは、あとで調べなおさないとダメだな。

%データタイプ

パーセンテージがデータタイプに増えました。それだけ。
f:id:MukkuJohn:20161129170720p:plain:w300:h400

クエリの依存関係ダイアログ

依存関係のダイアログが、最大化と戻すに対応しました。
f:id:MukkuJohn:20161129171018p:plain


クエリまわりってどれくらい使われているんですかね?
DirectQueryモードでレポート作るほうが多いと、あまり使わないという。。。

最後に

Power BI Serviceに発行しました。


発行して、タグ作るときに気付いたのですが、
いつのまにかpbixファイルがダウンロードできるようになってました。
f:id:MukkuJohn:20161129171610p:plain
とりあえず、ローカルのpbixファイル捨てても大丈夫かな。

Power BI API データプッシュを試してみた

Power BIを扱う機会が増えてきているので、APIを試してみました。
Power BI ダッシュボードにデータをプッシュする | Microsoft Power BI


上記のガイド通りに進めていけば何も問題ないですが、
あまりにも香ばしい箇所があり、きっと誰も使ってないよ!
と思われる部分があったので、ガイドとは変えてみました。


特にこのへんです。サンプルでもそれなりに書いてほしいな

  • APIに送信するデータセットの定義や、データのJSONリテラルで記載している
  • リクエストを、ストリームに書き出している

このへんを、Newtonsoft.Jsonを使ったり、HttpClientを使うように変えています。



ガイドと同様に、下記の手順ですすめます。

  1. アプリをAzureADに登録する
  2. 認証アクセストークンを取得する
  3. データセットを作成する
  4. 行を追加するデータセットを取得する
  5. テーブルに行を追加する

アプリをAzureADに登録する

手順 1: アプリを Azure AD に登録する | Microsoft Power BI

AzureADによる認証機能を使うために行います。PowerBIに限ったことではないですね。

ガイドでは、Power BI専用のAzureAD登録サイトから行うように誘導されますが、
AzureADに直接登録しても同じです。慣れているならこっちの方が早い。

リダイレクトURLは、ガイドでも指定されている、
この値をhttps://login.live.com/oauth20_desktop.srf入力します。
f:id:MukkuJohn:20161113200705p:plain

クライアントIDと、リダイレクトURLは認証する際に使うため、
メモ帳などに貼りつけておきます。

アクセス許可は、これだけ付けておけば良いです。
f:id:MukkuJohn:20161113201010p:plain


AzureADへの登録が終わりましたら、アプリケーションを作っていきます。

認証アクセストークンを取得する

手順 2: 認証アクセス トークンを取得する | Microsoft Power BI

ここでの注意は、Microsoft.IdentityModel.Clients.ActiveDirectoryのバージョンです。
ガイドと同じバージョンでないと、認証に使うメソッドがありません。

ガイド通りパッケージマネージャコンソールに、下記コマンドを入力します。

Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory -Version 2.21.301221612


Microsoft.IdentityModel.Clients.ActiveDirectoryパッケージをインストールしたら、
認証用のクラスを作成していきます。
役割はアクセストークンを取得するだけです。

using System;
using System.Configuration;
using Microsoft.IdentityModel.Clients.ActiveDirectory;

namespace PBIApiDataPushExample
{
    public class AccessToken
    {
        /// <summary>
        /// OAuth2 authority Uri
        /// </summary>
        private const string AuthorityUrl = "https://login.windows.net/common/oauth2/authorize";

        /// <summary>
        /// Resource Uri for Power BI API
        /// </summary>
        private const string ResourceUrl = "https://analysis.windows.net/powerbi/api";

        /// <summary>
        /// AzureADから発行されたクライアントID
        /// </summary>
        private static readonly string ClientID = ConfigurationManager.AppSettings["ClientID"];

        /// <summary>
        /// AzureADに指定したRedirectUrl
        /// </summary>
        private const string RedirectUrl = "https://login.live.com/oauth20_desktop.srf";

        /// <summary>
        /// アクセストークンを取得します
        /// </summary>
        public static string GetToken()
        {
            var authContext = new AuthenticationContext(AuthorityUrl);
            return authContext.AcquireToken(ResourceUrl, ClientID, new Uri(RedirectUrl)).AccessToken;
        }
    }
}

ガイドがメソッドで作成しているのに対して、ここでは、クラスにしているだけです。
AcquireToken()が、Microsoft.IdentityModel.Clients.ActiveDirectory
最新のバージョンだと無くなっています。


試しに実行してみます。
コンソールアプリケーションで作っていますので、
Mainメソッドから作成したGetoToken()を呼びます。

namespace PBIApiDataPushExample
{
    class Program
    {
        /// <summary>
        /// PBIApiDataPushExampleアプリのエンドポイント
        /// </summary>
        /// <param name="args">コマンドライン引数</param>
        static void Main(string[] args)
        {
            string token = AccessToken.GetToken();
        }
    }
}

認証用のダイアログが表示されますので、
アプリを登録したAzureADで利用している組織アカウントを選びます。
f:id:MukkuJohn:20161113203345p:plain

認証が成功すると、アクセストークンが取得できます。
f:id:MukkuJohn:20161113203353p:plain


次はデータセットを作ります。

データセットを作成する

手順 3: Power BI ダッシュボードにデータセットを作成する | Microsoft Power BI

このへんから、リテラルJSON書いてたり、リクエストをストリームに書き出したりと
香ばしくなってきますので、微妙に対応していきます。

まず、JSONを扱うので、
Nugetパッケージの管理からNewtonsoft.Jsonをインストールします。
f:id:MukkuJohn:20161113204143p:plain

Newtonsoft.Jsonに含まれる
JsonConvert.SerializeObject()を使って、オブジェクトからJSON文字列を作成するために、
良い感じにクラス分けする必要があります。


Power BIのデータセットは、下記図のような構成です
f:id:MukkuJohn:20161113210209p:plain

同じ構成にするために、下記クラスに分けました。

  • データセットクラス
  • テーブルクラス
  • 列クラス
  • 列のデータ列挙型(列挙型から文字列に変換する拡張クラス付き)

VSのコードマップで見ると、こんな感じです。
3クラス+1列挙型+列挙型の拡張クラスにしています。
f:id:MukkuJohn:20161113210245p:plain


まずデータセットクラス

using System.Collections.Generic;
using Newtonsoft.Json;

namespace PBIApiDataPushExample
{
    /// <summary>
    /// PowerBIデータセットを表します
    /// </summary>
    public class PBIDataset
    {
        /// <summary>
        /// データセット名
        /// </summary>
        [JsonProperty("name")]
        public string Name { get; set; }

        /// <summary>
        /// テーブルリスト
        /// </summary>
        [JsonProperty("tables")]
        public List<PBITable> Tables { get; set; }

        /// <summary>
        /// PowerBIDatasetオブジェクトを生成します
        /// </summary>
        /// <param name="name">データセット名</param>
        /// <returns>PowerBIDatasetオブジェクト</returns>
        public static PBIDataset Create(string name)
        {
            return new PBIDataset() { Name = name, Tables = new List<PBITable>() };
        }
    }
}


テーブルクラス

using System.Collections.Generic;
using Newtonsoft.Json;

namespace PBIApiDataPushExample
{
    /// <summary>
    /// PowerBIのテーブルを表します
    /// </summary>
    public class PBITable
    {
        /// <summary>
        /// テーブル名
        /// </summary>
        [JsonProperty("name")]
        public string Name { get; set; }

        /// <summary>
        /// 列リスト
        /// </summary>
        [JsonProperty("columns")]
        public List<PBIColumn> Columns { get; set; }

        /// <summary>
        /// PowerBITableオブジェクトを生成します
        /// </summary>
        /// <param name="name">テーブル名</param>
        /// <returns>PowerBITableオブジェクト</returns>
        public static PBITable Create(string name)
        {
            return new PBITable() { Name = name, Columns = new List<PBIColumn>() };
        }
    }
}


列クラス

using Newtonsoft.Json;

namespace PBIApiDataPushExample
{
    /// <summary>
    /// PowerBIの列を表します
    /// </summary>
    public class PBIColumn
    {
        /// <summary>
        /// 名称
        /// </summary>
        [JsonProperty(PropertyName = "name", Order = 1)]
        public string Name { get; set; }

        /// <summary>
        /// 型
        /// </summary>
        /// <remarks>
        /// JSONにする時は、無視します。
        /// </remarks>
        [JsonIgnore]
        public PBIColumnDataTypes PBIDataType { private get; set; }

        /// <summary>
        /// 型文字列
        /// </summary>
        /// <remarks>
        /// 設定は、PBIDataTypeプロパティを使います
        /// JSONにする時は、このプロパティを使います
        /// </remarks>
        [JsonProperty(PropertyName = "dataType", Order = 2)]
        public string PBIDataTypeString
        {
            get
            {
                return this.PBIDataType.ToDataTypeString();
            }
        }

        /// <summary>
        /// PowerBIColumnオブジェクトを生成します
        /// </summary>
        /// <param name="name">名称</param>
        /// <param name="dataType">データ型</param>
        /// <returns>PBIApiDataPushExample</returns>
        public static PBIColumn Create(string name, PBIColumnDataTypes dataType)
        {
            return new PBIColumn() { Name = name, PBIDataType = dataType };
        }
    }
}


列のデータ列挙型と、列挙型の拡張クラス

using System;
using System.Collections.Generic;

namespace PBIApiDataPushExample
{
    /// <summary>
    /// APIでサポートされるデータ型を列挙しています。
    /// </summary>
    /// <remarks>
    /// https://powerbi.microsoft.com/ja-jp/documentation/powerbi-developer-walkthrough-push-data/
    /// </remarks>
    public enum PBIColumnDataTypes
    {
        PBI_Int64,
        PBI_Double,
        PBI_Bool,
        PBI_Datetime,
        PBI_String,
    }

    /// <summary>
    /// PBIColumnDataTypes列挙型の拡張機能を提供します
    /// </summary>
    public static class PBIColumnDataTypesExtensions
    {
        /// <summary>
        /// 列挙型と型文字列の対応
        /// </summary>
        private readonly static Dictionary<PBIColumnDataTypes, string> _PBIColumnDataTypeString =
            new Dictionary<PBIColumnDataTypes, string>()
            {
                { PBIColumnDataTypes.PBI_Int64, "Int64" },
                { PBIColumnDataTypes.PBI_Double, "Double" },
                { PBIColumnDataTypes.PBI_String, "string" },
                { PBIColumnDataTypes.PBI_Bool, "bool" },
                { PBIColumnDataTypes.PBI_Datetime, "DateTime" },
            };

        /// <summary>
        /// 列挙値と型文字列に変換します
        /// </summary>
        /// <param name="candidate">対象</param>
        /// <returns>型文字列</returns>
        public static string ToDataTypeString(this PBIColumnDataTypes candidate)
        {
            if (!_PBIColumnDataTypeString.ContainsKey(candidate))
            {
                throw new ArgumentException("型リストに未登録の型を指定しています。");
            }
            return _PBIColumnDataTypeString[candidate];
        }
    }
}


試しに、データセットオブジェクトを作って、JSON文字列にしてみます。

using System;
using Newtonsoft.Json;

namespace PBIApiDataPushExample
{
    class Program
    {
        /// <summary>
        /// PBIApiDataPushExampleアプリのエンドポイント
        /// </summary>
        /// <param name="args">コマンドライン引数</param>
        static void Main(string[] args)
        {
            string token = AccessToken.GetToken();

            // テーブルオブジェクトを作って、
            var pbi_table = PBITable.Create("テーブル");
            // テーブルオブジェクトに列オブジェクトを追加していきます
            pbi_table.Columns.Add(PBIColumn.Create("名前", PBIColumnDataTypes.PBI_String));
            pbi_table.Columns.Add(PBIColumn.Create("日時", PBIColumnDataTypes.PBI_Datetime));

            // データセットオブジェクトを作って、
            var pbi_dataset = PBIDataset.Create("データセット");
            // テーブルオブジェクトを追加しています
            pbi_dataset.Tables.Add(pbi_table);

            // データセットオブジェクトをJSON文字列に変換します
            string jsonString = JsonConvert.SerializeObject(pbi_dataset);
            Console.WriteLine(jsonString);
            
        }
    }
}


データセットオブジェクトからJSON文字列に変換できたので、
Power BIのAPIに送信してみます。

ガイドでは、リクエストストリームに書き込んでましたが、HttpClientを使います。
パッケージマネージャコンソールを開いて、下記サイトのコマンドを入力してください。
www.nuget.org


データセットクラスに、ApiJson文字列をPostするメソッドを追加します。

/// <summary>
/// Apiへ送信します
/// </summary>
/// <param name="token">トークン</param>
/// <returns>レスポンス</returns>
public HttpResponseMessage SendApi(string token)
{
    using (var httpClient = new HttpClient())
    {
	var request = new HttpRequestMessage(HttpMethod.Post, PBIDatasetApiUrl);
	request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
	request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

	request.Content = new StringContent(JsonConvert.SerializeObject(this), Encoding.UTF8, "application/json");

	return httpClient.SendAsync(request).Result;

    }
}

試してみます。先ほどMainメソッドで作成したpbi_datasetオブジェクトの
SendApiメソッドを呼びます

using System;
//using Newtonsoft.Json;

namespace PBIApiDataPushExample
{
    class Program
    {
        /// <summary>
        /// PBIApiDataPushExampleアプリのエンドポイント
        /// </summary>
        /// <param name="args">コマンドライン引数</param>
        static void Main(string[] args)
        {
            string token = AccessToken.GetToken();

            // テーブルオブジェクトを作って、
            var pbi_table = PBITable.Create("テーブル");
            // テーブルオブジェクトに列オブジェクトを追加していきます
            pbi_table.Columns.Add(PBIColumn.Create("名前", PBIColumnDataTypes.PBI_String));
            pbi_table.Columns.Add(PBIColumn.Create("日時", PBIColumnDataTypes.PBI_Datetime));

            // データセットオブジェクトを作って、
            var pbi_dataset = PBIDataset.Create("データセット");
            // テーブルオブジェクトを追加しています
            pbi_dataset.Tables.Add(pbi_table);

            // 作ったメソッドを呼びます
            var response = pbi_dataset.SendApi(token);
            Console.WriteLine(response.StatusCode);

            //// データセットオブジェクトをJSON文字列に変換します
            //string jsonString = JsonConvert.SerializeObject(pbi_dataset);
            //Console.WriteLine(jsonString);
            
        }
    }
}

まずは、アプリケーションを実行します。成功したようです。
f:id:MukkuJohn:20161113215109p:plain

Power BI Serviceを確認します。指定した通りに、作成されていました。

データセット テーブル、カラム
f:id:MukkuJohn:20161113215154p:plain f:id:MukkuJohn:20161113215202p:plain


作ったデータセットにデータを追加していきたいのですが、データセットのIDを取得する必要があります。

行を追加するデータセットを取得する

手順 4: Power BI テーブルに行を追加するためにデータセットを取得する | Microsoft Power BI

ここもガイドには香ばしさがあふれています。
特に、ここですね。Odata形式でvalue句に入ってくるのは理解できますが、
絶対1番目にないでしょ!

//Get the first id
datasetId = results["value"][0]["id"];

というわけで、レスポンスを見ると、IDとNameがあるみたいです。
f:id:MukkuJohn:20161113222626p:plain


IDとNameがあるのは分かりましたが、POST時とGET時で
エンティティが違うのって、どうなんでしょうね。


しょうがないので、GET時用のクラスを作成しました。

    public class PBIDatasetsGetMethodOnly
    {
        [JsonProperty("value")]
        public PBIDatasetGetMethodOnly[] Values { get; set; }
    }
    public class PBIDatasetGetMethodOnly
    {
        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("id")]
        public string ID { get; set; }
    }


データセットクラスには、IDプロパティを追加します。

    [JsonIgnore]
    public string ID { get; private set; }

ID取得用のメソッドを追加します。

/// <summary>
/// IDを読み込みます
/// </summary>
/// <param name="token">トークン</param>
public void LoadId(string token)
{
    using (var httpClient = new HttpClient())
    {
	var request = new HttpRequestMessage(HttpMethod.Get, PBIDatasetApiUrl);
	request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("appication/json"));
	request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

	var response = httpClient.SendAsync(request).Result;
	var results = JsonConvert.DeserializeObject<PBIDatasetsGetMethodOnly>(response.Content.ReadAsStringAsync().Result);

	this.ID =  (from d in results.Values where d.Name == this.Name select d).FirstOrDefault().ID;

    }
}

試してみますが、何個もデータセット作成されるのは嫌なので、
データセットを作成するメソッド部分はコメントにしておきます。

/// <summary>
/// PBIApiDataPushExampleアプリのエンドポイント
/// </summary>
/// <param name="args">コマンドライン引数</param>
static void Main(string[] args)
{
    string token = AccessToken.GetToken();

    // テーブルオブジェクトを作って、
    var pbi_table = PBITable.Create("テーブル");
    // テーブルオブジェクトに列オブジェクトを追加していきます
    pbi_table.Columns.Add(PBIColumn.Create("名前", PBIColumnDataTypes.PBI_String));
    pbi_table.Columns.Add(PBIColumn.Create("日時", PBIColumnDataTypes.PBI_Datetime));

    // データセットオブジェクトを作って、
    var pbi_dataset = PBIDataset.Create("データセット");
    // テーブルオブジェクトを追加しています
    pbi_dataset.Tables.Add(pbi_table);

    // 作ったメソッドを呼びます
    //var response = pbi_dataset.SendApi(token);
    //Console.WriteLine(response.StatusCode);

    // IDを取得します
    pbi_dataset.LoadId(token);
    Console.WriteLine(pbi_dataset.ID);

    //// データセットオブジェクトをJSON文字列に変換します
    //string jsonString = JsonConvert.SerializeObject(pbi_dataset);
    //Console.WriteLine(jsonString);
    
}
    }

無事データセットのIDが取れました。
f:id:MukkuJohn:20161113224434p:plain

テーブルに行を追加する

手順 5: Power BI テーブルに行を追加する | Microsoft Power BI
ようやくデータを追加するとこまで来ました。

ガイドでは、ここも香ばしいので、
HttpClientを使ったり、オブジェクトからJSON文字列を作るように変えます。


新しいクラスを2個追加します。
作成したデータセットに沿った行クラスと、行を束ねるクラスです。
f:id:MukkuJohn:20161113231158p:plain
今までに作成したクラスには、なんの関連もありません。

クラスの内容がこちら。

using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json;

namespace PBIApiDataPushExample
{
    /// <summary>
    /// 作成したデータセットの行群
    /// </summary>
    public class ExampleDatasetRows
    {
        /// <summary>
        /// 行群
        /// </summary>
        [JsonProperty("rows")]
        public List<ExampleDatasetRow> Rows { get; set; }

        /// <summary>
        /// データセットID
        /// </summary>
        [JsonIgnore]
        public string DataSetID { get; private set; }

        /// <summary>
        /// テーブル名
        /// </summary>
        [JsonIgnore]
        public string TableName { get; private set; }

        /// <summary>
        /// 作ったデータセットの行群オブジェクトを生成します
        /// </summary>
        /// <param name="datasetId">データセットID</param>
        /// <param name="tableName">テーブル名</param>
        /// <returns>作ったデータセットの行群オブジェクト</returns>
        public static ExampleDatasetRows Create(string datasetId, string tableName)
        {
            return new ExampleDatasetRows() { DataSetID = datasetId, TableName = tableName, Rows = new List<ExampleDatasetRow>() };
        }

        /// <summary>
        /// データを追加します
        /// </summary>
        /// <param name="token">トークン</param>
        /// <returns>Apiコール結果</returns>
        public HttpResponseMessage AddData(string token)
        {
            string powerBIApiAddRowsUrl = 
                String.Format("https://api.powerbi.com/v1.0/myorg/datasets/{0}/tables/{1}/rows", this.DataSetID, this.TableName);

            using (var httpClient = new HttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Post, powerBIApiAddRowsUrl);
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

                request.Content = new StringContent(JsonConvert.SerializeObject(this), Encoding.UTF8, "application/json");

                return httpClient.SendAsync(request).Result;
            }
        }
    }

    /// <summary>
    /// 作成したデータセットの行
    /// </summary>
    public class ExampleDatasetRow
    {
        [JsonProperty("名前")]
        public string Name { get; set; }

        [JsonProperty("日時")]
        public DateTime AddDate { get; set; }

    }
}

Mainメソッドに処理を追加して、試してみます。

/// <summary>
/// PBIApiDataPushExampleアプリのエンドポイント
/// </summary>
/// <param name="args">コマンドライン引数</param>
static void Main(string[] args)
{
    string token = AccessToken.GetToken();

    // テーブルオブジェクトを作って、
    var pbi_table = PBITable.Create("テーブル");
    // テーブルオブジェクトに列オブジェクトを追加していきます
    pbi_table.Columns.Add(PBIColumn.Create("名前", PBIColumnDataTypes.PBI_String));
    pbi_table.Columns.Add(PBIColumn.Create("日時", PBIColumnDataTypes.PBI_Datetime));

    // データセットオブジェクトを作って、
    var pbi_dataset = PBIDataset.Create("データセット");
    // テーブルオブジェクトを追加しています
    pbi_dataset.Tables.Add(pbi_table);

    //// データセットオブジェクトをJSON文字列に変換します
    //string jsonString = JsonConvert.SerializeObject(pbi_dataset);
    //Console.WriteLine(jsonString);

    //// 作ったメソッドを呼びます
    //var response = pbi_dataset.SendApi(token);
    //Console.WriteLine(response.StatusCode);

    // IDを取得します
    pbi_dataset.LoadId(token);
    //Console.WriteLine(pbi_dataset.ID);

    // 追加するデータを用意します
    var dataRow = ExampleDatasetRows.Create(pbi_dataset.ID, pbi_table.Name);
    for(int i = 0; i < 30; i++)
    {
	if(i % 5 ==0 )
	{
    	dataRow.Rows.Add(new ExampleDatasetRow() { Name = "サンプル1", AddDate = DateTime.Now });
	}
	else
	{
    	dataRow.Rows.Add(new ExampleDatasetRow() { Name = "サンプル2", AddDate = DateTime.Now.AddDays(-i) });
	}
    }

    // データを追加します
    var response = dataRow.AddData(token);
    Console.WriteLine(response);

}

成功しました。
f:id:MukkuJohn:20161113231922p:plain

Power BI Service側でデータがあるか確認します。
ちゃんとデータが登録されていました。
f:id:MukkuJohn:20161113231951p:plain


作れることは分かったので、API経由で作ったデータセット
Power BI Desktopでレポートと共にアップしたデータセット
比較してみないとですね。



作ったクラスはこちらで全部です。
(ちょっと上にある図と同じです。Main部分は除いています。)
f:id:MukkuJohn:20161113232256p:plain

データセットクラスだけは最終形を載せていないので載せておきます。
それ以外のクラスは、最後に出てるとこから取ればOKです。

using System.Collections.Generic;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Linq;

namespace PBIApiDataPushExample
{
    /// <summary>
    /// PowerBIデータセットを表します
    /// </summary>
    public class PBIDataset
    {
        /// <summary>
        /// データセットApiUrl
        /// </summary>
        private const string PBIDatasetApiUrl = "https://api.powerbi.com/v1.0/myorg/datasets";

        /// <summary>
        /// データセット名
        /// </summary>
        [JsonProperty("name")]
        public string Name { get; set; }

        /// <summary>
        /// テーブルリスト
        /// </summary>
        [JsonProperty("tables")]
        public List<PBITable> Tables { get; set; }

        [JsonIgnore]
        public string ID { get; private set; }

        /// <summary>
        /// PowerBIDatasetオブジェクトを生成します
        /// </summary>
        /// <param name="name">データセット名</param>
        /// <returns>PowerBIDatasetオブジェクト</returns>
        public static PBIDataset Create(string name)
        {
            return new PBIDataset() { Name = name, Tables = new List<PBITable>() };
        }

        /// <summary>
        /// Apiへ送信します
        /// </summary>
        /// <param name="token">トークン</param>
        /// <returns>レスポンス</returns>
        public HttpResponseMessage SendApi(string token)
        {
            using (var httpClient = new HttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Post, PBIDatasetApiUrl);
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

                request.Content = new StringContent(JsonConvert.SerializeObject(this), Encoding.UTF8, "application/json");

                return httpClient.SendAsync(request).Result;
                
            }
        }

        /// <summary>
        /// IDを読み込みます
        /// </summary>
        /// <param name="token">トークン</param>
        public void LoadId(string token)
        {
            using (var httpClient = new HttpClient())
            {
                var request = new HttpRequestMessage(HttpMethod.Get, PBIDatasetApiUrl);
                request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("appication/json"));
                request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

                var response = httpClient.SendAsync(request).Result;
                var results = JsonConvert.DeserializeObject<PBIDatasetsGetMethodOnly>(response.Content.ReadAsStringAsync().Result);

                this.ID =  (from d in results.Values where d.Name == this.Name select d).FirstOrDefault().ID;

            }
        }    
    }

    public class PBIDatasetsGetMethodOnly
    {
        [JsonProperty("value")]
        public PBIDatasetGetMethodOnly[] Values { get; set; }
    }
    public class PBIDatasetGetMethodOnly
    {
        [JsonProperty("name")]
        public string Name { get; set; }

        [JsonProperty("id")]
        public string ID { get; set; }
    }
}

Power BI Desktop 10月アップデートの内容-3

この記事の続きです。
mukkujohn.hatenablog.com

接続先

3つ増えました。

1つ目は、Dynamics 365 for Financials
今まで、業務アプリのスクラッチ開発が主だったので、
Dynamics CRMとか触れたことないんだよなー。しかもfor Financialsって。。。

とりあえず、接続してみます。オンラインサービス部分にあります。
f:id:MukkuJohn:20161108210742p:plain

プレビュー段階だから、ほにゃららと。
f:id:MukkuJohn:20161108211440p:plain

OData URLを入れろと。
f:id:MukkuJohn:20161108211450p:plain

この先は、接続先もないし、データ構造も分からないなので、
ここまでで。


2つ目は、OLEDB
これ需要あるのかな?
あらかた、Microsoftのサービスへは接続先が既に整っているし。。。

その他部分にありますね。
f:id:MukkuJohn:20161108212349p:plain

接続文字列には、UidやPwdを入れるなと。
この後にダイアログが出るから、そこで入れてね。と。
f:id:MukkuJohn:20161108212531p:plain


3つ目は、MixPanel
知らなかったのですが、Webサイトの解析ツールのようです。
mixpanel.com

オンラインサービス部分にあります。
f:id:MukkuJohn:20161108213426p:plain

プレビュー段階なので、ほにゃらら。
f:id:MukkuJohn:20161108213444p:plain

APIキーとパスワードですね。
f:id:MukkuJohn:20161108213459p:plain

関数呼び出しのテーブルパラメータのサポート

新しいクエリ作成時に、テーブル関数が使えるようになったみたいです。

新しいクエリ作成するための入り口は2か所あります。
1つは、データの取得 → 空のクエリ
f:id:MukkuJohn:20161108223849p:plain
もう1つは、
クエリエディターのクエリ部分で右クリック → 新しいクエリ → 空のクエリ
f:id:MukkuJohn:20161108224003p:plain

空のクエリを作成時に、数式バー(?)に関数を入力しますが、
大文字小文字を間違えないように!
Table.Transposeと正しく入力しましょう。
f:id:MukkuJohn:20161108224228p:plain

Table.Transpose()は、テーブルを転置します。
対象のテーブルを選択します。ここでは、カラム名は省略しておきます。理由は後述。
f:id:MukkuJohn:20161108224524p:plain

そして呼び出し!
新しくテーブルが作成されます。
f:id:MukkuJohn:20161108224720p:plain

そしてこのクエリですが、カスタム関数の呼び出しでも使う事ができます。
f:id:MukkuJohn:20161108224852p:plain

とまぁ、こんな機能なのですが、
先ほどカラム名を省略した部分に大きな落とし穴がありました。

新しいテーブルの数式バーを見ると、nullになっている部分があります。
ここですが、列名をリスト形式で指定することができます。
f:id:MukkuJohn:20161108225214p:plain

カラム名を指定するところに戻ります。
リスト形式で指定すれば良いので、こんな形で指定しますよね?
f:id:MukkuJohn:20161108225631p:plain
呼び出すとこうなります。えぇぇぇ
f:id:MukkuJohn:20161108225700p:plain
おい!
リストを囲むな!ダブルクォーテをエスケープするな!と

ならば、
f:id:MukkuJohn:20161108225806p:plain
えい!
f:id:MukkuJohn:20161108225817p:plain
もう何も言うまい。。。

セッションID

ヘルプ出すときに、この情報を付与しろってことですかね。
ファイル → ヘルプ → バージョン情報です。
f:id:MukkuJohn:20161108230240p:plain

この画面のSessionIDのとこです。
f:id:MukkuJohn:20161108230558p:plain


ようやく10/31に出たアップデートの追いかけが終わりました。
しばらくは、Rと戯れたいですね。

Power BI Desktop 10月アップデートの内容-2

この記事の続きです。
mukkujohn.hatenablog.com

データポイントの除外

グラフ上のデータを選択して、除外することができるようになりました。

下のグラフは、R: Motor Trend Car Road Testsデータセットを使っています。
馬力と1ガロンあたり何マイル走れるかの散布図です。
f:id:MukkuJohn:20161107212554p:plain

このグラフ上のデータポイントを選んで、右クリックです。
f:id:MukkuJohn:20161107212935p:plain

含めないを選択すると、グラフから除外されます。
f:id:MukkuJohn:20161107213427p:plain

除外したデータはフィルターで確認できます。
f:id:MukkuJohn:20161107213455p:plain

Rのカスタムビジュアル

ディシジョンツリーと折れ線のForecast範囲がついているカスタムを使ってみました。
驚きなのが、スライサーや他のグラフと連動するところ

まずはディシジョンツリー。よくあるTitanicのデータです。
R: Survival of passengers on the Titanicと違うとこが年齢に数値が入っているくらい。
f:id:MukkuJohn:20161107221959p:plain

スライサーでmaleを選択します。
f:id:MukkuJohn:20161107222613p:plain
Gender=male部分だけになった!

もうね。。。なんだろうね。驚きしかないです。

次にForecast範囲付きの折れ線。
国連加盟国(全加盟国ではないけど)の出生率かな。(UN birth rate)
f:id:MukkuJohn:20161107222846p:plain

マップのバブルを選択します。
日本のバブルを選んでみました。
f:id:MukkuJohn:20161107223150p:plain
これまた、マップのバブルと連動して動きます。


最後にPower BI Serviceに発行してみました。
カスタムビジュアルは、Power BI Service上では動作していますが、
パブリックアクセスにすると、動作しないみたいですね。残念。

Power BI Service上でのカスタムビジュアル
(画像ですが、、、)
f:id:MukkuJohn:20161107223900p:plain

パブリックアクセス版
→にページ移動して、9ページ目と10ページ目にカスタムビジュアルを配置していますが、、、


カスタムビジュアルのサンプルをダウンロードして
クエリの編集を見てみたところ、、、。
f:id:MukkuJohn:20161107224022p:plain
t-jacobm…


次回は、データ接続先とクエリ編集部分ですかね。

Power BI Desktop 10月アップデートの内容-1

10月31日に発表されてましたので、試してみました。
powerbi.microsoft.com
(デモとかで使う準備があったので、更新するの控えてました。)

日付型のスライサー

日付型に設定したフィールドを、スライサーにマッピングする事で使えます。

スライサー データ型
f:id:MukkuJohn:20161106191607p:plain f:id:MukkuJohn:20161106191616p:plain

期間や、~以降、~以前で指定する事ができます。

  • 11/1~11/5
  • 11/2~
  • ~11/4

11/2~11/4の期間を指定してます。
f:id:MukkuJohn:20161106191839p:plain

11/2以降を指定してます。
f:id:MukkuJohn:20161106191852p:plain

グリッド線(プレビュー)

ページにグリッド線を表示させる事ができます。
f:id:MukkuJohn:20161106192551p:plain
グラフを配置する際の手助けですね。

こちらは、編集しているpbixファイル内の全てのページに有効になります。
設定はこちらから。
f:id:MukkuJohn:20161106192721p:plain


プレビュー機能ですので、オプションで有効にする必要があります。
有効にするためには、「ファイル」→「オプションと設定」→「オプション」と進み、
f:id:MukkuJohn:20161106192733p:plain

プレビュー機能」→「グリッド線とグリッドにスナップ」をチェックします。
f:id:MukkuJohn:20161106192744p:plain

データラベル

データラベルの表示位置が変更できるようになりました。

積上棒グラフです。方向は指定できず、位置の指定になります。

積上棒グラフ データラベルのプロパティ
f:id:MukkuJohn:20161106193920p:plain f:id:MukkuJohn:20161106193927p:plain

集合棒グラフです。方向と位置の両方が指定できます。

集合棒グラフ データラベルのプロパティ(方向) データラベルのプロパティ(位置)
f:id:MukkuJohn:20161106194043p:plain f:id:MukkuJohn:20161106194101p:plain f:id:MukkuJohn:20161106194115p:plain

マップグラフ

マップグラフの書式で、バブルサイズを変更できます。
f:id:MukkuJohn:20161106195330p:plain

バブルが小さくて微妙な時に使えますね。

0% 50% 100%
f:id:MukkuJohn:20161106195532p:plain f:id:MukkuJohn:20161106195550p:plain f:id:MukkuJohn:20161106195605p:plain


ズームインのオンオフが切り替えられるようになりました。
f:id:MukkuJohn:20161106195708p:plain

オフを指定すると、離れた地域を選択しても、ズームインしません。

沖縄県のみを選択中 沖縄県と北海道を選択中
f:id:MukkuJohn:20161106200015p:plain f:id:MukkuJohn:20161106200028p:plain

日付型の軸の範囲指定

このような日付型を軸に持つグラフの開始値と終了値が指定できます。
f:id:MukkuJohn:20161106200604p:plain

書式から指定することができます。
f:id:MukkuJohn:20161106200652p:plain

グループ

グループが、グラフ上から作成することができるようになりました。
すごい便利な機能です。

この都道府県ごとの面積(㎢)のグラフをベースに作成していきます。
f:id:MukkuJohn:20161106201356p:plain

データ マッピング
f:id:MukkuJohn:20161106201431p:plain f:id:MukkuJohn:20161106201438p:plain

グループを作成するためには、グラフ上で右クリックして、グループを選択します。
f:id:MukkuJohn:20161106201502p:plain

グループを選択すると、自動でグルーピングされます。
北海道とそれ以外でグループが作成されています。
f:id:MukkuJohn:20161106201810p:plain

フィールドリストや、グラフの凡例にも
作成されたグループが設定されています。

データ マッピング
f:id:MukkuJohn:20161106201845p:plain f:id:MukkuJohn:20161106201853p:plain

自動で作成されたグループを編集するには、
フィールドを選択するか、凡例にマッピングされているグループを選択し、
グループの編集を選択します。

f:id:MukkuJohn:20161106202129p:plain f:id:MukkuJohn:20161106202139p:plain

グループの編集画面が開きます。
f:id:MukkuJohn:20161106202408p:plain

地域ごとに分けてみました。
日本の地域 - Wikipedia
f:id:MukkuJohn:20161106203339p:plain

作ったグループが良くなかったですね。もっと自由に作ればよかった・・・
f:id:MukkuJohn:20161106203545p:plain

ただ、作ったグループフィールドは、使いまわしができます。
スライサーや、軸にマッピングしてみました。
f:id:MukkuJohn:20161106203915p:plain

ビン

ビン詰めですね。ggplot2を使って、ヒストグラムを作成した時と同じ
R: Motor Trend Car Road Testsデータを使っていきます。
mukkujohn.hatenablog.com

上段のグラフは、mpgごとのデータの個数です。
下段のグラフは、データポイントを10個ごとにビン詰したデータの個数です。
f:id:MukkuJohn:20161106212017p:plain

ビン詰めのフィールドの作成方法はグループの作成方法と同じです。
フィールドリストから、ビン詰めするフィールドを選択して、グループを選択します。
f:id:MukkuJohn:20161106212208p:plain

ビンのサイズと、ビン詰めされたフィールドの名前を入力します。
f:id:MukkuJohn:20161106212243p:plain

Top N フィルター

フィルターに新しい種類が増えました。
「~の上位10だけ」とか「~の下位5だけ」の見せ方しますよね。

こちらの3つのグラフは、TopNフィルターを指定しています。
f:id:MukkuJohn:20161106213308p:plain

指定なし f:id:MukkuJohn:20161106213647p:plain f:id:MukkuJohn:20161106213655p:plain


次回は、データポイントの除外やRのカスタムビジュアルを
扱います。

Power BIの軸や凡例の並び順を調べてみた-2

Power BI Desktop

過去記事*1にて、コメントを頂き、
並び順が指定できそうです。
この記事は、並び順を指定して、実際に確認できるまでの記録です。

ちなみに、コメントで誘導されたBlogはこちらです。コメントくれた方もこちらの方?
blogs.msdn.microsoft.com

誘導されたBlogにて記載されていることを試してから、
過去記事のデータで試してみたいと思います。

カレンダーテーブル

必要ですよね。以前、開発していた業務システムでも当然作っていました。
こんなんだったかな。

年月 年月日 曜日番号 曜日 営業日フラグ
2016 201610 10 30 20161030 1 1
2016 201610 10 31 20161031 2 0
2016 201611 11 1 20161101 3 0
2016 201611 11 2 20161102 4 0
2016 201611 11 3 20161103 5 0
2016 201611 11 4 20161104 6 0
2016 201611 11 5 20161105 7 1

あとは、祝日テーブルも作っていました。会社の記念日とかありますしね。
手メンテでした。

年月 年月日 事由
2016 201611 11 3 20161103 文化の日
2016 201611 11 14 20161114 埼玉県民の日

何はともあれ、誘導されたBlogの記事を試していきます。


まずは、モデリングタブで、新しいテーブルをポチっとします。
f:id:MukkuJohn:20161025211459p:plain

数式ペインにこれを記載して、Enter!

カレンダー = CALENDAR("2015/1/1", TODAY())

おぉ、日付が列挙されました。
f:id:MukkuJohn:20161025211747p:plain


列をバシバシ追加していきます。しょうもないことなのですが、
DAX式の=の後ろが、全角スペースだとエラーになります。

#コピペせず、キー打ってたら、うっかり全角のまま
#列追加した時点で、= が表示されていて、「月」を全角で打って、横に移動してみたいな=  FORMAT([Date],"M月")

f:id:MukkuJohn:20161025212623p:plain

全角スペースから半角スペースに直せばよいです。
f:id:MukkuJohn:20161025212840p:plain


ついに待ちにまった並び替えの指定をやってみます。
「月」列を選んだ状態で、「列で並び替え」を押して、「月番号」を選びます。
f:id:MukkuJohn:20161025214056p:plain

・・・うん、まぁそうですよね。
・・・これだけだと分からないので、何かしらデータを追加します。

追加したデータはこちらです。
左側の表は、商品マスタチックに、右側の表は、売上明細チックにしてます。
f:id:MukkuJohn:20161025215616p:plain

データを追加して、リレーションシップを定義します
f:id:MukkuJohn:20161025215805p:plain


x軸に商品名、y軸に数量、凡例に並び替えをした月をマッピングします。
f:id:MukkuJohn:20161025215920p:plain

おぉ
「月」列はテキスト型なのに、1月→9月→10月の順です。
f:id:MukkuJohn:20161025220047p:plain


追加したデータの商品マスタチック商品名を、商品IDで並び替えたいと思います。
並び替え前:カタカナのゴから並んでいます。
f:id:MukkuJohn:20161025220616p:plain

並び替え中
f:id:MukkuJohn:20161025220701p:plain

並び替え後:りんごが先にきています。
f:id:MukkuJohn:20161025220818p:plain

凡例でも軸でも並び替えができました。

過去記事のデータで試してみる

過去記事では、こちらのデータを使いました。

名前 科目 点数
数学 80
国語 60
社会 50
英語 90
理科 70
数学 70
国語 80
社会 60
英語 90
理科 40
数学 10
国語 30
社会 40
英語 20
理科 100

とりあえず取り込みます。
f:id:MukkuJohn:20161025221531p:plain

科目番号列を追加します。
f:id:MukkuJohn:20161025221742p:plain

科目列を、科目番号列で並び替えてみます。
f:id:MukkuJohn:20161025221843p:plain
!?!!?

この列によって既に直感的にまたは間接的に並び替えられている列を
基準としてこの列を並び替えることができません。

日本語を整理すると、こうなりますかね。
この列:科目列
この列によって既に直感的にまたは間接的に並び替えられている列:科目番号列

データソースにある列から、DAX式を使って追加した列で並び替えはできないんでしょうか?

というわけで、科目番号列もデータソース側に用意して、取り込みます。
f:id:MukkuJohn:20161025223122p:plain

並び替えできました。エイ→コク→スウ→リ→シャです。
f:id:MukkuJohn:20161025223302p:plain

軸に科目を、値に点数を、凡例に名前をマッピングします。
f:id:MukkuJohn:20161025223504p:plain
ちゃんと、エイ→コク→スウ→リ→シャで並んでいます。


名称列から番号列を作って、作った番号列で名称列を並び替えるがNGっぽいので
番号列から名称列を作る順番で試してみます。

科目番号列をGroupByした新しいテーブルを作成します。
f:id:MukkuJohn:20161025225226p:plain

科目番号列から、科目列を作ります。
f:id:MukkuJohn:20161025225252p:plain

科目列を、科目番号列で並び替えします。
f:id:MukkuJohn:20161025225314p:plain

リレーションシップを定義します。
f:id:MukkuJohn:20161025225515p:plain

軸に科目を、値に点数を、凡例に名前をマッピングします。
f:id:MukkuJohn:20161025225558p:plain
ちゃんと、エイ→コク→スウ→リ→シャで並んでいます。


よかった!
並び替えが指定できるようになりました!!



頂いたコメントで、MSのBlogに誘導されたので…
↓Tech Summit参加します。しかもブースじゃない方で!!
microsoft-events.jp
de:codeもForesightもブース出展側だったから、楽しめなかったんだよなぁ。
デモがぁデモがぁ
今回は、気楽に楽しめそうです。