ãã®èšäºã¯æ ªåŒäŒç€ŸNuco Advent Calendar 2022ã®9æ¥ç®ã®èšäºã§ãã
ã¯ããã«
ãããªãã銎æã¿ã®ããã£ãããŒã§ãŠã£ããã§ã»ã³ã»ãŒã·ã§ãã«ãªãã¿ã€ãã«ã§å€±ç€ŒããŸãã
ç§èªèº«ãæ¥åã®äžã§pandasã«å€§å€ãäžè©±ã«ãªã£ãŠãããèªæã蟌ããŠpandasã®ãã¢ã³ããã¿ãŒã³ãããŸãšããŠã¿ãŸããã
ãã®èšäºãèªãã§ãããå¿«é©ãªpandasã©ã€ããéã£ãŠããã ãããšå¬ããã§ãã
察象èªè
- Pythonã䜿ã£ãããŒã¿åæãæ©æ¢°åŠç¿ã«æºããæ¹
- ãã®èšäºã¯pandasã®åºæ¬çãªäœ¿ãæ¹ã解説ãããã®ã§ã¯ãªãã®ã§æ³šæããŠãã ããã
- 衚圢åŒãã¡ã€ã«ãå å·¥ããå¿
èŠãããæ¹
- pandasã®åŒ·ã¿ã¯ãªã¬ãŒã·ã§ãã«ãªããŒã¿å šè¬ã§ããå¿ ãããããŒã¿åæãæ©æ¢°åŠç¿ã ããå®åç¯å²ã§ã¯ãããŸããã
pandasãšã¯
- pandasã®å ¬åŒããã¥ã¡ã³ãã®æŠèŠã«ã¯ã以äžã®ããã«èšèŒããŠãããŸãã
pandas is a Python package that provides fast, flexible, and expressive data structures designed to make working with "relational" or "labeled" data both easy and intuitive. It aims to be the fundamental high-level building block for doing practical, real world data analysis in Python. Additionally, it has the broader goal of becoming the most powerful and flexible open source data analysis / manipulation tool available in any language. It is already well on its way towards this goal.
æ¥æ¬èªèš³ãããšä»¥äžã®ãããªèšèŒãšãªããŸãã
pandasã¯ãé«éãã€æè»ã§è¡šçŸåè±ããªããŒã¿æ§é ãæäŸããPythonã®ããã±ãŒãžã§ãããªã¬ãŒã·ã§ãã«ããŸãã¯ãã©ãã«ä»ããããŒã¿ãç°¡åãã€çŽæçã«æ±ããããã«èšèšãããŠããŸããpandasã¯ãPythonã§å®çšçãªããŒã¿è§£æãè¡ãããã®åºæ¬çã§é«ãã¬ãã«ã®æ§æèŠçŽ ã«ãªãããšãç®æããŠããŸããããã«ãããããèšèªã§å©çšå¯èœãªæã匷åã§æè»ãªãªãŒãã³ãœãŒã¹ããŒã¿åæã»æäœããŒã«ã«ãªãããšããã倧ããªç®æšãšããŠããŸãããã§ã«ããã®ç®æšã«åãã£ãŠé 調ã«é²ãã§ããŸãã
è¶ çµ¶ãã£ãããããš ãPythonã§è¡šåœ¢åŒã®ããŒã¿æ±ãæã«äŸ¿å©ã ããã ã£ãŠããšã§ããã
é »åºç·š
䜿çšããç°å¢ã¯ä»¥äžã®éãã§ãã(pandasã®ã¢ããããŒãã«ããæåãå€ããå¯èœæ§ããããŸãã)
Python 3.8.12
numpy 1.20.3
pandas 1.3.4
scipy 1.5.3
ããŒã¿ã¯ã¬ã³ã¡ã³ãã·ã¹ãã ã®éçºã»è©äŸ¡ã«äœ¿ãããMovieLensã®ããŒã¿ã»ãããæŽ»çšããŸãã
import pandas as pd
rating_file = pd.read_csv('ratings.csv')
rating_file.head()
userId movieId rating timestamp
0 1 1 4.0 964982703
1 1 3 4.0 964981247
2 1 6 4.0 964982224
3 1 47 5.0 964983815
4 1 50 5.0 964982931
DataFrameãforã«ãŒãã§äœ¿ããª
åŠçãç Žæ» çã«é ããªã
å°èŠæš¡ãªããŒã¿ã§ããã°èª€å·®ã¬ãã«ãããããŸããããåæãæ©æ¢°åŠç¿ãžã®ããŒã¿æŽ»çšãšãªããšãç¹°ãè¿ãåŠçãããã£ãŒãããŒã®ããã«å¹ããŠããŸãã
æ°æéããã£ãŠããforæã®åŠçãåŠçãå€ããã ãã§æ°åã§çµãã£ãããªã©ãããã話ã§ãã
ã©ã®ããã«çŽããŠããããç°¡åãªäŸã§å ·äœçã«ã¿ãŠã¿ãŸãã
è©äŸ¡ã«å¿ããŠããExcellent(4.5~5)ã»Average(2.5~4)ã»Poor(~2.5)ãã®ã©ãã«ãä»äžããããšããŸãã
# NG
ratings = []
for idx, row in rating_file.iterrows():
rating = row['rating']
if rating > 4:
ratings.append('Excellent')
elif rating > 2:
ratings.append('Average')
else:
ratings.append('Poor')
rating_file['evalation'] = ratings
æéãèšæž¬ããŠã¿ããšãå¹³åçŽ3.5ç§ã§ããã
3.44 s ± 5.17 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
iterrow以å€ã«ãapplyãªã©æ³šæãã
applyã¡ãœããã䜿ãã°ãäžèšã®ã³ãŒããforæãæé€ããŠæžãæããããšãã§ããŸãã
# Better
def map_rating_category(rating):
if rating > 4:
return 'Excellent'
elif rating > 2:
return 'Average'
else:
return 'Poor'
rating_file = pd.read_csv('ratings.csv')
rating_file["evalation"] = rating_file["rating"].apply(map_rating_category)
ãã¡ãæéãæž¬ããšããªããš0.016ç§ãŸã§çããªããŸããæåã®åŠçã¯ãã®çŽ200åã®æéãããã£ãŠãããšããããšã§ããã
16.7 ms ± 55.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
applyã¯éåžžã«äŸ¿å©ã§æ±çšæ§ãé«ããåŠçãã¹ãããªãããããéåžžã«éå®ãããŸãã
ããããforæã®èšèŒããªããªã£ãã ãã§ãæ¬è³ªçã« ãè¡ããã«ãŒãããŠããç¹ã«å€ããã¯ãããŸããã
ããŒã¿éãå¢å€§ããã«ã€ããNumPyã®å©çšãé©åãªå Žåãå€ã ããã®ã§ãé Œãããã«ã¯æ³šæã§ãã
ãã¯ãã«ã»è¡åæŒç®ã§ããã°NumPyã®å€æ¬¡å é åã䜿ã
DataFrameã®ãè¡ãã§ã¯ãªããNumPyã®å€æ¬¡å é åã䜿ãããšã§ã«ãŒãåŠçã®é床ãäžããããšãã§ããŸãã
# Better
import numpy as np
def rating_category(df_):
return np.select(
condlist=(
df_["rating"] > 4,
df_["rating"] > 2,
),
choicelist=("Excellent", "Average"),
default="Poor"
)
rating_file = pd.read_csv('ratings.csv')
rating_df = rating_file.assign(
evaluation = lambda df_: rating_category(df_)
)
æéãæž¬ã£ãŠã¿ããšãçŽ0.008ç§ãšããã«applyã®ååçšåºŠã®æéã«ãªããŸããã
8.35 ms ± 98.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
äžèšã®äŸã§ã¯æ°å€æ¯èŒã®åŠçããããŠããŸããããè€éãªèšç®ã§ããã°NumPyãå§åçã«äŸ¿å©ã§ãã
ãŸããããŒã¿éãå¢ããã«ã€ããŠãã®å·®ã¯æ°åã»æ°æéãšåºãã£ãŠããŸãã
è€éãªèšç®ã§ããã°SciPyã䟿å©
ç¹ã«æ©æ¢°åŠç¿ã®ããŒã¿åŠçã®äžã§ã¯ãçè¡åãåãæ±ãããšãããããããã£ãéã«ã¯SciPyã®åºçªã§ãã
(çè¡åãšã¯ã端çã«èšããšå€ã®ã»ãšãã©ããŒãã®è¡åã®ããšã)
rating_file = pd.read_csv('ratings.csv')
rating_matrix = csr_matrix(
pd.pivot_table(
rating_file[['userId', 'movieId', 'rating']],
index='userId',
columns='movieId'
).fillna(0).values
)
ããã¯çè¡åã®äžã§ãå§çž®è¡æ ŒçŽæ¹åŒïŒCompressed Sparse Row: CSRïŒãšããããæ¹ã§ãããä»ã«ãå§çž®åæ ŒçŽæ¹åŒïŒCompressed Sparse ColumnïŒCSC)ãšããããæ¹(è¡ãåãã®éã)ãªã©ããããŸãã
ãšãŠã€ããªãåŠçãéããªããããçè¡åã®åãæ±ãã®éã«ã¯ãã²äœ¿ã£ãŠã¿ãŠã»ããã§ãããæ¬çããå€ããããªã®ã§è©³çްã¯å²æããŸãã
ã¡ã¢ãªã浪費ãããª
ããŒã¿åŠçã§é »çºããMemoryError
å€§èŠæš¡ãªããŒã¿ã»ãããåãæ±ã£ãŠãããšããã®ãããªãšã©ãŒã«ééããŸãã
MemoryError: Unable to allocate 3.26 GiB for an array with shape (323, 2710542) and data type float32
ããã€ãèŠå ãèããããã®ã§ãã¿ãŠãããŸãããã
ããã¿ãããã«DataFrameãçæãããª
以äžã®ããã«å€æ°ãã©ãã©ãå¢ãããŠãããšãã¡ã¢ãªå®¹éãå§è¿«ãããšãšãã«ããã°ã®èŠå ã«ãªããŸãã
äžã®æ¹ã§æ±ããŸãããããŸãé£éåŠçã䜿ã£ãŠã¹ãããªãŸãšããŸãããã
# NG
rating_file1 = pd.read_csv('ratings.csv')
rating_file2 = rating_file1["rating"].apply(map_rating_category)
rating_file3 = ...
æ°ãã«çæãããDataFrameã¯ãã¡ã¢ãªãæ¶è²»ããŸãã
import sys
print(sys.getsizeof(rating_file1)/(1024**2), sys.getsizeof(rating_file2)/(1024**2),...
(3.0774078369140625, 9.246039390563965 ...
sys.getsizeof() 颿°ã¯ãªããžã§ã¯ãã®ã¡ã¢ãªãµã€ãºããã€ãåäœã§è¿ãã®ã§ãæ°ãã«çæããrating_file2ãçŽ9.24MBæ¶è²»ããŠããããšãåãããŸãã
å å·¥ã«å¿ èŠãªã«ã©ã ã ã䜿ã
SQLãæžããšããªã©ããã¢ã¹ã¿ãªã¹ã¯(*)ã§å šããŒã¿ãååŸããªãããæ³šæãããããšã¯ãããŸãããïŒ
åºæ¬çã«ããŒã¿åç §ã»å å·¥ã®éã«ã¯äœ¿çšããã«ã©ã ãæå®ããããšã§ã¡ã¢ãªãç¯çŽãã€ã€ãå¯èªæ§ãäžããããšãã§ããŸãã
# Better
rating_file = pd.read_csv('ratings.csv')[['userId', 'movieId', 'rating']]
rating_file.head()
userId movieId rating
0 1 1 4.0
1 1 3 4.0
2 1 6 4.0
3 1 47 5.0
4 1 50 5.0
äžèšã®äŸã ãšãããã ãã§ã¡ã¢ãªæ¶è²»éã¯3.0MBãã2.4MBãŸã§æžããããšãã§ããŸãã
DataFrameçææã«ã«ã©ã ã®å(dtype)ãæå®ãã
(äžèšãŸã§ã¯æ¬çã«çŠç¹ãåœãŠãããã«ãããŠæå®ããŠããªãã£ãã®ã§ããã)å€§èŠæš¡ããŒã¿ãåãæ±ãã«ããããDataFrameã®åã«ã©ã ã®ããŒã¿åãæé©åããããšã§ãããã©ãŒãã³ã¹ãšã¡ã¢ãªäœ¿çšéãæ¹åããããšãã§ããŸãã
äžèšã©ãã«ä»äžåŠçåŸã®DataFrameã®ããŒã¿åã¯ãããã©ã«ãã ãšãããªæãã§ãã
print(rating_df.dtypes, sys.getsizeof(rating_df)/(1024**2))
(åãããŠã¡ã¢ãªæ¶è²»éãåºåããŠã¿ããšãçŽ9.2MBã§ããã)
userId int64
movieId int64
rating float64
timestamp int64
evaluation object
dtype: object 9.234766960144043
倧ããªããŒã¿ã»ãããæ±ãå Žåãããã©ã«ãã® float64 ã int64 ã®ããŒã¿åã float16 ã int8 ã®ãããªå°ããªããŒã¿åã«çž®å°ããããšã§ãã¡ã¢ãªç¯çŽãã§ããŸãã
ãŸããç¹å®ã®é¢æ£å€ãåã(å€ã®ãŠããŒã¯æ°ãå°ãªã)ããŒã¿ã«ã¯ãCategoryåãçšããããšã§å€§ããªå¹æãæåŸ ã§ããŸãã
# Better
dtyp = {
'userId': 'int32',
'movieId': 'int32',
'rating': 'float16',
'timestamp': 'int64'
}
rating_file = pd.read_csv('ratings.csv', dtype=dtyp)
eval_rating_file = rating_file.assign(
evaluation = lambda df_: rating_category(df_)
).assign(
evaluation=lambda df_: df_["evaluation"].astype("category")
)
print(eval_rating_file.dtypes, sys.getsizeof(eval_rating_file)/(1024**2))
userId int32
movieId int32
rating float16
timestamp int64
evaluation category
dtype: object 1.8275518417358398
dtypeæå®åŸã®çµæã¯1.8MBãšããã£ãããã ãã§çŽ5åã®1ãŸã§æžããããšãã§ããŸããã
äžèŠã«ãªã£ããªããžã§ã¯ãã¯åé€ãã
ãã¡ãã¯pandasã«éã£ã話ã§ã¯ãªããPythonã§ã®åŠçå šè¬ã«èšããããšã§ããã
å¿ èŠãªDataFrameã®ã¿ãçæããŠè¡ã£ãŠãã¡ã¢ãªäžè¶³ã«é¥ãããšã¯ããã®ã§ã䜿ãçµãã£ãããŒã¿ã®ã¡ã¢ãªé åãè§£æŸããããšã倧äºã§ãã
# Better
import gc
del rating_file
gc.collect()
â»Pythonã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«ã€ããŠã¯èª¬æã岿ããŸãã詳现ã¯Pythonã®å ¬åŒããã¥ã¡ã³ããåç §ãã ããã
å¿çšç·š
èŠåãç¡èŠãããª
ããã¯pandasã«éã£ã話ã§ã¯ãããŸããã
Warningã¯äºæãã¬æåããšã©ãŒãåŒãèµ·ããåå ãšãªããŸãã®ã§ãåºæ¬çã«ã¯Warningã®æç€ºã«åŸã£ãŠåŠçã®èŠçŽããè¡ããŸãããã
ããã§ã¯pandasã®Warningã«ã€ããŠã¿ãŠãããŸãã
ç¡èŠãããã¡ãªSettingWithCopyWarning
以äžã®äœææžã¿ããŒã¿ã«å€æŽãå ããŠã¿ãããšæããŸãã
print(rating_df.head())
ãAverageããšãªã£ãŠããè©äŸ¡ã®ã¿ããGoodãã«æã£åãæ©ãå€ããŠã¿ãŸãã
userId movieId rating timestamp evaluation
0 1 1 4.0 964982703 Average
1 1 3 4.0 964981247 Average
2 1 6 4.0 964982224 Average
3 1 47 5.0 964983815 Excellent
4 1 50 5.0 964982931 Excellent
# NG
rating_df[rating_df['evaluation'] == 'Average']['evaluation'] = 'Good'
WarningãçºçããŸããã
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
èŠåã¯Pythonã®æšæºã©ã€ãã©ãªwarningsã¢ãžã¥ãŒã«ã§é衚瀺ã«ããããšãã§ããŸããããããŠãã ããã
以äžã詳ãã説æããŸãã
ããšã©ãŒãã§ã¯ãªããèŠåããäŒããããšããŠãããã®
- chained indexing / assignmentïŒé£éã€ã³ãã¯ã·ã³ã°ã»ä»£å ¥ïŒ
pandasã¯DataFrameãåŠçãããšãã«ViewãŸãã¯Copyãè¿ããŸããããã®èŠåãåºãŠããæã¯ããvalueãããCopyãã«ãSettingãããããšããŠããŸãã
ã€ãŸã倿Žãå ããã¯ããããªãªãžãã«ã§ãããViewãã¯å€ãããªããšããããšã§ãã
ã§ãã®ã§ãå ã»ã©ã®åŠçå®è¡åŸããViewãã¯å€åããŠããªãããããAverageãã¯ãGoodãã«å€ãã£ãŠããŸããã
userId movieId rating timestamp evaluation
0 1 1 4.0 964982703 Average
1 1 3 4.0 964981247 Average
2 1 6 4.0 964982224 Average
3 1 47 5.0 964983815 Excellent
4 1 50 5.0 964982931 Excellent
Warningã®èšãéãlocã䜿ããšããViewããžã®åŠçã§ããããšãæç€ºããããããèŠåã¯æ¶ããŸãã
rating_df.loc[rating_df['evaluation'] == 'Average', 'evaluation'] = 'Good'
ãããŠããAverageãããGoodãã«å€ãã£ãŠããŸãã
userId movieId rating timestamp evaluation
0 1 1 4.0 964982703 Good
1 1 3 4.0 964981247 Good
2 1 6 4.0 964982224 Good
3 1 47 5.0 964983815 Excellent
4 1 50 5.0 964982931 Excellent
ãã®ãããªèŠåãçºçããåå ãchained assignmentïŒé£éä»£å ¥ïŒ ãšèšããŸãã
rating_df[rating_df['evaluation'] == 'Average'] ã§ãViewããäœæã
['evaluation'] = 'Good' ã§ä»£å
¥ãè¡ã£ãŠããŸããã
ãã®ãããªé£éçãªä»£å
¥åŠçã¯NGãšããããšã§ãã
- hidden chaining(é ãé£é)
é£éä»£å ¥ã¯NGã§ä»£ããã«locã䜿ãã°OKïŒ...ããã°è¯ãã®ã§ããããããã£ãåçŽãªè©±ã§ã¯ãããŸããã
以äžã®ã³ãŒããå®è¡ãããAverageãã®äžã§ãè©äŸ¡3.0以äžã®ãã®ããGoodããšããŠã¿ãŸãã
# NG
rating_df_view = rating_df.loc[rating_df['evaluation'] == 'Average']
rating_df_view.loc[rating_df_view['rating'] <= 3.0, 'evaluation'] = 'Good'
ãããšããŸãããŠãWarningãåºãŠããŸããŸããã
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
...ããloc䜿ã£ãŠããããïŒãšæã£ãæ¹ãå€ããšæããŸã(å°ãªããšãç§ã¯æåæããŸãã)ã
å ã»ã©ãšç°ãªãã®ã¯ã倿Žãåæ ãããŠããç¹ã§ãã
print(rating_df_view.head())
ãAverageãã®äžã§è©äŸ¡3.0以äžã®ãã®ã ãããGoodãã«å€ãã£ãŠããŸãã
userId movieId rating timestamp evaluation
0 1 1 4.0 964982703 Average
1 1 3 4.0 964981247 Average
2 1 6 4.0 964982224 Average
5 1 70 3.0 964982400 Good
7 1 110 4.0 964982176 Average
èŠåã®æç€ºéãå ¬åŒããã¥ã¡ã³ããã¿ãŠã¿ããšã詳现ãªèª¬æããããŸãããããªã蟌ã¿å ¥ã£ã話ã«ãªãã®ã§ç«¯çã«èª¬æããŸãã
locã䜿ããšããViewããžã®åŠçã§ããããšãæç€ºããããšãã話ãããŸããããããã¯åçŽãªã±ãŒã¹ã®ã¿ã§ãã
rating_df.loc[rating_df['evaluation'] == 'Average']
rating_df_view.loc[rating_df_view['rating'] <= 3.0, 'evaluation']
ãšããé£éã¯åŠçãè€éåããŸããããããåŠçã®äžã§ããViewããè¿ãããCopyããè¿ãããpandasã¯ä¿èšŒããŠãããŸããã
äºæããªãæåããšãå¯èœæ§ãããããšããããšã§ããšã©ãŒãã§ã¯ãªããèŠåããçºããŠããã®ã§ãã
ã©ãããã°ããããšãããšãViewãããCopyããæç¢ºã«ããŠãããããšã§ãã
äŸãã°ãCopyãã§ãããšæç¢ºåããŠãããããšã§ãèŠåã¯æ¶ããŸãã
# Better
rating_df_view = rating_df.loc[rating_df['evaluation'] == 'Average'].copy()
rating_df_view.loc[rating_df_view['rating'] <= 3.0, 'evaluation'] = 'Good'
mutating(å€ç°)ãšchaining(é£é)
ãããã¿ãããã«DataFrameãçæãããªãã§ã¯ãå¥ã®å€æ°ã䜿ããªããå ã ã®DataFrameã«åŠçãå ããŠãããŸããã
倿°ã以äžã®ããã«æŽæ°ããŠããŸãã°ã¡ã¢ãªäœ¿çšéãç¯çŽã§ããŸãããããã¯mutating(å€ç°) ãšèšãããæšå¥šãããªãåŠçã§ãã
ç¹ã«ããŒãããã¯ã§äœæ¥ãããŠããæã«ã¯ãããŒã¿æäœã®é åºãå®ãããŠããªããããmutatingã«ããåŠçã¯ãã°ãçºçããããããŸãã³ãŒããç ©éã«ãªã£ãŠèªã¿ã«ããããã§ãã
# NG
excellent_rating_df = rating_file.assign(
evaluation = lambda df_: rating_category(df_)
)
excellent_rating_df = excellent_rating_df.assign(
evaluation=lambda df_: df_["evaluation"].astype("category")
)
excellent_rating_df = excellent_rating_df.groupby('evaluation').get_group('Excellent')
groupbyã«ããéèšåŠçãpipeã«ããã€ãã¬ãŒã·ã§ã³åŠçãªã©ãchaining(é£é) ã䜿ã£ãŠäžæ°é貫ã§åŠçããŠããŸãããã«ããŸãããã
# Better
excellent_rating_df = rating_file.assign(
evaluation = lambda df_: rating_category(df_)
).assign(
evaluation=lambda df_: df_["evaluation"].astype("category")
).groupby('evaluation').get_group('Excellent')
ãã®ããã«DataFrameã倿ããããšã§ãåpandasã¡ãœããã®é©åãªé©çšãä¿èšŒããããã°ã®ãªã¹ã¯ã軜æžããããšãã§ããŸãã
å ã»ã©ãé£éä»£å ¥ããé ãé£éãã®ãªã¹ã¯ã説æããŸãããããé£éãèªäœã¯æªã§ã¯ãªãã®ã§ãã©ãã©ã掻çšããŠãã ããã
ããšããããpandasã§åŠçããããã¯ããã
代ããã«jsonãšãcsv䜿ãã°ããã®ã§ã¯ïŒ
json圢åŒã®ãã¡ã€ã«ã§ããã°ãPythonã®èŸæžã䜿ã£ãŠåŠçããæ¹ãé«éãã€ã¡ã¢ãªå®¹éãæ¶è²»ããŸããã
ç°¡åãªåŠçã§ããã°ãæ®éã®ãã¡ã€ã«åŠçã§ããããšåŠçããŠããŸãã®ãããã§ãã
with open('ratings.csv', 'r') as f:
rating_file = f.read()
ãŸããcsvãã¡ã€ã«ã§ããã°ãPythonã®æšæºã©ã€ãã©ãªã«csvãšããã¢ãžã¥ãŒã«ãããã®ã§ããã¡ãã䜿ãã®ãæã§ãã
import csv
with open('ratings.csv', 'r') as f:
rating_reader = csv.DictReader(f)
ratings = [row for row in rating_reader]
# ratingsã«åŠçãå ããã®ã¡ãjson圢åŒã§ä¿åãã
with open('ratings.json', 'w') as f:
json.dump(ratings, f)
SQLã§ãéèšã»ãœãŒããªã©ã®åŠçã¯å¯èœ
ããŒã¿ããã¡ã€ã«ã§ã¯ãªãSQLã䜿ã£ãŠæœåºããå Žåãã«ã©ã ã«ããŒãèšå®ãããŠããã°éèšããœãŒãåŠçãé«éã«è¡ã£ãŠãããŸãã
GROUP BY ã ORDER BYãªã©å¹ççã«äœ¿ããŸãããã
ãã®å Žåãããããpandasã§åŠçããªããšãè¯ãã¯ãã§ãã
pandasã§ããŒã¿ãæ±ãéã«ã¯NaN(æ¬ æå€)ãèŠéããª
å®ããŒã¿ã®äžã«ã¯ãå®çŸ©æžã«ãæåååããšæžããŠãã£ãŠãpandasã«ãã£ãŠfloatåã«ãããŠããŸãã±ãŒã¹ããããŸãã
ç¹ã«æ³šæãå¿ èŠãªã®ããæ°å€ãæååã«ãã圢åŒã®IDã§ãã1234356ãã®ãããªæ°å€ã®æååã¯ããã®ã«ã©ã ã«æ¬ æããããšãNaNããå ¥ã£ãŠããŸãã(æå€ã«ãã®ã±ãŒã¹ã¯å€ãã§ãã)
NaNããããšæåååããfloatåã«èªå倿ãããŠããŸããããã1234356.0ãã®ãããªåœ¢ã«ãªããIDå士ãçŽã¥ããªããªã£ãŠããŸãå¯èœæ§ããããŸãã
æ¥é éšåãã0ãããå§ãŸãã0000101ããªã©ã®æååãèªåçã«ã101.0ãã®ãããªfloatåã«å€æãããŠããŸãã®ã§ã泚æãå¿ èŠã§ãã
pandasã«éã£ã話ã§ã¯ãããŸããããããŒã¿åã«ã¯æ³šæãæãããã«ããŸãããã
ãŸãšã
pandasãåãçºæ®ããå Žé¢
ããããã¢ã³ããã¿ãŒã³ãæããŠããã®ã§ããpandasã¯äœ¿ããªãæ¹ãè¯ãã®ã§ã¯ïŒããšèããæ¹ãããã£ããããããããŸãããããããªããšã¯ãããŸããããããã©ãã©ã䜿ã£ãŠããã ããããããã§ãã
pandasã¯ããŒã¿è§£æã«å¿
èŠãªæ±çšçãªæäœããŸãšããŠæäŸããŠãããåªç§ãªã€ã³ã¿ãŒãã§ãŒã¹ã§ãããPythonã§ããŒã¿ãå å·¥ã»å¯èŠåããäžã§ã¯æ¬ ãããªãããŒã«ã§ããã
ããããåŠçãå
šãŠè¡ãããšã®ã§ãããéã®åŒŸäžžãã§ã¯ãããŸããã
çšæ³ãå®ã£ãŠãæ£ããå¹ççã«å©çšããããšãå¿ãããŸãããã
æåŸã«
åŒç€Ÿã§ã¯ãçµéšã®æç¡ãåããã瀟å¡ãã€ã³ã¿ãŒã³çã®æ¡çšãè¡ã£ãŠããŸãã
èå³ã®ããæ¹ã¯ãã¡ããã芧ãã ããã