質問編集履歴

3

パスを消しました。

2021/10/10 00:42

投稿

Oisan
Oisan

スコア15

test CHANGED
File without changes
test CHANGED
@@ -122,82 +122,48 @@
122
122
 
123
123
 
124
124
 
125
- df_only_current = df.from math import nan
125
+ df_only_current = df.groupby('証券コード').max('年度')
126
+
126
-
127
+ df['n年前'] = df.groupby('証券コード')['年度'].transform('max')-df['年度']
128
+
129
+
130
+
127
- import os
131
+ #追加する列名一覧
128
-
132
+
129
- import pandas as pd
133
+ add_columns = ['純資産額','売上高','当期純利益','営業CF','EPS']
130
-
131
- import numpy as np
134
+
132
-
135
+
136
+
133
- import const #const.py
137
+ for column in add_columns:
134
-
135
-
136
-
138
+
137
- const.FOLDER_CURRENT = os.path.dirname(os.path.abspath(__file__))
139
+ for i in range(0,4):
140
+
138
-
141
+ j = i+1
142
+
139
- const.FOLDER_EDINET = os.path.join(const.FOLDER_CURRENT,'data')
143
+ df_pvt=df.pivot(index='証券コード',columns='n年前',values=column)
140
-
144
+
141
- const.FILE_EDINET_CSV = os.path.join(const.FOLDER_EDINET,'result/indicator_multiple.csv')
145
+ df_only_current[f"{column}_{i}→{j}"] = (df_pvt[i]-df_pvt[j])/df_pvt[j]
146
+
142
-
147
+ return df_only_current
143
-
144
-
145
-
146
-
147
-
148
-
148
+
149
+
150
+
149
- def make_indicator_multiple():
151
+ def file_merge(df_edinet):
152
+
150
-
153
+ columns =['日付','証券コード','区分','銘柄名','始値','高値','安値','終値','取引市場']
154
+
151
- df = pd.read_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\indicator_single.csv',dtype={'証券コード':str},encoding="cp932")
155
+ df_stockprice = pd.read_csv('\stock_price.csv',names=columns,encoding="cp932")
156
+
152
-
157
+ print(df_edinet)
158
+
159
+ print(df_stockprice)
160
+
153
- df["証券コード"] = df["証券コード"].str[0:4]
161
+ join_data = pd.concat([df_edinet,df_stockprice],join='証券コード')
154
162
 
155
163
 
156
164
 
157
- df_only_current = df.groupby('証券コード').max('年度')
158
-
159
- df['n年前'] = df.groupby('証券コード')['年度'].transform('max')-df['年度']
160
-
161
-
162
-
163
- #追加する列名一覧
164
-
165
- add_columns = ['純資産額','売上高','当期純利益','営業CF','EPS']
166
-
167
-
168
-
169
- for column in add_columns:
170
-
171
- for i in range(0,4):
172
-
173
- j = i+1
174
-
175
- df_pvt=df.pivot(index='証券コード',columns='n年前',values=column)
176
-
177
- df_only_current[f"{column}_{i}→{j}"] = (df_pvt[i]-df_pvt[j])/df_pvt[j]
178
-
179
- return df_only_current
180
-
181
-
182
-
183
- def file_merge(df_edinet):
184
-
185
- columns =['日付','証券コード','区分','銘柄名','始値','高値','安値','終値','取引市場']
186
-
187
- df_stockprice = pd.read_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\stock_price.csv',names=columns,encoding="cp932")
188
-
189
- print(df_edinet)
190
-
191
- print(df_stockprice)
192
-
193
- join_data = pd.merge(df_edinet,df_stockprice,on='証券コード',how='left')
194
-
195
-
196
-
197
165
  print(join_data)
198
166
 
199
- #join_data.to_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\test.csv',encoding='cp932',index=False)
200
-
201
167
 
202
168
 
203
169
  def main():
@@ -216,70 +182,6 @@
216
182
 
217
183
  main()
218
184
 
219
- groupby('証券コード').max('年度')
220
-
221
- df['n年前'] = df.groupby('証券コード')['年度'].transform('max')-df['年度']
222
-
223
-
224
-
225
- #追加する列名一覧
226
-
227
- add_columns = ['純資産額','売上高','当期純利益','営業CF','EPS']
228
-
229
-
230
-
231
- for column in add_columns:
232
-
233
- for i in range(0,4):
234
-
235
- j = i+1
236
-
237
- df_pvt=df.pivot(index='証券コード',columns='n年前',values=column)
238
-
239
- df_only_current[f"{column}_{i}→{j}"] = (df_pvt[i]-df_pvt[j])/df_pvt[j]
240
-
241
- return df_only_current
242
-
243
-
244
-
245
- def file_merge(df_edinet):
246
-
247
- columns =['日付','区分','証券コード','銘柄名','始値','高値','安値','終値','取引市場']
248
-
249
- df_stockprice = pd.read_csv('\stock_price.csv',names=columns,encoding="cp932")
250
-
251
- print(df_edinet)
252
-
253
- print(df_stockprice)
254
-
255
- join_data = pd.merge(df_edinet,df_stockprice,on='証券コード',how='left')
256
-
257
-
258
-
259
- print(join_data)
260
-
261
- join_data.to_csv('\test.csv',encoding='cp932',index=False)
262
-
263
-
264
-
265
- def main():
266
-
267
- df_edinet = make_indicator_multiple()
268
-
269
- file_merge(df_edinet)
270
-
271
-
272
-
273
- print("finish")
274
-
275
-
276
-
277
- if __name__ == "__main__":
278
-
279
- main()
280
-
281
-
282
-
283
185
  ```
284
186
 
285
187
 

2

自身で挑戦した経緯を追加しました。

2021/10/10 00:41

投稿

Oisan
Oisan

スコア15

test CHANGED
@@ -1 +1 @@
1
- 【自身で再検証します。】pivotしたdataframeとpivotしていないdataframeを結合したい。
1
+ pivotしたdataframeとpivotしていないdataframeを結合したい。
test CHANGED
@@ -1,8 +1,10 @@
1
- 追記お知らせ>
1
+ <お知らせ>
2
-
2
+
3
-  本件対象デタ2の列名の順序が違たことが発覚しました。
3
+  少し前自身でもう少し頑張ってみますとしてましたがエラ②までいて行き詰りました。
4
-
4
+
5
- 自身で再検証してま躓いたら、再度ご助言を依頼します。
5
+  どなご助言いただけますと大変助かります
6
+
7
+ ============================================
6
8
 
7
9
 
8
10
 
@@ -14,7 +16,13 @@
14
16
 
15
17
  以下のような対象データ1のpivot後のデータと、対象データ2をmergeしたいのですがうまくいきません。
16
18
 
19
+
20
+
17
- しよろしければ、解決方法をご教示ください
21
+ 原因はpivotていないデータの型と、pivotしたデータの型が違うためのうですが、解決策が浮かびません
22
+
23
+
24
+
25
+ pivotする前に結合してしまう方法があるとは思うのですが、少しきれいじゃないように思うので、可能であればpivot後に結合したいと考えています。
18
26
 
19
27
 
20
28
 
@@ -114,6 +122,38 @@
114
122
 
115
123
 
116
124
 
125
+ df_only_current = df.from math import nan
126
+
127
+ import os
128
+
129
+ import pandas as pd
130
+
131
+ import numpy as np
132
+
133
+ import const #const.py
134
+
135
+
136
+
137
+ const.FOLDER_CURRENT = os.path.dirname(os.path.abspath(__file__))
138
+
139
+ const.FOLDER_EDINET = os.path.join(const.FOLDER_CURRENT,'data')
140
+
141
+ const.FILE_EDINET_CSV = os.path.join(const.FOLDER_EDINET,'result/indicator_multiple.csv')
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+ def make_indicator_multiple():
150
+
151
+ df = pd.read_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\indicator_single.csv',dtype={'証券コード':str},encoding="cp932")
152
+
153
+ df["証券コード"] = df["証券コード"].str[0:4]
154
+
155
+
156
+
117
157
  df_only_current = df.groupby('証券コード').max('年度')
118
158
 
119
159
  df['n年前'] = df.groupby('証券コード')['年度'].transform('max')-df['年度']
@@ -142,6 +182,68 @@
142
182
 
143
183
  def file_merge(df_edinet):
144
184
 
185
+ columns =['日付','証券コード','区分','銘柄名','始値','高値','安値','終値','取引市場']
186
+
187
+ df_stockprice = pd.read_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\stock_price.csv',names=columns,encoding="cp932")
188
+
189
+ print(df_edinet)
190
+
191
+ print(df_stockprice)
192
+
193
+ join_data = pd.merge(df_edinet,df_stockprice,on='証券コード',how='left')
194
+
195
+
196
+
197
+ print(join_data)
198
+
199
+ #join_data.to_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\test.csv',encoding='cp932',index=False)
200
+
201
+
202
+
203
+ def main():
204
+
205
+ df_edinet = make_indicator_multiple()
206
+
207
+ file_merge(df_edinet)
208
+
209
+
210
+
211
+ print("finish")
212
+
213
+
214
+
215
+ if __name__ == "__main__":
216
+
217
+ main()
218
+
219
+ groupby('証券コード').max('年度')
220
+
221
+ df['n年前'] = df.groupby('証券コード')['年度'].transform('max')-df['年度']
222
+
223
+
224
+
225
+ #追加する列名一覧
226
+
227
+ add_columns = ['純資産額','売上高','当期純利益','営業CF','EPS']
228
+
229
+
230
+
231
+ for column in add_columns:
232
+
233
+ for i in range(0,4):
234
+
235
+ j = i+1
236
+
237
+ df_pvt=df.pivot(index='証券コード',columns='n年前',values=column)
238
+
239
+ df_only_current[f"{column}_{i}→{j}"] = (df_pvt[i]-df_pvt[j])/df_pvt[j]
240
+
241
+ return df_only_current
242
+
243
+
244
+
245
+ def file_merge(df_edinet):
246
+
145
247
  columns =['日付','区分','証券コード','銘柄名','始値','高値','安値','終値','取引市場']
146
248
 
147
249
  df_stockprice = pd.read_csv('\stock_price.csv',names=columns,encoding="cp932")
@@ -182,62 +284,38 @@
182
284
 
183
285
 
184
286
 
185
- #得られる結果
287
+ #得られたエラーメッセージ
186
-
187
-  ※対象データ2に対象データ1と共通する証券コード4桁があることは確認済です。
288
+
188
-
189
-
190
-
191
- BPS EPS EPS_調整後 自己資本比率 ROE PER 従業員数 発行済株式総数 ... 営業CF_0→1 営業CF_1→2 営業CF_2→3 営業CF_3→4 EPS_0→1 EPS_1→2 EPS_2→3 EPS_3→4
192
-
193
- 証券コード ...
194
-
195
- 7516 4104.73 561.27 561.11 0.357 0.145 12.2 4037 34682113 ... 0.315924 0.283543 0.066304 -0.135211 0.635354 0.090282 0.082087 0.660540
196
-
197
- 9702 1309.81 124.04 NaN 0.712 0.129 26.4 1717 5669000 ... 0.382676 0.165805 2.979031 -0.159800 -0.241374 0.158062 0.777464 0.757364
198
-
199
-
200
-
201
- [2 rows x 88 columns]
202
-
203
- 日付 区分 証券コード 銘柄名 始値 高値 安値 終値 取引市場
204
-
205
- 2021/10/8 1001 11 1001 日経225 28031.0 28321.0 28018.0 28049.0 1356770000 東証1部
206
-
207
- 2021/10/8 1002 11 1002 TOPIX 1964.0 1978.0 1961.0 1961.0 1356770000 東証1部
208
-
209
- 2021/10/8 1301 11 1301 極洋 3035.0 3035.0 2974.0 2998.0 22100 東証1部
210
-
211
- 2021/10/8 1305 11 1305 ダイワTPX 2069.0 2082.0 2063.0 2063.0 127680 東証1部
212
-
213
- 2021/10/8 1306 11 1306 TOPIX投 2046.0 2058.0 2039.0 2041.0 2852540 東証1部
214
-
215
- ... ... .. ... ... ... ... ... ... ...
216
-
217
- 2021/10/8 9993 11 9993 ヤマザワ 1730.0 1730.0 1712.0 1719.0 3700 東証1部
218
-
219
- 2021/10/8 9994 11 9994 やまや 2415.0 2421.0 2399.0 2415.0 5900 東証1部
220
-
221
- 2021/10/8 9995 11 9995 グローセル 409.0 409.0 404.0 406.0 39000 東証1部
222
-
223
- 2021/10/8 9996 91 9996 サトー商会 1502.0 1505.0 1500.0 1505.0 900 JAQ
224
-
225
- 2021/10/8 9997 11 9997 ベルーナ 827.0 835.0 824.0 824.0 152900 東証1部
226
-
227
-
228
-
229
- [4358 rows x 9 columns]
230
-
231
- 証券コード BPS EPS EPS_調整後 自己資本比率 ROE PER 従業員数 発行済株式総数 現金及び預金 ... EPS_2→3 EPS_3→4 日付 区分 銘柄名
289
+ ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat
232
-
290
+
291
+
292
+
233
- 始値 高値 安値 終値 取引市場
293
+ #エラーを受けて試したコード①
234
-
235
- 0 7516 4104.73 561.27 561.11 0.357 0.145 12.2 4037 34682113 14681000000 ... 0.082087 0.660540 NaN NaN NaN NaN NaN NaN NaN NaN
294
+
236
-
237
- 1 9702 1309.81 124.04 NaN 0.712 0.129 26.4 1717 5669000 5199102000 ... 0.777464 0.757364 NaN NaN NaN NaN NaN NaN NaN NaN
238
-
239
-
240
-
241
- [2 rows x 97 columns]
295
+  mergeからconcatに変えてみる。
242
-
296
+
243
- finish
297
+ ```Python
298
+
299
+ join_data = pd.concat(df_edinet,df_stockprice)
300
+
301
+ ```
302
+
303
+
304
+
305
+ #試したコードのエラー①
306
+
307
+ TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"
308
+
309
+
310
+
311
+ #エラーを受けて試したコード②
312
+
313
+ ```Python
314
+
315
+ join_data = pd.concat([df_edinet,df_stockprice],join='証券コード')
316
+
317
+ ```
318
+
319
+ #試したコードのエラー②
320
+
321
+ Only can inner (intersect) or outer (union) join the other axis

1

元のコードに決定的な誤りがあったため

2021/10/10 00:39

投稿

Oisan
Oisan

スコア15

test CHANGED
@@ -1 +1 @@
1
- pivotしたdataframeとpivotしていないdataframeを結合したい。
1
+ 【自身で再検証します。】pivotしたdataframeとpivotしていないdataframeを結合したい。
test CHANGED
@@ -1,3 +1,11 @@
1
+ <追記お知らせ>
2
+
3
+  本件について、対象データ2の列名の順序が違ったことが発覚しました。
4
+
5
+ 自身で再検証してまた躓いたら、再度ご助言を依頼します。
6
+
7
+
8
+
1
9
  #実現したいこと。
2
10
 
3
11
  Pythonでデータの整形を試みている中で、pivotしたdataframeとpivotしていないdataframeを結合(merge)したいです。