質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3134閲覧

コードの意味がわかりません。教えていただけませんか?

sekibetsu

総合スコア6

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2020/04/18 09:32

編集2020/04/18 10:48

前提・実現したいこと

"Python実践データ分析 100本ノック"という書籍を読んでいるのですが
ノック56で、意味のわからないところがあります(p152)。
codeに問題があるわけではなく、わたしの理解が及ばないので、教えていただきたいです。
(初めての質問です。かつ初心者です。出版社のサイトで質問を受け付けていないようだったので
ここで質問させていただきました。)

■知りたいこと(下記のコードで)
・num_pre はなんのための変数なのでしょうか。
・"# エッジの重みの追加"の以下3行の意味(目的)
```ここに言語を入力

エッジの重みの追加

if num_pre<len(G.edges): num_pre = len(G.edges) weight = 0
・さらにその下のif文, elif文のそれぞれの意味(目的) ```ここに言語を入力 if (df_pos.columns[i] in df_tr.columns)and(df_pos.columns[j] in df_tr.index): if df_tr[df_pos.columns[i]][df_pos.columns[j]]: weight = df_tr[df_pos.columns[i]][df_pos.columns[j]]*size elif(df_pos.columns[j] in df_tr.columns)and(df_pos.columns[i] in df_tr.index): if df_tr[df_pos.columns[j]][df_pos.columns[i]]: weight = df_tr[df_pos.columns[j]][df_pos.columns[i]]*size edge_weights.append(weight)

発生している問題・エラーメッセージ

エラーメッセージ:特にありません。

該当のソースコード

import pandas as pd import matplotlib.pyplot as plt import networkx as nx # データ読み込み df_tr = pd.read_csv('trans_route.csv', index_col="工場") df_pos = pd.read_csv('trans_route_pos.csv') # グラフオブジェクトの作成 G = nx.Graph() # 頂点の設定 for i in range(len(df_pos.columns)): G.add_node(df_pos.columns[i]) # 辺の設定&エッジの重みのリスト化 num_pre = 0 edge_weights = [] size = 0.1 for i in range(len(df_pos.columns)): for j in range(len(df_pos.columns)): if not (i==j): # 辺の追加 G.add_edge(df_pos.columns[i],df_pos.columns[j]) # エッジの重みの追加 if num_pre<len(G.edges): num_pre = len(G.edges) weight = 0 if (df_pos.columns[i] in df_tr.columns)and(df_pos.columns[j] in df_tr.index): if df_tr[df_pos.columns[i]][df_pos.columns[j]]: weight = df_tr[df_pos.columns[i]][df_pos.columns[j]]*size elif(df_pos.columns[j] in df_tr.columns)and(df_pos.columns[i] in df_tr.index): if df_tr[df_pos.columns[j]][df_pos.columns[i]]: weight = df_tr[df_pos.columns[j]][df_pos.columns[i]]*size edge_weights.append(weight) # 座標の設定 pos = {} for i in range(len(df_pos.columns)): node = df_pos.columns[i] pos[node] = (df_pos[node][0],df_pos[node][1]) # 描画 nx.draw(G, pos, with_labels=True,font_size=16, node_size = 1000, node_color='k', font_color='w', width=edge_weights) # 表示 plt.show()

試したこと

書籍のコード通りに実行すれば、きちんとデータ通りにグラフ化されることは確認済みです。
コードには全く問題ないです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/04/18 09:37

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
coco_bauer

2020/04/18 10:18

Pythonはインデント(字下げ)の大小でプログラム要素の区切りを表現するプログラム言語です。 質問に書かれているようなインデントが無い(全部の行が左端に寄っている)のは、Pythonのプログラムではありません。 ちゃんとインデントを大切にして、正しいプログラムを質問に書いてください。 失礼ですが、まずは「初めての」とか「初心者向け」と書かれたPythonの教科書やMookを2,3冊読むことをお勧めします。 インデントのないコードを書く程度の知識で、複雑なプログラムを読むのは早すぎると思います。 まずは基礎知識をつけること! そうしないと、早晩挫折することになります。
sekibetsu

2020/04/18 10:22

有難うございます。もともとはインデントを開けてコードを書いているのですが、ここにコピーをしたら左詰めになってしまいました。今、修正しようとしていますが、初めてなのでうまくいっていないです。もう少しお待ちいただけるとありがたいです。
sekibetsu

2020/04/18 10:49

初質問で、勝手がわかっておりませんが、今修正をかけてみました。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

グラフ理論はわからないので、動作の推測だけですが。
num_pre = 0
により0からスタートして

G.add_edge(df_pos.columns[i],df_pos.columns[j])
for文の中でaddされるedgeに対し

if num_pre<len(G.edges):
記憶しているedge数よりも増えていればif文以下を実行

num_pre = len(G.edges)
新しく今のedgeの数で記憶

とやって、ステップごとにedgeの数が増えるたびに重み付けを行い、edgeの数が増えていなければ(=add_edgeで新規追加されなかったとき?)重み付けはスルーして次のステップに移るという具合だと思います。

投稿2020/04/20 04:00

jeanbiego

総合スコア3966

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sekibetsu

2020/04/20 04:35

有難うございます。大きなヒントをいただきました。初心者のため、いただいたご説明にもとづいて考え直してみます。
sekibetsu

2020/04/23 03:59

ぺんさん、有難うございます。 いただいたアドバイスにもとづいてよく考え直してみたら、理解することができました。 if文をある程度は理解していたつもりだったのですが、不足していたことに気づかせていただきました。 一歩レベルアップした気がします。 本当に有難うございました!
jeanbiego

2020/04/23 05:52

sekibetsuさん、お役に立てたようで良かったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問