Загрузка блоков данных из переписи, как записать ie в несколько CSV, чтобы не превышать память - PullRequest
0 голосов
/ 09 января 2020

Предположим, у меня есть список ключей API, которые я загружаю из данных переписи

Пример:

variable_list = [
'B08006_017E',
'B08016_002E',
'B08016_003E',
'B08016_004E',
...
]

Теперь даны ограничения памяти для помещения этих данных в один файл CSV. Я хочу создать способ размещения блоков из 100 переменных из списка переменных в несколько CSV-файлов. Например, если у меня есть 200 переменных, то у меня будет 2 CSV-файла из первых 100 и одна со вторыми 100 переменными. Я надеюсь, что это понятно.

Вот как я сейчас загружаю данные:

import pandas as pd
import censusdata
pd.set_option('display.expand_frame_repr', False)
pd.set_option('display.precision', 2)
#import statsmodels.formula.api as sm
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
import censusgeocode as cg
import numpy as np
from numbers import Number
import plotly
import matplotlib.pyplot as plt
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
import requests
import pandas
import geopandas
import json
import math
from haversine import haversine
from ipfn import ipfn
import networkx
from matplotlib import pyplot
from matplotlib import patheffects
from shapely.geometry import LineString, MultiLineString

variable_list1 = [
'B08006_017E',
'B08016_002E'
'B08016_003E',
'B08016_004E'
]

all_variable_lists = [variable_list1]
print(len(all_variable_lists[0]))
#2) For each year, download the relevant variables for each tract
def download_year(year,variable_list,State,County,Tract):
    df = censusdata.download('acs5', year, censusdata.censusgeo([('state',State),('county',County),('tract',Tract)]), variable_list, key = 'e39a53c23358c749629da6f31d8f03878d4088d6')
    df['Year']=str(year)
    return df
#3) Define function to download for a single year and state 
def callback_arg(i,variable_list,year):
    try:        
        print('Downloading - ',year,'State', i,' of 57')
        if i<10:
            df = download_year(year,variable_list,'0'+str(i),'*','*')
            return df
        if i==51:
            df = download_year(year,variable_list,str(i),'*','*')
            return df
        else:
            df = download_year(year,variable_list,str(i),'*','*')
            return df
    except:
        pass

#3) Function to download for all states and all years, do some slight formatting
def download_all_data(variable_list,max_year):
    df=download_year(2012,variable_list,'01','*','*')
    for year in range(2012,max_year+1):
        if year == 2012:
            for i in range(0,57):
                df=df.append(callback_arg(i,variable_list,year))
        else: 
            for i in range(0,57):
                df=df.append(callback_arg(i,variable_list,year))
    df2=df.reset_index()
    df2=df2.rename(columns = {"index": "Location+Type"}).astype(str)
    df2['state']=df2["Location+Type"].str.split(':').str[0].str.split(', ').str[2]
    df2['Census_tract']=df2["Location+Type"].str.split(':').str[0].str.split(',').str[0].str.split(' ').str[2][0]
    df2['County_name']=df2["Location+Type"].str.split(':').str[0].str.split(', ').str[1]
    return(df2)
#4) Some slight formatting
def write_to_csv(df2,name = 'test'):
    df2.to_csv(name)
#5) The line below is commented out, but should run the entire download sequence
def write_to_csv(df, ide):
    df.to_csv('test' + str(ide) + '.csv')

list_of_dfs = []
for var_list in all_variable_lists:
    list_of_dfs.append(download_all_data(var_list, 2012))
x1 = list_of_dfs[0].reset_index()
# x3 = pd.merge(x1,x2, on=['index','Location+Type','Year','state','Census_tract','County_name'])
write_to_csv(x1,1)

Если кто-нибудь может дать мне несколько идей о том, как добиться того, чего я хочу, это очень помогло бы мне , Спасибо.

1 Ответ

1 голос
/ 10 января 2020

Похоже, вы уже разбили списки переменных по спискам:

for var_list in all_variable_lists:
    list_of_dfs.append(download_all_data(var_list, 2012))

Просто убедитесь, что в каждом var_list есть только 100 элементов. Затем разделите запись на CSV таким же образом, используя enumerate для увеличения индекса для имени файла:

for index, out_list in enumerate(list_of_dfs):
    write_to_csv(out_list.reset_index(),index)

Если вы просто хотите разбить окончательный вывод во время записи:

for index, out_list in enumerate(np.array_split(x1, 100)):
    write_to_csv(out_list,index)
...