回答編集履歴

8

2020/09/30 16:50

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -410,7 +410,7 @@
410
410
 
411
411
  ※このPhase2-1と2−2がこのプログラムの一番の鍵です。
412
412
 
413
- ここでやってるのは、「列方向にデータが連続しているセルをFalseにする」という処理です。
413
+ ここでやってるのは、「列方向にTrueが連続しているセルをFalseにする」という処理です。
414
414
 
415
415
  画像処理でいうところの「エッジ検出処理」に近いです。
416
416
 

7

2020/09/30 16:50

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -134,9 +134,17 @@
134
134
 
135
135
  (読む前のポイントとして
136
136
 
137
- `path_df.columns[-1]`は、`path_df`の一番最後の列のインデックスを示します。
137
+ `path_df.columns[-1]`は、`path_df`の一番最後(-1)の列(column)のインデックスを示します。
138
+
139
+
140
+
138
-
141
+ -1の意味は、リストでいう`a[-1]`と同じです。
142
+
143
+
144
+
139
- この例では、`path_df.columns[-1]`は常に「2」という数になっています。
145
+ この例では、path_dfは0、1、2の3列なので、`path_df.columns[-1]`は最後の列である「2」という数になます。
146
+
147
+
140
148
 
141
149
  これ以降`path_df.columns[-1]`という長ったらしい部分が出てきても「2」という数に置き換えればよいので、多少読みやすくなりますね)
142
150
 

6

修正

2020/09/30 16:48

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -184,8 +184,6 @@
184
184
 
185
185
  上記`path_df`のデータのうち**「各pathの末端(葉)だけを残し、それ以外は`NaN`に変換する」**ことです。
186
186
 
187
- このために以降ガチャガチャやっているものと思われます。
188
-
189
187
  この最終目的を頭の片隅に押さえておいてください。
190
188
 
191
189
 
@@ -406,7 +404,7 @@
406
404
 
407
405
  ここでやってるのは、「列方向にデータが連続しているセルをFalseにする」という処理です。
408
406
 
409
- 画像処理でいうところの「エッジ検出処理」に該当します。
407
+ 画像処理でいうところの「エッジ検出処理」に近いです。
410
408
 
411
409
 
412
410
 

5

typo

2020/09/30 16:45

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -184,7 +184,7 @@
184
184
 
185
185
  上記`path_df`のデータのうち**「各pathの末端(葉)だけを残し、それ以外は`NaN`に変換する」**ことです。
186
186
 
187
- このために以降ガチャガチャややしいことをやってるんです。
187
+ このために以降ガチャガチャやってものと思われます。
188
188
 
189
189
  この最終目的を頭の片隅に押さえておいてください。
190
190
 

4

key

2020/09/30 16:19

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -402,6 +402,12 @@
402
402
 
403
403
 
404
404
 
405
+ ※このPhase2-1と2−2がこのプログラムの一番の鍵です。
406
+
407
+ ここでやってるのは、「列方向にデータが連続しているセルをFalseにする」という処理です。
408
+
409
+ 画像処理でいうところの「エッジ検出処理」に該当します。
410
+
405
411
 
406
412
 
407
413
  # [Phase2-2]

3

v

2020/09/30 15:46

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -288,7 +288,7 @@
288
288
 
289
289
  a b c
290
290
 
291
- 0 NaN NaN NaN #行目、行目は、-1行目、0行目との差を計算することになるため、Nanになる。
291
+ 0 NaN NaN NaN #0行目、1行目は、存在しない-2行目、-1行目との差を計算することになるため、Nanになる。
292
292
 
293
293
  1 NaN NaN NaN
294
294
 
@@ -304,7 +304,7 @@
304
304
 
305
305
  そして`axis=1`とすると「行の比較」ではなく「列の比較」になります。
306
306
 
307
- したがって`.diff(-1, axis=1)`とした場合「各データについて、1**列** 後ろのデータとの差」が抽出されます。(-1=負の数なので後ろのデータとの差分になります)
307
+ したがって`.diff(-1, axis=1)`とした場合「各データについて、1**列** **後ろ**のデータとの差」が抽出されます。(-1=負の数なので、前ではなく**後ろ**のデータとの差分になります)
308
308
 
309
309
 
310
310
 
@@ -312,19 +312,19 @@
312
312
 
313
313
 
314
314
 
315
- `True - True = False(0)`
315
+ `True(1) - True(1) = False(0)`
316
-
317
-
318
-
316
+
317
+
318
+
319
- `True - False = True(1)`
319
+ `True(1) - False(0) = True(1)`
320
-
321
-
322
-
320
+
321
+
322
+
323
- `False - True = True(-1)`
323
+ `False(0) - True(1) = True(-1)`
324
-
325
-
326
-
324
+
325
+
326
+
327
- `False - Fase = False(0)`
327
+ `False(0) - False(0) = False(0)`
328
328
 
329
329
 
330
330
 
@@ -358,13 +358,15 @@
358
358
 
359
359
 
360
360
 
361
- に対して、
361
+ これに対して、
362
-
362
+
363
- `path_df.isnull().diff(-1, axis=1)`を適用すると、
363
+ `.diff(-1, axis=1)`を適用すると、
364
+
365
+
366
+
364
-
367
+ 0列目=0列目-1列目、 
365
-
366
-
368
+
367
- 0列目=0列目-1列目1列目1列目-2列目... と演算されるため、
369
+ 1列目1列目2列目...  と演算されるため、
368
370
 
369
371
 
370
372
 

2

2020/09/30 15:42

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -48,26 +48,30 @@
48
48
 
49
49
  print()
50
50
 
51
+
52
+
51
53
  # 重複削除
52
54
 
55
+ path_df = path_df.drop_duplicates()
56
+
53
57
  print("[Phase1-2]重複削除")
54
58
 
55
- path_df = path_df.drop_duplicates()
56
-
57
59
  print(" path_df = path_df.drop_duplicates()")
58
60
 
59
61
  print(" -> path_df:\n",path_df)
60
62
 
61
63
  print()
62
64
 
65
+
66
+
63
67
  # ソート
64
68
 
65
- print("[Phase1-3]ソート")
66
-
67
69
  path_df = path_df.sort_values(path_df.columns.tolist(),
68
70
 
69
71
  na_position='first').reset_index(drop=True)
70
72
 
73
+ print("[Phase1-3](ソート)の完了後の")
74
+
71
75
  print(" -> path_df:\n",path_df)
72
76
 
73
77
  print()
@@ -96,30 +100,30 @@
96
100
 
97
101
  print()
98
102
 
99
- print("[Phase2-2]")
103
+
100
104
 
101
105
  bottom_path_df[path_df.columns[-1]] = ~path_df.isnull()[path_df.columns[-1]]
102
106
 
107
+ print("[Phase2-2] (完了後)")
108
+
103
109
  print(" bottom_path_df[path_df.columns[-1]] = ~path_df.isnull()[path_df.columns[-1]]")
104
110
 
105
111
  print(" -> bottom_path_df:\n",bottom_path_df)
106
112
 
107
113
  print()
108
114
 
109
- print("[Phase2-3]")
115
+
110
116
 
111
117
  bottom_path_df = path_df[bottom_path_df]
112
118
 
119
+ print("[Phase2-3] (完了後)")
120
+
113
121
  print(" bottom_path_df = path_df[bottom_path_df]")
114
122
 
115
123
  print(" -> bottom_path_df:\n",bottom_path_df)
116
124
 
117
125
  print()
118
126
 
119
-
120
-
121
- # print(bottom_path_df)
122
-
123
127
  ```
124
128
 
125
129
 

1

参考を追加

2020/09/30 15:35

投稿

sfdust
sfdust

スコア1137

test CHANGED
@@ -134,7 +134,7 @@
134
134
 
135
135
  この例では、`path_df.columns[-1]`は常に「2」という数になっています。
136
136
 
137
- これ以降`path_df.columns[-1]`という長ったらしく見える部分が出てきても「2」という数に置き換えればよいので、多少読みやすくなりますね)
137
+ これ以降`path_df.columns[-1]`という長ったらし部分が出てきても「2」という数に置き換えればよいので、多少読みやすくなりますね)
138
138
 
139
139
 
140
140
 
@@ -308,19 +308,19 @@
308
308
 
309
309
 
310
310
 
311
- `True-True=False(0)`
311
+ `True - True = False(0)`
312
-
313
-
314
-
312
+
313
+
314
+
315
- `True-False=True(1)`
315
+ `True - False = True(1)`
316
-
317
-
318
-
316
+
317
+
318
+
319
- `False-True=True(-1)`
319
+ `False - True = True(-1)`
320
-
321
-
322
-
320
+
321
+
322
+
323
- `False-Fase=False(0)`
323
+ `False - Fase = False(0)`
324
324
 
325
325
 
326
326
 
@@ -356,7 +356,7 @@
356
356
 
357
357
  に対して、
358
358
 
359
- path_df.isnull().diff(-1, axis=1)を適用すると、
359
+ `path_df.isnull().diff(-1, axis=1)`を適用すると、
360
360
 
361
361
 
362
362
 
@@ -392,7 +392,7 @@
392
392
 
393
393
 
394
394
 
395
- これがPhase2-1終了後のbottom_path_dfの中身です。
395
+ これがPhase2-1終了後の`bottom_path_df`の中身です。
396
396
 
397
397
 
398
398
 
@@ -504,13 +504,15 @@
504
504
 
505
505
  データのインデックスにFalseを指定するとそのデータはNaNになります。
506
506
 
507
-
508
-
509
- path_dfはもともとwalk()関数で得たディレクトリ構造の各データ
507
+ `path_df` 元コード最初の方でwalk()関数で得たディレクトリ構造の各データを保持していま.
510
-
508
+
509
+
510
+
511
- に対して、True/Falseで構成されたbottom_path_dfをインデックスとして適用することで、
511
+ の`path_df`に対して、True/Falseで構成された`bottom_path_df`をインデックスとして適用することで、
512
-
512
+
513
+
514
+
513
- bottom_path_dfがTrueとなっているデータは生き残り、FalseとなっているセルはNaNとなります。
515
+ `bottom_path_df`がTrueとなっているデータは生き残り、FalseとなっているセルはNaNとなります。
514
516
 
515
517
 
516
518
 
@@ -542,4 +544,12 @@
542
544
 
543
545
 
544
546
 
545
- 以上により、bottom_path_df には、末端(葉)のデータだけ存在するようになりました。
547
+ 以上により、`bottom_path_df` には、末端(葉)のデータだけ存在するようになりました。
548
+
549
+
550
+
551
+ 参考:
552
+
553
+ https://note.nkmk.me/python-pandas-diff-pct-change/
554
+
555
+ https://qiita.com/0NE_shoT_/items/8db6d909e8b48adcb203