我写了一个代码来为加利福尼亚州的一个县创建月度污染风玫瑰。污染玫瑰与风玫瑰类似,它们显示风向的分布,但它们不显示风速的大小,而是绘制 PM2.5 的浓度。我已经将此代码用于加州空气资源委员会的许多数据集,但现在我正在使用来自本地监控网络的数据,并在运行我的代码时收到以下错误消息:
ValueError: cannot convert float NaN to integer
这是我的代码:
import pandas as pd
from windrose import WindroseAxes
import matplotlib.pyplot as plt
import matplotlib.cm as cm
wr = pd.read_csv('IVANCALEX_forSO.csv')
wr = wr.set_index('date')
wr.index = pd.to_datetime(wr.index)
wr["Month"] = wr.index.month
wr['Hour'] = wr.index.hour
month_dict = {1: "January", 2: "February", 3: "March", 4: "April",
5: "May", 6: "June", 7: "July", 8: "August", 9: "September",
10: "October", 11: "November", 12: "December"}
xval = ["dir_3135"]
yval = ['Calexico, 604 Kubler Rd', 'Calexico, Alvarez', 'Calexico, Encinas Ave and Ethel St', 'Calexico, Ethel',
'Calexico, Housing Authority', 'Calexico, Housing Authority West', 'Calexico, Residence',
'Holtville, 1015 Miller Rd', 'Holtville, South', '1201 West Hwy 98']
months = [v for k,v in month_dict.items()]
nrows, ncols = 2,6
#bins=np.logspace(0, 4, num=5) #pm10
#bins=np.arange(0, 1, .2) #pm2.5/pm10
for x,y in zip(xval,yval):
fig = plt.figure(figsize=(15, 10))
plt.subplots_adjust(hspace=0.5)
site_name = y.split(",")[0].replace(" ", "_")
fname = f"pollutionrose_{site_name}.png"
bins=[-60,-10,0,10,40] #ozone deviations
fig.tight_layout()
for i, month in enumerate(months):
d = wr[wr["Month"].eq(month)].reset_index(drop=True)
ax = fig.add_subplot(nrows, ncols, i + 1, projection="windrose")
ax.set_title(month.capitalize(),fontsize=20, weight='bold')
ax.bar(d[x], d[y],
normed=True, opening=0.8,
bins=bins, cmap=cm.rainbow,
nsector=8)
ax.set_xticklabels(['E', 'N-E', 'N', 'N-W', 'W', 'S-W', 'S', 'S-E'],fontsize=18)
ax.tick_params(axis="y", labelsize=12.5)
#ax.set_legend(decimal_places=1,fontsize='x-large', loc='best')
#ax.set_yticklabels(np.arange(11, 77, step=11), fontsize=18)
ax.figure.savefig(fname, dpi=400) #(8, 56, step=8)
我不确定为什么会收到此错误消息,因为我过去处理过具有许多 NaN 值的数据并且没有问题。是否有太多 NaN 值无法执行此分析?
我试着做了这个修改:
for i, month in enumerate(months):
d = wr[wr["Month"].eq(month)].reset_index(drop=True)
ax = fig.add_subplot(nrows, ncols, i + 1, projection="windrose")
ax.set_title(month.capitalize(),fontsize=20, weight='bold')
# Drop rows with NaN values in d[x] or d[y]
if d[x].isna().any() or d[y].isna().any():
d = d.dropna(subset=[x, y])
ax.bar(d[x], d[y],
normed=True, opening=0.8,
bins=bins, cmap=cm.rainbow,
nsector=8)
ax.set_xticklabels(['E', 'N-E', 'N', 'N-W', 'W', 'S-W', 'S', 'S-E'],fontsize=18)
ax.tick_params(axis="y", labelsize=12.5)