回答編集履歴

1

edit

2017/12/08 03:28

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -11,3 +11,127 @@
11
11
  aso01, aso02, aso03, aso04, aso05, aso06, aso07, aso08, aso09 = [mydata01.iloc[j-62:j+625, 0] for i in a_num1]
12
12
 
13
13
  ```
14
+
15
+
16
+
17
+ ---
18
+
19
+ valuesとtolist()の型について
20
+
21
+ それぞれ`pandas.DataFrame`、`numpy.array`、`list`と型が異なります。
22
+
23
+ その為、その後にコールできるメソッドも異なります。
24
+
25
+ ```python
26
+
27
+ import pandas as pd
28
+
29
+ a = pd.DataFrame()
30
+
31
+ a['a'] = ['a']
32
+
33
+ print(type(a.iloc[:, :]))
34
+
35
+ #<class 'pandas.core.frame.DataFrame'>
36
+
37
+ print(type(a.iloc[:, :].values))
38
+
39
+ #<class 'numpy.ndarray'>
40
+
41
+ print(type(a.iloc[:, :].values.tolist()))
42
+
43
+ #<class 'list'>
44
+
45
+ ```
46
+
47
+
48
+
49
+ valuesとtolist()の挙動について
50
+
51
+ 渡されているものに対して変更を行った場合の振る舞いが異なります。
52
+
53
+ 副作用の出るような振る舞いはpythonでは基本的に好ましくありません。
54
+
55
+ どうしても必要な場合もありますが、往々にしてもっとわかりやすく記述する方法があります。
56
+
57
+ ```python
58
+
59
+ import pandas as pd
60
+
61
+
62
+
63
+ a = pd.DataFrame()
64
+
65
+ a['a'] = ['a']
66
+
67
+ b = a.iloc[:, :].values.tolist()
68
+
69
+ print(a)
70
+
71
+ #データフレームaを確認します。
72
+
73
+ '''
74
+
75
+ a
76
+
77
+ 0 a
78
+
79
+ '''
80
+
81
+ #bはリストとして振る舞います。
82
+
83
+ b[0][0] = 'b'
84
+
85
+ print(a)
86
+
87
+ #.tolist()をしてコピーされたので、bを操作してもデータフレームaに変更はありません。
88
+
89
+ '''
90
+
91
+ a
92
+
93
+ 0 a
94
+
95
+ '''
96
+
97
+
98
+
99
+ b = a.iloc[:, :].values
100
+
101
+ print(a)
102
+
103
+ #再び確認
104
+
105
+ '''
106
+
107
+ a
108
+
109
+ 0 a
110
+
111
+ '''
112
+
113
+ b[0][0] = 'b'
114
+
115
+ print(a)
116
+
117
+ #aの中のポインターとして渡されているので、bを変えるとデータフレームaも変更されています。
118
+
119
+ '''
120
+
121
+ a
122
+
123
+ 0 b
124
+
125
+ '''
126
+
127
+ ```
128
+
129
+
130
+
131
+ 特にこれらが正しいというわけではありませんが、副作用とか関数型プログラミングのキーワードとしての読み物をいくつか。
132
+
133
+ http://bugrammer.hateblo.jp/entry/2015/08/11/231617
134
+
135
+ https://news.mynavi.jp/article/python-18/
136
+
137
+ https://qiita.com/kwatch/items/03fd035a955235681577