Python における Self とは: 実際の例
Python における Self とは: 実際の例
今日は、ジャンク ディメンションと呼ばれるデータ モデリングの概念について話したいと思います。その名前からすると、軽蔑的で避けたくなるテクニックだと思われるかもしれませんが、実際には便利なアプローチです。
実際、私はからの質問に取り組んだのですが、ジャンク ディメンションがそれに対する完璧な解決策でした。一度見て理解すると、自分の仕事に応用できることがたくさん見つかるでしょう。このチュートリアルの完全なビデオは、このブログの下部でご覧いただけます。
目次
ジャンクディメンションとは何ですか?
Kimball と Ross のThe Data Warehouse Toolkit はディメンション モデリングのバイブルの 1 つであり、これを一般にカーディナリティの低いフラグとインジケーターのグループとして定義しています。カーディナリティが低いということは、特定のフィールド内の固有の観測値の数が少ないことを意味します。
この例では、カスタム PC を構築するビジネス用のデータ モデルがあります。データ モデルは注文と請求書に関するものです。また、プロセッサのタイプ、タワー構成のタイプ (コンパクトまたはフル)、および目的(ゲームまたはワークステーション)をキャプチャできるフラグも多数あります。
キッチンのジャンク引き出しの例えを使用してジャンクの寸法を定義する
これらの各フィールドを確認すると、各フィールドに固有の観測値は 2 つだけあります。これは、Kimball が低カーディナリティ フラグと呼ぶものです。彼は、抽象ディメンションを作成することで、ファクト テーブルからフラグを削除し、フラグを有用なディメンション フレームワークに配置できると述べています。
ジャンクの次元をキッチンのジャンク引き出しにたとえるのは適切です。輪ゴム、ホチキスの針、電池、誕生日のろうそくなどが詰まった引き出しを誰もが持っています。これらのアイテムのいずれも、専用の引き出しを持つことを保証することは重要ではありませんが、それらを置く場所を確保する必要があります。
これらを保持すると、ファクト テーブルのサイズが肥大化する可能性があります。100 万件のレコードを含むファクト テーブルがあるとします。私たちはたくさんのコンピューターを構築しましたが、構築するコンピューターごとに、プロセッサー、タワー、および目的にフラグを付ける必要があります。これは、注文された 100 万行の PC に対して、ファクト テーブルに 300 万のフラグがあることを意味します。
ファクトテーブルのサイズの削減
これらをディメンション テーブルに移動し、モデル ID のみにリンクして、ファクト テーブルから 300 万のフラグを削除できます。これを行うには、これらのフラグごとに個別のテーブルを作成すれば機能します。ただし、このプロセスではデータ モデルが複雑になるため、通常は単一列テーブルの使用は避けたいと考えられます。
理想的な解決策は、一般的な方法で関連付けられたカーディナリティの低いフラグが多数あるジャンク ディメンションを使用することです。これらはすべて、構築しているコンピューターの属性に関連していますが、特定のディメンション テーブルに対して通常行うような直接的な方法ではありません。
フォーラムのメンバーの問題を検討する
フォーラムに投稿された具体的なアプリケーションを見てみましょう。メンバーは、Stalled用とActive用の 2 つの異なるフィールドを作成したいと考えていました。クライアントが過去 45 日間にトランザクションを行った場合、アクティブとしてフラグが立てられます。それ以外の場合は、停止しているとフラグが立てられます。
メンバーは、クライアント タイプ (複数注文または単一注文) 用の別のディメンション テーブルも必要でした。アカウントに単一のアカウント番号を使用した履歴の任意の時点で 2 つ以上のトランザクションがあった場合、そのアカウントは複数注文のクライアントとみなされます。また、特定の口座番号に対して注文が 1 つしかない場合、それは単一注文の顧客になります。
したがって、これらが私たちが開発したい 2 つのフラグです。LuckyTemplates に飛び込んで、その方法を考えてみましょう。
ジャンク ディメンションのデータ モデリング
データモデルを見てみましょう。とてもシンプルなデータモデルです。拡張されたDates テーブルとTransactions テーブルがあります。
トランザクション テーブルには、口座番号、請求日、販売数量の3 つのフィールドしかありません。
一般に、変換をソースに近づけることができる場合は、そうします。これはレポート セッション中に動的ではないため、DAXで行う必要はありません。
オプションがある場合は、パワー クエリ、またはデータ ウェアハウス/SQL のいずれかで実行する必要があります。しかし今のところは、そうではなく、単にpower queryで実行していると仮定しましょう。
ジャンク ディメンションのクライアント タイプの特定
最初に行うことは、単一注文トランザクションであるか複数注文トランザクションであるかなど、クライアントのタイプを把握することです。Group By、Count、およびCount Rowsを使用します。
次に、すべてのデータを追加し、それを「すべての行」操作にして、集計されたテーブルではなく、各行の行数を含む最初のテーブルを返すようにします。
結果を見て展開してみましょう。
カスタム列を追加し、それにClient Type という名前を付けて、IF ステートメントを作成できます。ステートメントは、Count が 1 に等しい場合、それは単一の注文であるということです。それ以外の場合は、複数の順序になります。
列をテキスト型に変更するだけです。これで、2 つのディメンションのうちの 1 つがファクト テーブルに設定されました。
2 番目の次元テーブルを完成させましょう。この場合、最新の注文が今日の日付から 45 日以内である場合、クライアントはアクティブであると見なされます。今日から 45 日以内に注文がない場合、クライアントは非アクティブになります。
カスタム列を追加し、その列にTodayという名前を付けます。次に、DateTime.LocalNowを追加して現在の日付と時刻を取得し、次にDate.From を追加して日付部分のみを取得します。
これを日付データ型に変更し、列を先頭に移動しましょう。
2 つの日付列の間で減算を作成する簡単な方法があります。これら 2 つの日付を強調表示し、リボンの[日付]をクリックし、 [日数を減算]をクリックするだけです。
これにより、これら 2 つの日付の差が日数で表示されます。この新しい列に「Days Before Today」という名前を付けます。
次のステップは、今日からの最小日数、つまり各口座番号の最新の注文を見つけることです。その数値が 45 以下の場合、アクティブになります。
もう一度Group By、次にAdvanced、次にAccount Numberを実行しましょう。
繰り返しますが、新しい列名には「すべてのデータ」を使用し、操作には「すべての行」を使用します。
今回は、操作として「 Minimum」を使用して「 Minimum Days Between 」を追加し、その列として「Days Before Today」を追加します。これにより、最新の注文が得られます。
次に、 「すべてのデータ」を展開し、「口座番号」を削除します。
これを展開すると、口座番号の最小間隔が表示されます。
最後に、別のカスタム列を追加し、それをClient Timingという名前にします。Min Days Between が45 以下の場合はActive 、そうでない場合はStalled というWhat-if パラメーターを入力します。
不要な列を削除する
サポートする列がたくさんあるので、[列の選択]をクリックして不要な列を削除しましょう。
Count、Today、Days Before Today、およびMin Days Between列を削除します。これで、元のファクト テーブルと、[Client Type] 列と[Client Timing]列だけが得られました。
これらをファクト テーブルに保持する代わりに、このテーブルを複製しましょう。
重複テーブルをAccount Flagsと呼びます。
[トランザクション] テーブルに戻り、 [クライアント タイプ] フィールドと[クライアント タイミング]フィールドを取り出してみましょう。
これで、元のファクト テーブルとアカウント フラグ テーブルが完成しました。
Account Flags テーブルの場合、 Client Type フィールドとClient Timingフィールドは必要ないので、これらを削除します。これらすべてのフィールドを強調表示し、行を削除し、重複を削除するだけです。
これでジャンク寸法表が完成しました。残っているのは、「Close & Apply」をクリックすることだけです。次のステップは、口座フラグ テーブルの口座番号をトランザクション テーブルの口座番号に接続することです。
Transactions テーブル (ファクト テーブル) と Account Flags テーブル (ジャンク ディメンション テーブル) の間には 1 対多の関係があります。
LuckyTemplates でデータ モデルの関係を構築する
LuckyTemplates でのデータ モデリング: ヒントとベスト プラクティス
結論
Client Timing ディメンションとClient Typeディメンションをキャンバスにドロップし、スライサーに変えてみましょう。これで、メンバーが最初に実行したかったこと、つまりこれらの属性に基づいてスライスすることを正確に実行できるようになりました。
[Multi-Order] をクリックすると、複数の注文があるものだけが残り、[Single-Order] をクリックすると、1 回の購入があるものだけが残ります。
要約すると、これは基本的にジャンク ディメンションとは何か、そしてそれを作成する方法は次のとおりです。これは、効率的な方法でデータ モデルに組み込みたい、カーディナリティの低いさまざまなフラグが多数ある場合に非常に便利な手法です。
すべての行によるグループ化手法は、このようなジャンク ディメンションを作成する場合に非常に役立ちます。いつものように、これがお役に立てば幸いです。
Python における Self とは: 実際の例
R の .rds ファイルからオブジェクトを保存および読み込む方法を学習します。このブログでは、R から LuckyTemplates にオブジェクトをインポートする方法についても説明します。
この DAX コーディング言語チュートリアルでは、GENERATE 関数の使用方法とメジャー タイトルを動的に変更する方法を学びます。
このチュートリアルでは、マルチスレッド動的ビジュアル手法を使用して、レポート内の動的データ視覚化から洞察を作成する方法について説明します。
この記事では、フィルター コンテキストについて説明します。フィルター コンテキストは、LuckyTemplates ユーザーが最初に学習する必要がある主要なトピックの 1 つです。
LuckyTemplates Apps オンライン サービスが、さまざまなソースから生成されたさまざまなレポートや分析情報の管理にどのように役立つかを示したいと思います。
LuckyTemplates でのメジャー分岐や DAX 数式の結合などの手法を使用して、利益率の変化を計算する方法を学びます。
このチュートリアルでは、データ キャッシュの具体化のアイデアと、それが結果を提供する際の DAX のパフォーマンスにどのように影響するかについて説明します。
これまで Excel を使用している場合は、ビジネス レポートのニーズに合わせて LuckyTemplates の使用を開始するのに最適な時期です。
LuckyTemplates ゲートウェイとは何ですか? 知っておくべきことすべて