Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

Power BI で ストリーミングデータ

以下のDocsを試したので備忘録

Power BI のリアルタイム ストリーミング - Power BI | Microsoft Docs

データセット作成

リアルタイムデータセットを作成しておき、データソースを選択する。APIを選択するとPBI側にデータをPOSTできるAPIが作られます。

f:id:StateMachine:20180625155239p:plain

データセットのスキーマを定義します。よくある温度と湿度を追加しておきます。ストリーミングデータなので時間が必要です。

f:id:StateMachine:20180625155809p:plain

POST先のAPIが表示されます。

f:id:StateMachine:20180625155920p:plain

ダッシュボードの作成

リアルタイムデータのタイルを追加します。

f:id:StateMachine:20180625160129p:plain

データセットを選択し、表示するグラフの詳細を定義します。以下の場合ですと、温度を5分枠で折れ線グラフ表示することになります。

f:id:StateMachine:20180625160254p:plain

さらに湿度グラフと、テキストを表示するタイルを追加して、全体的に以下のようなレイアウトを実装します。

f:id:StateMachine:20180625160509p:plain

それっぽいデータの用意

データの用意が面倒ですので、以下より適当に温度と湿度を含むデータ(CSV)をダウンロードしておきます。

気象庁|過去の気象データ・ダウンロード

リアルタイムデータですので、このデータの時間軸は無視しておきます。

POSTするプログラム

適当にCSVからデータを読み込んでJSONでPOSTするプログラムを作成します。 先ほども述べたとおりPOSTするときは現在時刻にしておきます、1秒間隔でPOSTしていきます。 POST時の制限は、DocsのURLからたどれます。

ちょと動かすだけなら、適当にランダムな値をPOSTするだけでも問題ないと思いますけど、なんとなく意味ある値にしたかったので気象データ使いました。

  class Program
    {
        string uri = "https://api.powerbi.com/beta/.....";

        static void Main(string[] args)
        {
            new Program().Run().GetAwaiter().GetResult();
        }

        public async Task Run()
        {
            using (var reader = File.OpenText("data.csv"))
            {
                // Skip headers
                for (int i = 0; i < 6; i++) reader.ReadLine();
                var csv = new CsvReader(reader);
                while (await csv.ReadAsync())
                {
                    DateTime now = DateTime.Parse(csv[0]);
                    double tempu = double.Parse(csv[1]);
                    double humid = double.Parse(csv[9]);

                    var ds = new StreamingDataset()
                    {
                        Datetime = DateTime.Now,
                        Temperature = tempu,
                        Humidity = humid
                    };

                    await Post(ds);
                    await Task.Delay(TimeSpan.FromMilliseconds(1000));
                    Console.WriteLine($"{now} : {tempu} {humid}");
                }
            }
            Console.ReadLine();
        }

        private async Task Post(StreamingDataset ds)
        {
            var client = new HttpClient();
            var content = JsonConvert.SerializeObject(ds);
            await client.PostAsync(uri, new StringContent(content));
        }
    }
    public class StreamingDataset
    {
        [JsonProperty("datetime")]
        public DateTime Datetime { get; set; }

        [JsonProperty("temperature")]
        public double Temperature { get; set; }

        [JsonProperty("humidity")]
        public double Humidity { get; set; }
    }

実行結果

プログラムを実行するとPBIのDashboardがニョロニョロと動き始めます。

f:id:StateMachine:20180625161351p:plain

とりあえず、データソースが直接データをPOSTできるなら、これもありでしょうか。

以上。