teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

パスを消しました。

2021/10/10 00:42

投稿

Oisan
Oisan

スコア15

title CHANGED
File without changes
body CHANGED
@@ -60,22 +60,6 @@
60
60
  df = pd.read_csv('\indicator_single.csv',dtype={'証券コード':str},encoding="cp932")
61
61
  df["証券コード"] = df["証券コード"].str[0:4]
62
62
 
63
- df_only_current = df.from math import nan
64
- import os
65
- import pandas as pd
66
- import numpy as np
67
- import const #const.py
68
-
69
- const.FOLDER_CURRENT = os.path.dirname(os.path.abspath(__file__))
70
- const.FOLDER_EDINET = os.path.join(const.FOLDER_CURRENT,'data')
71
- const.FILE_EDINET_CSV = os.path.join(const.FOLDER_EDINET,'result/indicator_multiple.csv')
72
-
73
-
74
-
75
- def make_indicator_multiple():
76
- df = pd.read_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\indicator_single.csv',dtype={'証券コード':str},encoding="cp932")
77
- df["証券コード"] = df["証券コード"].str[0:4]
78
-
79
63
  df_only_current = df.groupby('証券コード').max('年度')
80
64
  df['n年前'] = df.groupby('証券コード')['年度'].transform('max')-df['年度']
81
65
 
@@ -91,44 +75,12 @@
91
75
 
92
76
  def file_merge(df_edinet):
93
77
  columns =['日付','証券コード','区分','銘柄名','始値','高値','安値','終値','取引市場']
94
- df_stockprice = pd.read_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\stock_price.csv',names=columns,encoding="cp932")
95
- print(df_edinet)
96
- print(df_stockprice)
97
- join_data = pd.merge(df_edinet,df_stockprice,on='証券コード',how='left')
98
-
99
- print(join_data)
100
- #join_data.to_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\test.csv',encoding='cp932',index=False)
101
-
102
- def main():
103
- df_edinet = make_indicator_multiple()
104
- file_merge(df_edinet)
105
-
106
- print("finish")
107
-
108
- if __name__ == "__main__":
109
- main()
110
- groupby('証券コード').max('年度')
111
- df['n年前'] = df.groupby('証券コード')['年度'].transform('max')-df['年度']
112
-
113
- #追加する列名一覧
114
- add_columns = ['純資産額','売上高','当期純利益','営業CF','EPS']
115
-
116
- for column in add_columns:
117
- for i in range(0,4):
118
- j = i+1
119
- df_pvt=df.pivot(index='証券コード',columns='n年前',values=column)
120
- df_only_current[f"{column}_{i}→{j}"] = (df_pvt[i]-df_pvt[j])/df_pvt[j]
121
- return df_only_current
122
-
123
- def file_merge(df_edinet):
124
- columns =['日付','区分','証券コード','銘柄名','始値','高値','安値','終値','取引市場']
125
78
  df_stockprice = pd.read_csv('\stock_price.csv',names=columns,encoding="cp932")
126
79
  print(df_edinet)
127
80
  print(df_stockprice)
128
- join_data = pd.merge(df_edinet,df_stockprice,on='証券コード',how='left')
81
+ join_data = pd.concat([df_edinet,df_stockprice],join='証券コード')
129
82
 
130
83
  print(join_data)
131
- join_data.to_csv('\test.csv',encoding='cp932',index=False)
132
84
 
133
85
  def main():
134
86
  df_edinet = make_indicator_multiple()
@@ -138,7 +90,6 @@
138
90
 
139
91
  if __name__ == "__main__":
140
92
  main()
141
-
142
93
  ```
143
94
 
144
95
  #得られたエラーメッセージ

2

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

2021/10/10 00:41

投稿

Oisan
Oisan

スコア15

title CHANGED
@@ -1,1 +1,1 @@
1
- 【自身で再検証します。】pivotしたdataframeとpivotしていないdataframeを結合したい。
1
+ pivotしたdataframeとpivotしていないdataframeを結合したい。
body CHANGED
@@ -1,14 +1,18 @@
1
- 追記お知らせ>
1
+ <お知らせ>
2
-  本件ついて、対象デタ2の列名の順序が違たことが発覚しました。
2
+  少し前自身でもう少し頑張っみますとしていましたがエラ②までいて行き詰りました。
3
- 自身で再検証してま躓いたら、再度ご助言を依頼します。
3
+  どなご助言いただけますと大変助かります
4
+ ============================================
4
5
 
5
6
  #実現したいこと。
6
7
  Pythonでデータの整形を試みている中で、pivotしたdataframeとpivotしていないdataframeを結合(merge)したいです。
7
8
 
8
9
  以下のような対象データ1のpivot後のデータと、対象データ2をmergeしたいのですがうまくいきません。
9
- もしよろしければ、解決方法をご教示ください。
10
10
 
11
+ 原因はpivotしていないデータの型と、pivotしたデータの型が違うためのようですが、解決策が浮かびません。
11
12
 
13
+ pivotする前に結合してしまう方法があるとは思うのですが、少しきれいじゃないように思うので、可能であればpivot後に結合したいと考えています。
14
+
15
+
12
16
  ◆対象データ1
13
17
  pivot したデータは有価証券報告書を加工して得た以下のようなCSVをdataframeに入れて。
14
18
 
@@ -56,6 +60,22 @@
56
60
  df = pd.read_csv('\indicator_single.csv',dtype={'証券コード':str},encoding="cp932")
57
61
  df["証券コード"] = df["証券コード"].str[0:4]
58
62
 
63
+ df_only_current = df.from math import nan
64
+ import os
65
+ import pandas as pd
66
+ import numpy as np
67
+ import const #const.py
68
+
69
+ const.FOLDER_CURRENT = os.path.dirname(os.path.abspath(__file__))
70
+ const.FOLDER_EDINET = os.path.join(const.FOLDER_CURRENT,'data')
71
+ const.FILE_EDINET_CSV = os.path.join(const.FOLDER_EDINET,'result/indicator_multiple.csv')
72
+
73
+
74
+
75
+ def make_indicator_multiple():
76
+ df = pd.read_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\indicator_single.csv',dtype={'証券コード':str},encoding="cp932")
77
+ df["証券コード"] = df["証券コード"].str[0:4]
78
+
59
79
  df_only_current = df.groupby('証券コード').max('年度')
60
80
  df['n年前'] = df.groupby('証券コード')['年度'].transform('max')-df['年度']
61
81
 
@@ -70,6 +90,37 @@
70
90
  return df_only_current
71
91
 
72
92
  def file_merge(df_edinet):
93
+ columns =['日付','証券コード','区分','銘柄名','始値','高値','安値','終値','取引市場']
94
+ df_stockprice = pd.read_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\stock_price.csv',names=columns,encoding="cp932")
95
+ print(df_edinet)
96
+ print(df_stockprice)
97
+ join_data = pd.merge(df_edinet,df_stockprice,on='証券コード',how='left')
98
+
99
+ print(join_data)
100
+ #join_data.to_csv('C:\xampp\htdocs\01_AppDev\01_StockManagementApp\data\result\test.csv',encoding='cp932',index=False)
101
+
102
+ def main():
103
+ df_edinet = make_indicator_multiple()
104
+ file_merge(df_edinet)
105
+
106
+ print("finish")
107
+
108
+ if __name__ == "__main__":
109
+ main()
110
+ groupby('証券コード').max('年度')
111
+ df['n年前'] = df.groupby('証券コード')['年度'].transform('max')-df['年度']
112
+
113
+ #追加する列名一覧
114
+ add_columns = ['純資産額','売上高','当期純利益','営業CF','EPS']
115
+
116
+ for column in add_columns:
117
+ for i in range(0,4):
118
+ j = i+1
119
+ df_pvt=df.pivot(index='証券コード',columns='n年前',values=column)
120
+ df_only_current[f"{column}_{i}→{j}"] = (df_pvt[i]-df_pvt[j])/df_pvt[j]
121
+ return df_only_current
122
+
123
+ def file_merge(df_edinet):
73
124
  columns =['日付','区分','証券コード','銘柄名','始値','高値','安値','終値','取引市場']
74
125
  df_stockprice = pd.read_csv('\stock_price.csv',names=columns,encoding="cp932")
75
126
  print(df_edinet)
@@ -90,33 +141,21 @@
90
141
 
91
142
  ```
92
143
 
93
- #得られる結果
144
+ #得られたエラーメッセージ
94
-  ※対象データ2に対象データ1と共通する証券コード4桁があることは確認済です。
145
+ ValueError: You are trying to merge on object and int64 columns. If you wish to proceed you should use pd.concat
95
146
 
147
+ #エラーを受けて試したコード①
96
- 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
148
+  mergeからconcatに変えてみる。
149
+ ```Python
97
- 証券コード ...
150
+ join_data = pd.concat(df_edinet,df_stockprice)
98
- 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
151
+ ```
99
- 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
100
152
 
101
- [2 rows x 88 columns]
153
+ #試したコードのエラー①
102
- 日付 区分 証券コード 銘柄名 始値 高値 安値 終値 取引市場
103
- 2021/10/8 1001 11 1001 日経225 28031.0 28321.0 28018.0 28049.0 1356770000 東証1部
104
- 2021/10/8 1002 11 1002 TOPIX 1964.0 1978.0 1961.0 1961.0 1356770000 東証1部
105
- 2021/10/8 1301 11 1301 極洋 3035.0 3035.0 2974.0 2998.0 22100 東証1部
154
+ TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"
106
- 2021/10/8 1305 11 1305 ダイワTPX 2069.0 2082.0 2063.0 2063.0 127680 東証1部
107
- 2021/10/8 1306 11 1306 TOPIX投 2046.0 2058.0 2039.0 2041.0 2852540 東証1部
108
- ... ... .. ... ... ... ... ... ... ...
109
- 2021/10/8 9993 11 9993 ヤマザワ 1730.0 1730.0 1712.0 1719.0 3700 東証1部
110
- 2021/10/8 9994 11 9994 やまや 2415.0 2421.0 2399.0 2415.0 5900 東証1部
111
- 2021/10/8 9995 11 9995 グローセル 409.0 409.0 404.0 406.0 39000 東証1部
112
- 2021/10/8 9996 91 9996 サトー商会 1502.0 1505.0 1500.0 1505.0 900 JAQ
113
- 2021/10/8 9997 11 9997 ベルーナ 827.0 835.0 824.0 824.0 152900 東証1部
114
155
 
115
- [4358 rows x 9 columns]
116
- 証券コード BPS EPS EPS_調整後 自己資本比率 ROE PER 従業員数 発行済株式総数 現金及び預金 ... EPS_2→3 EPS_3→4 日付 区分 銘柄名
117
- 始値 高値 安値 終値 取引市場
156
+ #エラーを受けて試したコード②
118
- 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
119
- 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
120
-
121
- [2 rows x 97 columns]
122
- finish
157
+ ```Python
158
+ join_data = pd.concat([df_edinet,df_stockprice],join='証券コード')
159
+ ```
160
+ #試したコードのエラー②
161
+ Only can inner (intersect) or outer (union) join the other axis

1

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

2021/10/10 00:39

投稿

Oisan
Oisan

スコア15

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