docs: def cat_tweets(filename='all_tweets.json.gz', path=DATA_PATH, ext='.json', save_tmp=False, verbosity=1, numtweets=10000000, ignore_suspicious=True):
      """Find json files that were dumped by tweetget and combine them into a single CSV
  
      Normalize some (lat/lon)"""
      log.info('Finding {} files in {}...'.format(ext, path))
      meta_files = find_files(path=path, ext=ext)
      meta_files = [meta for meta in meta_files
                    if re.match(r'^[-#@a-z ]*201[5-6]-[0-9]{2}-[0-9]{2}.*', meta['name'])]
      #  '\s[0-9]{2}[:][0-9]{2}[:][0-9]{2}[.][0-9]+[.]json(.gz)?$', meta['name'])]
      log.info('Found {} files that look like tweetget dumps.'.format(len(meta_files)))
      print([mf['name'] for mf in meta_files])
      total_size = sum([meta['size'] for meta in meta_files])
      if verbosity > 0:
          pbar = progressbar.ProgressBar(maxval=(total_size + 1.) / 1e6)
          pbar.start()
      else:
          pbar = None
  
      loaded_size = 0
      df_all = pd.DataFrame()
      for meta in meta_files:
          with (gzip.open(meta['path']) if ext.endswith('.gz') else open(meta['path'])) as fin:
              js = pd.json.load(fin)
          if not len(js):
              continue
          df = pd.io.json.json_normalize(js)
          # json entries were dumped in reverse time order (most recent first)
          df.drop_duplicates(['id'], keep='first', inplace=True)
          df.set_index('id', drop=True, inplace=True)
          if 'geo.coordinates' in df.columns:
              latlon = np.array([(ll[0], ll[1]) if isinstance(ll, list) else (np.nan, np.nan) for ll in df['geo.coordinates']])
              for i, ll in enumerate(latlon):
                  try:
                      latlon[i] = float(ll[0]), float(ll[1])
                  except ValueError:
                      latlon[i] = np.nan, np.nan
              ll = list(zip(*latlon))
              df['lat'] = ll[0]
              df['lon'] = ll[1]
              df_all = df_all.append(df)
          else:
              df['lat'] = np.nan * np.ones(len(df))
              df['lon'] = np.nan * np.ones(len(df))
              if ignore_suspicious:
                  log.info('\nOddly the DataFrame in {} didnt have a geo.coordinates column.'.format(meta['path']))
                  log.warn('\nSkipping {} suspicious tweets.'.format(len(df)))
              else:
                  df_all = df_all.append(df)
          # this would be a good time to incrementally save these rows to disc
          del df
          loaded_size += meta['size']
          if len(df_all) >= numtweets:
              # FIXME use average rate of 400 tweets/MB to calculate better progressbar size at start
              break
          if save_tmp:
              save_tweets(df_all, path=path, filename='tmp.csv')
          if pbar:
              pbar.update(loaded_size / 1e6)
      print(len(df_all))
      bigger_better_cols = [c for c in df_all.columns if c.endswith('_at') or '_count' in c]
      print(bigger_better_cols)
      print(all(c in df_all.columns for c in bigger_better_cols))
      df_all = df_all.sort_values(by=bigger_better_cols, inplace=False)
      hashable_cols = [c for c in df_all.columns if df_all[c].dtype not in (list,)]
      df_all = df_all.drop_duplicates(subset=hashable_cols, inplace=False)
      if pbar:
          pbar.finish()
      log.info('Loaded {} unique tweets.'.format(len(df_all)))
      return df_all