序文
Python モジュールを使用してpyecharts
データの視覚化を実現し、処理後のデータを折れ線グラフ、マップ、ヒストグラムの形式で表示する方法を学習しました。この記事では、データの視覚化を実現するためのアイデアの組み合わせ方法を例を使用して共有します面向对象
。
データの可視化を実現するプロセス
-
データの収集: 視覚化する必要があるデータを収集し、データの正確性と完全性を確認します。データは、データベース、ログ ファイル、API などのさまざまなソースから取得できます。
-
データのクリーニングと並べ替え: 重複値の削除、欠損データの処理、外れ値の処理など、収集されたデータのクリーニングと並べ替えを行います。データの品質と一貫性を確保します。
-
適切な視覚化ツールを選択する: データのタイプとニーズに基づいて、適切な視覚化ツールを選択します。一般的な視覚化ツールには、Tableau、Power BI、matplotlib、D3.js などが含まれます。
-
視覚化タイプの選択: データの特性と式の要件に応じて、適切な視覚化タイプを選択します。一般的な視覚化タイプには、棒グラフ、折れ線グラフ、散布図、円グラフ、レーダー チャートなどが含まれます。
-
ビジュアル インターフェイスを設計する: データの特性と視覚化の種類に応じて、適切なビジュアル インターフェイスを設計します。インターフェイスは、主要なデータの表示と比較に重点を置き、簡潔かつ明確である必要があります。
-
チャートを描画する: 選択した視覚化ツールを使用して、設計された視覚的なチャートを描画します。要件に応じて、適切な凡例、ラベル、タイトルなどを追加して、グラフの読みやすさと理解しやすさを高めます。
-
データの対話と分析: マウスをホバーしてデータの詳細を表示したり、チャート要素をクリックしてフィルタリングしたりするなど、対話型の機能をビジュアル インターフェイスに追加します。インタラクティブ機能を通じて、ユーザーはデータをさらに分析および探索できます。
-
調整と最適化: ユーザーのフィードバックや要求の変化に応じて、ビジュアル インターフェイスを調整および最適化します。グラフのスタイルを変更したり、対話性を向上させたり、新しいデータ ディメンションを追加したりすることができます。
-
共有と公開: 完成した視覚化結果を共有および公開します。静的画像のエクスポート、レポートの生成、Web ページへの埋め込みによって表示および共有できます。
-
監視と更新: 視覚化結果を定期的に監視し、データを更新し、視覚化結果の適時性と正確性を維持するために視覚化インターフェイスを適時に調整します。
ここでは、データの収集、データのクリーニングと並べ替え、視覚化の種類の選択、グラフの描画について主に説明します。
データの可視化を実現
2か月の売上を例にして、2か月の売上を画像で表示してみましょう。
読み取りデータ
ここではデータをファイルにパックしているので、必要なのはファイルからデータを読み取ることだけです。2 つのファイルの形式が異なるため、一方はcsv
形式、もう一方はJSON
形式が異なるため、データの読み取りと処理の方法も異なります。ここでは、それぞれ異なるデータを読み取り、処理する 2 つの方法があります。
ここでは、後者の 2 つのクラスの使用を容易にするインターフェイスが提供されています。
class FileReader():
def reader(self) -> list[Record]:
pass
インターフェースとは何ですか? インターフェイスとは、クラス内のメソッドがメソッド本体を表すために使用される特定のメソッド本体を持たずpass
、特定のメソッドの実装がそれを継承するサブクラスによって実現されることを意味します。
ファイルを読み取る方法は基本的に同じですが、後続のデータ処理操作については、引き続き 2 つのクラスで実装します。
csv形式ファイルデータの読み込み
class TestFileReader(FileReader):
def __init__(self,path):
self.path = path
def reader(self) -> list[Record]:
f = open(self.path,"r",encoding="UTF8")
data_lines = f.readlines()
f.close()
JSON形式のファイルデータを読み込む
class JsonFileReader(FileReader):
def __init__(self,path):
self.path = path
def reader(self) -> list[Record]:
f = open(self.path,"r",encoding="UTF8")
data_lines = f.readlines()
f.close()
オブジェクトを作成する
各販売情報をオブジェクトとして扱います。
class Record():
def __init__(self,data,order_id,money,province):
self.data = data
self.order_id = order_id
self.money = money
self.province = province
def __str__(self):
return f'{
self.data},{
self.order_id},{
self.money},{
self.province}'
__ init __
プロパティを初期化するコンストラクター。
__ str __
印刷を容易にする方法。
情報処理
データをオブジェクトに変換し、各オブジェクトが販売情報を表し、これらのオブジェクトをリストに保存します。
TestFileReader クラス
class TestFileReader(FileReader):
def __init__(self,path):
self.path = path
def reader(self) -> list[Record]:
f = open(self.path,"r",encoding="UTF8")
data_lines = f.readlines()
f.close()
list1 : list[Record] = []
for line in data_lines:
line = line.strip() # strip方法用来处理每一行数据后面的 \n
data_list = line.split(",")
record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
list1.append(record)
return list1
JsonFileReaderクラス
class JsonFileReader(FileReader):
def __init__(self,path):
self.path = path
def reader(self) -> list[Record]:
f = open(self.path,"r",encoding="UTF8")
data_lines = f.readlines()
f.close()
list1 : list[Record] = []
for line in data_lines:
line = line.strip()
data_dict = json.loads(line) # JSON类型数据转换为python数据类型
record = Record(data_dict["date"],data_dict["order_id"],int(data_dict["money"]),data_dict["province"])
list1.append(record)
return list1
データ分析
同じ日の売上を合計し、それを保存するデータ型として辞書を使用します。なぜ辞書を使用するのでしょうか? ディクショナリのキー値は繰り返しを許可していないため、これは日付に対応し、値は売上に対応します。
test_file = TestFileReader("D:/桌面/2011年1月销售数据.txt")
json_file = JsonFileReader("D:/桌面/2011年2月销售数据JSON.txt")
list1 = test_file.reader()
list2 = json_file.reader()
data_list = list1 + list2 # 将两天的数据综合到一起
data_dict = {
}
for record in data_list:
if record.data in data_dict.keys(): # 如果该日期已经存储了,那么我们将存储的值与当前值相加之后再存入
data_dict[record.data] += record.money
else: # 如果没有出现,那么就直接存入数据
data_dict[record.data] = record.money
ヒストグラムを描く
この例では、データの違いを最もよく示すためにヒストグラムを使用し、任意にヒストグラムを選択します。
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(list(data_dict.keys()))
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False)) # 设置系列配置项来取消柱状图中数据的显示
bar.set_global_opts(
title_opts=TitleOpts(title="2011年1、2月销售情况")
)
bar.render("2021年1、2月销售情况.html")
コード全体とエフェクトの表示
data_define.py ファイル
class Record():
def __init__(self,data,order_id,money,province):
self.data = data
self.order_id = order_id
self.money = money
self.province = province
def __str__(self):
return f'{
self.data},{
self.order_id},{
self.money},{
self.province}'
file_define.py ファイル
from data_define import Record
import json
class FileReader():
def reader(self) -> list[Record]:
pass
class TestFileReader(FileReader):
def __init__(self,path):
self.path = path
def reader(self) -> list[Record]:
f = open(self.path,"r",encoding="UTF8")
data_lines = f.readlines()
f.close()
list1 : list[Record] = []
for line in data_lines:
line = line.strip()
data_list = line.split(",")
record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
list1.append(record)
return list1
class JsonFileReader(FileReader):
def __init__(self,path):
self.path = path
def reader(self) -> list[Record]:
f = open(self.path,"r",encoding="UTF8")
data_lines = f.readlines()
f.close()
list1 : list[Record] = []
for line in data_lines:
line = line.strip()
data_dict = json.loads(line)
record = Record(data_dict["date"],data_dict["order_id"],int(data_dict["money"]),data_dict["province"])
list1.append(record)
return list1
main.py ファイル
from data_define import Record
from file_define import *
from pyecharts.charts import Bar
from pyecharts.options import TitleOpts,LabelOpts,InitOpts
from pyecharts.globals import ThemeType
test_file = TestFileReader("D:/桌面/2011年1月销售数据.txt")
json_file = JsonFileReader("D:/桌面/2011年2月销售数据JSON.txt")
list1 = test_file.reader()
list2 = json_file.reader()
data_list = list1 + list2
data_dict = {
}
for record in data_list:
if record.data in data_dict.keys():
data_dict[record.data] += record.money
else:
data_dict[record.data] = record.money
bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
bar.add_xaxis(list(data_dict.keys()))
bar.add_yaxis("销售额",list(data_dict.values()),label_opts=LabelOpts(is_show=False))
bar.set_global_opts(
title_opts=TitleOpts(title="2011年1、2月销售情况")
)
bar.render("2021年1、2月销售情况.html")