问题:电力公司会提前一天或者几天跟发电厂购买电量,买多了势必会造成不必要的浪费,而买少了临时向发电厂买电代价是比平时高得多的,如何根据以往的数据对未来的电量需求做出精准的预测,是电力公司非常重视的一个问题。
解决方案:通过历年来该地区的实际电量需求数据和该地区的天气数据进行建模,建立一个回归模型,预测未来几天的用电需求。
数据来源:美国纽约州电力NYISO公司公布了历年来纽约州各个地区的实际用电数据,该公司还公布了历年来提前一天的电量预测数据,因此可以从http://mis.nyiso.com/public/P-58Blist.htm(需要VPN)下载历年的实际用电量loads,从http://www.nyiso.com/public/markets_operations/market_data/custom_report/index.jsp?report=load_forecast下载NYISO公司提前一天的电能预测数据。这里我们只是获取了电量的使用情况,按建模的话说也就是只知道标签Y,特征X就需要从天气数据中获取,天气数据从https://www.wunderground.com/history/airport/获取。
1. 数据抓取:首先是抓取电量数据loads,由于NYISO网站上的数据是zip,因此可以通过python的urllib库进行抓取下载到本地:
import urllib
import pandas as pd
#首先通过pandas的date_range产出日期格式,再通过遍历改变url的形式逐个抓取数据,通过urllib.urlretrieve下载zip数据
dates=pd.date_range(pd.to_datetime('2005-01-01'),pd.to_datetime('2016-12-31'),freq='M')
for date in dates:
url='http://mis.nyiso.com/public/csv/pal/{0}{1}01pal_csv.zip'.format(date.year, str(date.month).zfill(2))
urllib.urlretrieve(url, "{0}".format(url.split('/')[-1]))
print date
通过上述操作,把2005年1月1日到16年12月31日的所有数据下载到本地,下载下来的数据为zip格式,因此通过zipfile库来进行解压:
import os
import zipfile
import pandas as pd
#通过os.listdir打开指定目录所有文件,在通过if筛选所有的zip文件,把文件名(不带路径)都append到一个list中
zips=[]
for file in os.listdir("../data/zip/"):
if file.endswith(".zip"):
zips.append(file)
建立一个解压函数
def unzip(fileName,fileDir):
with zipfile.ZipFile(fileName) as zf:
try:
zf.extractall(fileDir)
except:
return
遍历zips文件名list,逐个解压到fileDir(“../data/zip/csvData/”)文件夹下
for z in zips:
try:
unzip("../data/zip/"+z, "../data/zip/csvData/")
except:
print "../data/zip/csvData/"
continue
#把所有的csv文件合并到同一个csv文件中
csvs=[]
for file in os.listdir("../data/zip/csvData/"):
if file.endswith("pal.csv"):
#合并到同一个csv,由于每一个csv文件都有头部信息,因此先读取第一个csv的头部信息作为总的csv的头部信息,剩下的直接跳过
fout=open("../data/combine.csv","a")
for